![]() |
1
9
自定义绘图编辑控件基本上是不可能的。有一些特殊的情况是,你做的太少,可以摆脱它,但你的风险很严重,在下一个版本的Windows(或当有人运行你的应用在旧版本,或通过终端服务等)。 仅仅接管wm-paint和wm-erasebkground还不够好,因为控件有时也会在其他消息上绘制。 你最好只写自己的编辑控件。我知道这是一个巨大的工作量,但从长远来看,它将比试图黑客的方式来接管所有编辑控件的绘图代码少工作。 我记得以前的美好时光,那时每个人都用子类的按钮控件来添加颜色和图形等。事情是,有一天我坐下来,刚刚写了自己的按钮窗口类。它的代码比我们在源代码树中拥有的要少,可以对windows按钮进行子类化和自定义绘制。 |
![]() |
2
5
创建一个自己的窗口类,它看起来像一个空的编辑控件,它绘制提示文本并显示一个插入符号并具有焦点。也创建编辑控件,但将其放在窗口后面。(或者把它藏起来) 然后,当您收到第一个wm_char消息(或wm_keydown?)。您将窗口放在编辑控制项后面,将焦点放在编辑项上,然后打开wm_char消息。从那时起,编辑控件将接管。 如果需要在编辑变为空时返回到显示提示文本,则可以从编辑控件中听取en_更改通知。但是我认为只有当编辑失去焦点并且是空的时候才返回提示文本是可以的。 |
![]() |
3
5
对编辑控件进行子类化对我来说很好——在编辑对象属性时需要向用户显示一些格式信息(有些属性可以是多行)。正如阿德里安在回答中所说,重要的是调用编辑控件的过程 之前 你自己画的。随后调用它或发布自己的beginpaint/endpaint(返回0或defwindowproc)给我带来了一些问题,从根本不显示的文本到只在调整大小时显示而不在编辑后显示的文本,到留下屏幕上残留的插入符号。这样,无论编辑控件的其他重新绘制时间如何,我都没有遇到任何问题。 一些设置:
回调:
编写自己的编辑控件(与内置控件相比,我实际上已经做了不止一次,在一定程度上是完整的)并不是什么工作,如果你只做最少的裸代码(可能只有基本的插入符号支持的英语),但如果你想在复杂的脚本上使用插入符号导航,并使用可变大小的簇,sel范围选择、输入法支持、带复制和粘贴的上下文菜单、高对比度模式和辅助功能(如文本到语音转换)。因此,与其他许多答案不同,我建议 不 只为提示横幅文本实现自己的编辑控件。 |
![]() |
4
3
子类化编辑控件。把手
我已经做到了——它起作用了。编码专家的问题似乎不适用于您的情况。我相信他想在外表上做得更多。为了提高性能,似乎编辑控件在
|
![]() |
5
0
如果您希望自己处理wm_paint,而不将消息转发到超类的原始windowproc,则不应忘记调用defwindowproc。以便绘制插入符号。 为了避免出现白条,应该使用setClassLongptr删除类画笔。 不知怎么的,保持你的DC的剪辑区域剪辑编辑controt的exttextout输出。 白色条可能是编辑控件传递给exttextout的不透明选项的结果。 结论:写下你自己的控制。没有痛苦,就没有收获。 |