您的位置:首页 > 大数据 > 人工智能

BeginPaint和GetDC有什么区别?

2008-02-27 18:24 375 查看
      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就可以只画无效区域了,提高了效率。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows timer 编程