WM_CTLCOLOR和OnCtlColor消息的用法
2014-04-02 20:50
316 查看
很多人都觉得自己的程序的界面不那么美观,往往VC默认产生的对话框比较单调,因此很多人往往找到很多其它的控件对对话框进行美化修饰,例如给静态控件设置字体,设置背景颜色等等,其实这些完全可以由VC自己的WM_CTLCOLOR消息来完成!
WM_CTLCOLOR消息用来完成对EDIT、STATIC、BUTTON等控件设置背景和字体颜色,其用法如下:
1.首先在自己需要设置界面的对话框上点击右键-->建立类向导-->加入WM_CTLCOLOR消息-->自动生成OnCtlColor()函数,此函数可以对本对话框的控件的界面外观做修饰,用法如下:
将类向导产生的函数做如下修改:
注:case的类别有以下几种:<即参数nCtlColor:该控件的类型>
CTLCOLOR_BTN 按钮控件
CTLCOLOR_DLG 对话框
CTLCOLOR_EDIT 编辑框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滚动条
CTLCOLOR_STATIC 静态文本
2.你可能觉得对所有的控件使用统一的界面设置觉得不自由,其实VC同样可以对特定的ID的控件进行设置,方法如下:
设置控件颜色的主要目的是为了解决控件文字背景色不透明的问题。当向一个有背景色的界面上放置控件后,由于控件文字的背景色与界面背景色不符,使文字背后留下难看的灰块。现在我定义了可设置背景色和前景色的控件,只要使控件背景色与界面背景色相同,问题就解决了。
设置控件颜色和字体时必须继承该控件对应的类,在其中加入相关的颜色控制和字体函数。各种控件的做法完全相同,只是继承的类不一样。
注:对于静态文本控件(Static Text)、单选按钮(Radio Button)、复选按钮(Check Box)、组合框(Group Box)和编辑控件(Edit Box)都可以用相同的方法设置文字颜色和背景色,但这种方法对按钮(Button)无效,修改按钮的颜色和字体.
以静态文本控件(Static Text)为例:
①用ClassWizard添加新类,基类选为CStatic,新类名称设为CMyStatic。
②在CStatic类中,用ClassWizard重载消息“=WM_CTLCOLOR”的函数CtlColor(),注意:不要错误地重载名为“WM_CTLCOLOR”的消息,若重载了它会得不到想要的效果。
③在CtlColor()函数中修改控件的背景色和文本颜色。
④加入设置颜色和字体的接口函数。
以下为CStatic类的相关部分:
在 MyStatic.h 中加入变量和接口函数的定义:
在 MyStatic.cpp 中加入以下内容:
在构造函数中,设置变量的初值
用ClassWizard重载消息“=WM_CTLCOLOR”(注:不是WM_CTLCOLOR),在其中修改控件的前景色和背景色:
另外,为方便调用,再定义三个接口函数:
//设置控件文字颜色
//设置控件背景颜色
//设置控件字体
其中FontHight为字体高度,FontName为字体名。
由于新字体由new生成,必须显式回收,这项工作可以在CMyButton类的析构函数中进行:
这样一个可设置颜色和字体的静态文本类就定义好了。使用时先在对话框中加入静态文本控件,修改它的ID(注意:必须修改它的ID值,否则无法为它定义变量),然后用ClassWizard为它定义控制变量,把它的类型设置为CStaticEx;在对话框的OnInitDialog()函数中利用控件变量设置控件的颜色和字体就可以了。
以上就是修改静态文本控件的颜色和字体的方法,其它控件的做法完全相同,只是对应的基类不同。
单选按钮、复选按钮和组合框可以用 CButton类 作为基类生成新的扩展类 CButtonEx;编辑控件用 CEdit类 作为基类生成扩展类 CEditEx。而CButtonEx类和CEditEx类的内容与上述的CStaticEx类完全相同。
在实际应用中,还有几个问题需要注意一下,一是单选按钮通常是成组使用的,用ClassWizard只能为一组单选按钮的第一个添加控制变量,其它的只能用手工加入。再就是添加组合框时也必须修改ID,否则无法定义变量。
本文所用MFC函数速查:
CBrush::CreateSolidBrush
CDC::DeleteObject
CDC::SetBkColor
CDC::SetTextColor
CFont::CreatePointFont
CGdiObject::GetSafeHandle
CWnd::SetFont
WM_CTLCOLOR消息用来完成对EDIT、STATIC、BUTTON等控件设置背景和字体颜色,其用法如下:
1.首先在自己需要设置界面的对话框上点击右键-->建立类向导-->加入WM_CTLCOLOR消息-->自动生成OnCtlColor()函数,此函数可以对本对话框的控件的界面外观做修饰,用法如下:
将类向导产生的函数做如下修改:
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC,pWnd, nCtlColor); // TODO: Change any attributes of theDC here //设置显示字体 CFont cFont; cFont.CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0, ANSI_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH&FF_SWISS,"Arial"); //对特定的控件做修改 switch(nCtlColor) { case CTLCOLOR_STATIC: //对所有静态文本控件的设置 { pDC->SetBkMode(TRANSPARENT); //设置背景为透明 pDC->SetTextColor(RGB(255,255,0)); //设置字体颜色 pWnd->SetFont(&cFont); //设置字体 HBRUSH hMyBrush = CreateSolidBrush(RGB(125,125,255)); //创建画刷 return (HBRUSH) hMyBrush; //返回画刷句柄 } case CTLCOLOR_EDIT: //对所有编辑框的设置 { pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,255,0)); pWnd->SetFont(&cFont); HBRUSH hMyBrush = CreateSolidBrush(RGB(125,125,255)); return (HBRUSH) hMyBrush; } default: return CDialog::OnCtlColor(pDC,pWnd, nCtlColor); } }
注:case的类别有以下几种:<即参数nCtlColor:该控件的类型>
CTLCOLOR_BTN 按钮控件
CTLCOLOR_DLG 对话框
CTLCOLOR_EDIT 编辑框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滚动条
CTLCOLOR_STATIC 静态文本
2.你可能觉得对所有的控件使用统一的界面设置觉得不自由,其实VC同样可以对特定的ID的控件进行设置,方法如下:
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC,pWnd, nCtlColor); // TODO: Change any attributes of theDC here //设置显示字体 CFont cFont; cFont.CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"Arial"); //对特定的控件做修改 switch (pWnd->GetDlgCtrlID()) { //针对ID为IDC_CTL1、IDC_CTL2和IDC_CTL3的控件进行同样的设置 case IDC_CTL1: case IDC_CTL2: case IDC_CTL3: { pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,255, 0)); pWnd->SetFont(&cFont); HBRUSH hMyBrush = CreateSolidBrush(RGB(125,125,255)); return (HBRUSH) hMyBrush; } default: return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); } }
设置控件颜色的主要目的是为了解决控件文字背景色不透明的问题。当向一个有背景色的界面上放置控件后,由于控件文字的背景色与界面背景色不符,使文字背后留下难看的灰块。现在我定义了可设置背景色和前景色的控件,只要使控件背景色与界面背景色相同,问题就解决了。
设置控件颜色和字体时必须继承该控件对应的类,在其中加入相关的颜色控制和字体函数。各种控件的做法完全相同,只是继承的类不一样。
注:对于静态文本控件(Static Text)、单选按钮(Radio Button)、复选按钮(Check Box)、组合框(Group Box)和编辑控件(Edit Box)都可以用相同的方法设置文字颜色和背景色,但这种方法对按钮(Button)无效,修改按钮的颜色和字体.
以静态文本控件(Static Text)为例:
①用ClassWizard添加新类,基类选为CStatic,新类名称设为CMyStatic。
②在CStatic类中,用ClassWizard重载消息“=WM_CTLCOLOR”的函数CtlColor(),注意:不要错误地重载名为“WM_CTLCOLOR”的消息,若重载了它会得不到想要的效果。
③在CtlColor()函数中修改控件的背景色和文本颜色。
④加入设置颜色和字体的接口函数。
以下为CStatic类的相关部分:
在 MyStatic.h 中加入变量和接口函数的定义:
private: COLORREF m_ForeColor; //文本颜色 COLORREF m_BackColor; //背景色 CBrush m_BkBrush; //背景刷 CFont* p_Font; //字体 // 接口函数 public: void SetForeColor(COLORREF color); //设置文本颜色 void SetBkColor(COLORREF color); //设置背景颜色 void SetTextFont(int FontHight,LPCTSTR FontName); //设置字体 |
在构造函数中,设置变量的初值
CStaticEx::CStaticEx() { m_ForeColor = RGB(0,0,0); //文字颜色(黑色) m_BackColor = RGB(255,255,255); //背景色(白色) m_BkBrush.CreateSolidBrush(m_BackColor); //背景刷 p_Font = NULL; //字体指针 } |
HBRUSH CStaticEx::CtlColor(CDC* pDC, UINT nCtlColor) { pDC->SetTextColor( m_ForeColor ); //设置文字颜色 pDC->SetBkColor( m_BackColor ); //设置背景色 return (HBRUSH)m_BkBrush.GetSafeHandle(); //返回背景刷 } |
//设置控件文字颜色
void CStaticEx::SetForeColor(COLORREF color) { m_ForeColor = color; //设置文字颜色 } |
void CStaticEx::SetBkColor(COLORREF color) { m_BackColor = color; m_BkBrush.DeleteObject(); //删除原背景刷 m_BkBrush.CreateSolidBrush( m_BackColor ); //建立背景刷 } |
void CStaticEx::SetTextFont(int FontHight,LPCTSTR FontName) { if ( p_Font ) delete p_Font; //删除旧字体 p_Font = new CFont; //生成字体对象 p_Font->CreatePointFont( FontHight, FontName ); //创建字体 SetFont( p_Font ); //设置控件字体 } |
由于新字体由new生成,必须显式回收,这项工作可以在CMyButton类的析构函数中进行:
CStaticEx::~CStaticEx() { if ( p_Font ) delete p_Font; //删除字体 } |
以上就是修改静态文本控件的颜色和字体的方法,其它控件的做法完全相同,只是对应的基类不同。
单选按钮、复选按钮和组合框可以用 CButton类 作为基类生成新的扩展类 CButtonEx;编辑控件用 CEdit类 作为基类生成扩展类 CEditEx。而CButtonEx类和CEditEx类的内容与上述的CStaticEx类完全相同。
在实际应用中,还有几个问题需要注意一下,一是单选按钮通常是成组使用的,用ClassWizard只能为一组单选按钮的第一个添加控制变量,其它的只能用手工加入。再就是添加组合框时也必须修改ID,否则无法定义变量。
本文所用MFC函数速查:
CBrush::CreateSolidBrush
CDC::DeleteObject
CDC::SetBkColor
CDC::SetTextColor
CFont::CreatePointFont
CGdiObject::GetSafeHandle
CWnd::SetFont
相关文章推荐
- 程序员:选择效率,还是选择质量?
- 基本搞定离职事宜
- 设计模式_单例
- Computer Science Theory for the Information Age-4: 一些机器学习算法的简介
- JSP知识点
- Hello Qt
- C#总结
- etc/hosts file
- 有符号及无符号位域值的测试
- Day10 - groupadd/groupdel 创建/删除群组
- opencv色彩空间转换及通道操作
- 记录一下我的腾讯和百度两次面试经历
- jQuery实现Ajax的整理
- C#多线程(四)
- webservice系列3---chain
- Session的一些操作和注意点
- 线索二叉树及相关函数
- webservice的安全机制2---handler实现
- vs2010中如何编译dll
- 学习jsp:forward的request请求