BeginPaint和GetDC的区别

来源:互联网 发布:淘宝 合约机 编辑:程序博客网 时间:2024/05/23 02:09
 


第一种情况显示出来的字很正常。
case WM_PAINT:
        gdc = BeginPaint (hwnd, &ps);
        TextOut (gdc, 0, 0, s, strlen (s));
        EndPaint (hwnd, &ps);
break;
第二种情况显示的字不停闪烁。
case WM_PAINT:
        gdc = GetDC (hwnd);
        TextOut (gdc, 0, 0, s, strlen (s));
        ReleaseDC (hwnd, gdc);
break;

 

这两者的区别在于:

BeginPaint() EndPaint() 可以删除消息队列中的WM_PAINT消息,并使无效区域有效。
GetDC()
ReleaseDC()并不删除也不能使无效区域有效,因此当程序跳出 WM_PAINT  ,无效区域仍然存在。系统就回不断发送WM_PAINT消息,于是程序不断处理WM_PAINT消息。相当于BeginPaint、EndPaint会告诉GDI内部,这个窗口需要重画的地方已经重画了,这样WM_PAINT处理完返回给系统后,系统不会再重发WM_PAINT,而GetDC没有告诉系统这个窗口需要重画的地方已经画过,在你把程序返回给系统后,系统一直以为通知你的重画命令你还没有乖乖的执行或者执行出错,所以在消息空闲时,它还会不断地发WM_PAINT催促你画,导致程序卡死。

可见BeginPaint、EndPaint是比较“被动”的,只在窗口新建时和被摧残时才重画。
而GetDC用于主动绘制,只要你指到哪,它就打到哪。它不加判断就都画上去,无效区域跟它没关系。对话框没被覆盖没被摧残,它很健康,系统没要求它重画,但开发者有些情况下需要它主动重画:比如一个定时换外观的窗口,这时候就要在WM_TIMER处理代码用GetDC。这时候再用BeginPaint、EndPaint的话,会因为无效区域为空,所有绘画操作都将被过滤掉。

 

转载自:

http://www.cnblogs.com/vilylei/articles/1356838.html

原创粉丝点击