(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。

(0)

相关推荐