现在的位置: 首页 > 综合 > 正文

设置从CEditView继承的视图类的字体颜色,背景色

2013年12月13日 ⁄ 综合 ⁄ 共 1700字 ⁄ 字号 评论关闭

        通过向父窗口(在这里父窗口是对话框)发送WM_CTLCOLOR消息,处理这些消息的代码都将在父窗口类中来实现,这显然不利于重用。
更符合面向对象的方法应该是让控件可以处理自己的背景颜色,这样将有利于代码重用。
微软已经认识到这点,从MFC4.0开始提供了一种称为消息反射(Message   Reflection)的新机制。
消息反射允许控件自己处理类似WM_CTLCOLOR这样的通知消息(在VC的ClassWizard里显示为=WM_CTLCOLOR)。但MFC为了相后兼容,保留了旧的消息机制,允许这些通知消息能被父窗口处理(虽然后者是不合逻辑的)。

反射消息的消息映射宏与通常的消息映射宏有点微小的区别:它在其常规名字后附加了   _REFLECT   表示。
例如,用于=WM_CTLCOLOR   通知的宏是   ON_WM_CTLCOLOR_REFLECT。

下面举一个通过处理反射消息创建可重用控件的例子:
Handling   Reflected   Messages:   An   Example   of   a   Reusable   control(根据MSDN   Library   -   July2000   整理)

这个例子创建了一个可重用的CYellowEdit控件。这一控件继承了常规编辑控件的功能,不同就是它在黄色背景中显示黑字。(当然,还可以添加其它功能。)

步骤如下:

1.在一个已存在的应用程序添加一个对话框。

2.使用   ClassWizard   创建一个基于   CEdit   类的新CYellowEdit类。

3.在   CYellowEdit   类中添加三个成员变量。

COLORREF   m_clrText;       //记录文本颜色
COLORREF   m_clrBkgnd;   //记录背景颜色
CBrush   m_brBkgnd;     //用于绘制背景的刷子

4.在构造函数中初始化这些成员变量:
CYellowEdit::CYellowEdit()
{
  m_clrText   =   RGB(   0,   0,   0   );
  m_clrBkgnd   =   RGB(   255,   255,   0   );
  m_brBkgnd.CreateSolidBrush(   m_clrBkgnd   );
}

5.使用   ClassWizard   给您的   CYellowEdit   类为   =WM_CTLCOLOR   反射消息添加一个处理函数。注意,消息列表中的消息名称前的等于号表明该消息是个可以被反射的消息。ClassWizard   会为您添加下面的消息映射宏以及相应的函数骨架:

ON_WM_CTLCOLOR_REFLECT()

……

HBRUSH   CYellowEdit::CtlColor(CDC*   pDC,   UINT   nCtlColor)  
{
  //   TODO:   Change   any   attributes   of   the   DC   here

  //   TODO:   Return   a   non-NULL   brush   if   the
  //         parent 's   handler   should   not   be   called
  return   NULL;
}

用下面的代码代替函数的主体。这里的程序代码很简单,你可以在这里添加更多的定制功能。

pDC-> SetTextColor(   m_clrText   );         //   text
pDC-> SetBkColor(   m_clrBkgnd   );         //   text   bkgnd
return   m_brBkgnd;                                 //   ctl   bkgnd

6.在对话框中创建一个编辑控件,为这一控件绑定一个控件类型的成员变量。注意在为对话框增添成员变量时,选择“CYellowEdit”作为您的变量类型。

随后,ClassWizard会提醒你在你的对话框头文件中添加   CYellowEdit   类的头文件。记得include它的头文件。

对所有想定制这一颜色的编辑控件,只要绑定一个CYellowEdit类型的变量即可。
编译并运行您的程序,该编辑控件将显示一个黄色的背景。
好了,可重用的定制控件产生了。
将CyellowEdit类添加到Galllery   中去,即可实现在其它工程项目中复用这一控件

抱歉!评论已关闭.