WM_PAINT 和 WM_ERASEBKGND 消息的区别 .

 

先看看,如何获得HDC(设备句柄)

 

1.调用BeginPaint()。绘制范围是窗口的无效区域。通常是在WM_PAINT中调用。这个api获得HDC,在EndPaint()以后,会将窗口的无效区域置为有效区域。BeginPaint()会根据Invalidate()时传的参数,决定是否擦除背景。需要擦除背景时,BeginPaint()会发送一个WM_ERASEBKGND。

 

2.调用GetDC()和GetWindowDC(),获得的HDC,绘制范围是整个窗口。且在ReleaseDC()后,不会设置窗口的无效区域为有效(确切地说这种方式获得的dc,整个窗口都可以绘制,其无效区域是整个窗口)。可以在任意地方获取这个dc并绘图。

 

 

一个常见的疑惑是,在窗口重绘时,先发WM_PAINT还是先发WM_ERASEBKGND消息?答案是都有可能。

 

1.由于移动窗口,改变窗口,最大最小化窗口,导致的重绘。系统会先发WM_ERASEBKGND消息,后发WM_PAINT消息(此时OnPaint函数的wparam是一个hdc)。

 

2.由于调用了Invalidate()或InvalidateRect()导致的重绘。系统会发WM_PAINT消息。在处理WM_PAINT消息,通常会调用BeginPaint()(此时wparam是NULL)获得HDC。BeginPaint()会根据需要,决定是否发送WM_ERASEBKGND。

 

在看几个应用中的问题。

1.OnErasebkgnd()中,返回真表示已经擦除了背景,返回假表示没有擦除背景。这个返回值,只对BeginPaint()的第二个参数(这是一个传出型参数)PAINTSTRUCT的fErase有影响。OnErasebkgnd()返回假时,fErase被BeginPaint()设置为真,表示下面应该考虑擦除背景的事。

 

2.WTL中CPaintDC构造函数中会调用BeginPaint()获得dc,析构函数中会调用EndPaint.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值