欢迎光临
我们一直在努力

BeginPaint EndPaint 与GetDC ReleaseDC的区别

1.

?? 绘图一般在WM_PAINT消息里面绘图, 一般用BeginPaint(?HWND?hwnd,?LPPAINTSTRUCT?lpPaint) 与BOOL EndPaint(
? HWND?hWnd,???? CONST PAINTSTRUCT?*lpPaint)??

<1>?BeginPaint自动设置裁剪区域,把不更新的区域设置到更新区域外面,

?此消息只绘制无效区域,更新区域可以显示地被InvalidateRect 和InvalidateRgn设置,如果背景要擦除,BeginPaint发送消息 WM_ERASEBKGND 给窗口

?

<2>BeginPaint 会自动地把无效区域设置为有效区域, BeginPaint 和EndPaint 只能在WM_PAINT消息里面进行调用 ,两者一定要成对出现

?

2.?GetDC与ReleaseDC

<1> GetDC 可以用在任何需要DC的地方, 他不会使得无效区域变得有效

?

3.解释了那么多,拿个程序来说明问题:

?

比如说要在一个客户区域画个圆 ,如果在WM_PAINT消息里面输入如下代码:

??

[cpp]? view plain copy HDC?hdc?=?GetDC(hWnd);?? Ellipse(ps.hdc,?10,?10,?20,?20);?? ReleaseDC(hWnd,?hdc);??

便宜香港vps

?

运行程序可以清楚的看到,圆在不停的闪烁,

如果替换成BeginPaint 则不会闪烁

?

原因是: GetDC不会把无效区域变为有效区域,所以不停的发送消息自绘,从而导致闪烁,BeginPaint 反之

?转自:http://blog.csdn.net/acdnjjjdjkdckjj/article/details/5967532

91743900

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。