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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值