MFC|框架下自绘 CEdit 控件
前提
MFC 中的 CEdit 控件提供了编辑的功能。
该编辑框是一个自创阔举行,用户可以向里面输入任意类型的文本信息。
那么我们该如何优化控件的显示呢?接下来就介绍下如何继承并重绘 CEdit 控件。
该控件与其他控件的绘制方式都不同,既不是使用 OnPaint 方式,也不是使用 DrawItem 方式。而是采用了 ON_WM_CTLCOLOR_REFLECT 的反射机制。
那是 OnPaint 方式不能实现吗?
不是的。只是用 OnPaint 方式绘制时,比较麻烦,能用系统内部的消息为什么要自己写呢?尤其是多行风格时,采用 OnPaint 方式绘制文本时,刷新是一个非常麻烦的事情。
ON_WM_CTLCOLORREFLECT 消息是 WM_CTLCOLOR 消息的反射。
WM_CTLCOLOR 消息是用来完成对 EDIT、STATIC 以及 BUTTON 等空间设置背景和颜色的方法。
通过发射机制,让父窗口类去处理的消息变成了子控件窗口来处理,增强了封装性,也同时提高了子控件窗口类的可重用性。可谓是一举两得了。
那么在 CEdit 控件中当前发射消息是如何使用的呢?
自绘 CEdit
对于 ON_WM_CTLCOLORREFLECT 发射消息的使用方式:
.h 文件中的声明
.cpp 文件中的使用
在实际的使用过程中,需要先设置文字的背景色,再设置文本的颜色。
否则就会出现背景覆盖文本,从而看不到自己设置的文本内容了。(一般情况下,我们对文本绘制时都要遵循这种先背景后文本的操作)。
1:背景色
解释:
m_crBackground 是使用者设置的自定义文本背景颜色值
2:文字颜色值
在 CEidt 控件中,有两种文本。
一个是提示文本内容;另外一个是实际的输入文本内容。
一般提示文本的内容是用灰色显示的。
但是我们都已经要自绘 CEdit 控件了,当然可以自定义提示文本的颜色值啦!
解释:
成员变量:m_strCurBanner 是存储的提示文本内容。
当获取的编辑框文本不等于提示内容时,说明需要显示用户输入的正常文本,并且设置文本的颜色值 m_crText
当获取的编辑框文本恰好是提示内容时,说明需要显示提示文本,并设置文本的颜色值 m_crCaptionText
3:背景刷新
在重绘控件的同时一定要重写 ON_WM_ERASEBKGND()消息。
解释:
在每次刷新背景的同时,需要重新设置背景颜色值。
4:边框绘制
我们在控件中改如何修改控件的边框风格呢?
是在 OnPaint 中吗?
NO!
在 MFC 框架中对于边框风格的修改有一个特定的消息:ON_WM_NCPAINT
绘制控件的非客户去消息,这其中就包括了控件的边框
总结
以上就是对 MFC 框架下 CEdit 的控件的风格设置啦,与重绘 OnPaint 相比较来说,比较简单,理解起来也很是容易,只要掌握了反射机制,也就轻而易举了。
今天的更新就到这里了~
我是中国好公民 st,一名 C++开发程序媛~
版权声明: 本文为 InfoQ 作者【中国好公民st】的原创文章。
原文链接:【http://xie.infoq.cn/article/f1ec2f4da3c87172a96bd8db5】。文章转载请联系作者。
评论