(6条消息) MFC自绘相关函数理解
通过重载MFC的相关函数来自定义UI,通常会用到以下几个函数:OnEraseBkgnd、OnCtlColor、OnPaint。
通过阅读官方文档,做个总结:
1、CWnd::OnEraseBkgnd()
调用时机:当CWnd对象需要刷新时,如resized。
函数声明:
//#include <afxwin.h> afx_msg BOOL OnEraseBkgnd( CDC* pDC );
消息映射:ON_WM_ERASEBKGND()
理解:它准备一个无效区域(invalidated region)用于绘制。
默认的实现是使用窗口类结构中的hbrBackground成员指定的画刷来擦除背景。
如果hbrBackground成员是NULL,重载的函数中应该擦除背景色。您的版本还应对齐将向计划的画笔的原点与 CWnd 坐标由画笔,然后选择的画笔先调用的 UnrealizeObject。(不理解<( ̄▽ ̄)/)。
返回值为非零值,表明擦除操作已经完成不需要继续处理。如果返回值为0,窗口仍被标记为需要擦除(PAINTSTRUCT结构中的fErase为True)。
2、CMFCPropertyGridProperty::OnCtlColor()
调用时机:当必须返回一个画刷来填充某个属性的背景色时调用。
函数声明:
//#include <afxpropertygridctrl.h> virtual HBRUSH OnCtlColor( CDC* pDC, UINT nCtlColor );
消息映射:ON_WM_CTLCOLOR()
理解:例如我们在窗口中加入了多个控件,我们就可以通过重载这个函数来给变不同控件的颜色:
switch(nCtlColor)
{
case CTLCOLOR_STATIC: //设置所有静态文本控件的背景色
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0,0,0));
return hbr; //返回画刷句柄
}
case CTLCOLOR_DLG: //对话框
{
pDC->SetBkMode(OPAQUE);
return hbr; }
case CTLCOLOR_BTN:// 按钮
{
pDC->SelectObject(&font2);
pDC->SetBkColor(RGB(255, 0, 0));
pDC->SetTextColor(RGB(255, 0, 0));
return hbr;
}
default:
return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
}
3、CWnd::OnPaint()
调用时机: 当窗口或者程序发出重绘窗口的请求时。
函数声明:
afx_msg void OnPaint();
消息映射:ON_WM_PAINT()
理解:WM_PAINT在UpdateWindowh或者RedrawWindow成员函数被调用时发送。
注意:若程序设置了OnEraseBkgnd()函数(OnEraseBkgnd()返回TRUE),则不会再调用OnCtlColor()。 在OnEraseBkgnd()函数中直接返回return CDialog::OnEraseBkgnd(pDC),则先调用OnCtlColor()函数,在调用OnPaint() 。
OnPaint()处理WM_PAINT消息,画客户区.
OnEraseBkGnd()处理WM_ERASEBKGND消息,画背景.
窗口重绘时,先是WM_ERASEBKGND消息,再是WM_PAINT。