BeginPaint和GetDC有什么区别?

      1, 为什么WINDOWS要提出无效区域的概念呢?这是为了加速。
因为BeginPaint和EndPaint用到的设备描述符只会在当前的无效区域内绘画,在有效区域内的绘画会自动被过滤,大家都知道,WIN GDI的绘画速度是比较慢的,所以能节省一个象素就节省一个,不用吝啬,这样可以有效加快绘画速度。
       可见BeginPaint、EndPaint是比较“被动”的,只在窗口新建时和被摧残时才重画。
而GetDC用于主动绘制,只要你指到哪,它就打到哪。它不加判断就都画上去,无效区域跟它没关系。对话框没被覆盖没被摧残,它很健康,系统没要求它重画,但开发者有些情况下需要它主动重画:比如一个定时换外观的窗口,这时候就要在WM_TIMER处理代码用GetDC。这时候再用BeginPaint、EndPaint的话,会因为无效区域为空,所有绘画操作都将被过滤掉。 

      由于WM_PAINT消息的优先级很低,这样,由于窗口对象不能及时收到WM_PAINT消息而影响用户对屏幕对象的视觉感觉。为弥补这个缺陷,程序员可以考虑使用函数UpdateWindows(),它在应用程序的消息队列中存在WM_PAINT消息的情况下,强使Windows立即向窗口对象发送WM_PAINT消息.

//由于WM_PAINT的优先级别很低(甚至在虚拟按键消息之后,见《windows核心编程》窗口消息一章),它只是改变了消息结构体中的QS_PAINT标志。所以呢,如果是使用函数UpdateWindows(),会直接send一个WM_PAINT消息,那样会直接调用窗口处理函数,比普通的WM_PAINT消息处理的快很多。

2, case WM_LBUTTONDOWN:
               MessageBox(hwnd,"mouse clicked","message",0);
               HDC hdc;
              hdc=GetDC(hwnd);
              TextOut(hdc,0,50,"程序员之家",strlen("程序员之家"));
              ReleaseDC(hwnd,hdc);
       break;
 case WM_PAINT:
            HDC hDC;
           PAINTSTRUCT ps;//看出区别了吗?
           hDC=BeginPaint(hwnd,&ps);
          TextOut(hDC,0,0,"http://www.sunxin.org",strlen("http://www.sunxin.org"));
        EndPaint(hwnd,&ps);
  break;

PAINTSTRUCT ps;这个结构就是为了填充无效区域的坐标等等,  这样BeginPaint就可以只画无效区域了,提高了效率。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值