pDC 与 GetDC() 区别

  在OnDraw中分别调用pDC和GetDC() 得到的结果可能不相同

 

   pDC 所指的是视图初始的客户区DC  

   比如 视图是基于CFormView类的,其上设置了工具栏资源

   则这些工具栏就是依赖pDC产生的,  这样,当滚动条左右移动时,工具栏资源也随之左右移动。 

   这是因为:滚动条移动时,当前窗口可见区的坐标发生变化,而工具栏资源是以PDC坐标为准的,因此,工具栏各个资源的坐标位置不变,而窗口坐标发生变化,这样就使得工具栏也有移动的效果

 

    如果使用pDC来画图, 当滚动条右移时,可以发现,图片局限在原有的PDC坐标区域中,无法移动到新视图的右端

 

   GetDC()  指的是: 获得当前可见窗口的DC,并将其坐标作为参照坐标,也就是可见窗口的左上角为DC的(0,0)点,这样,当用GetDC画图时,便会发现,无论滚动条如何移动,图片都不会发生变化。

   自然,这是因为,无论滚动条如何移动,当前可见窗口的坐标都是相同的,画图时都是参照可见窗口的左上角(0,0)点进行的,因此每次画的图都一样

 

   实在分不清的话 ,可以分别用PDC和GETDC测试下,做下对比,就清楚了 。

   简言之,滚动条左右滚动时,pdc所画图像,依然是参照初始的客户区

                                                      而GetDC,是把当前的VIEW窗口作为参照来画图的

 

也就是说,二者使用的坐标系不同,自然就有所差别了。

 

以下是网上的一段参考资料:

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

   CScrollView::OnDraw(CDC*   pDC)  
  {  
  HDC   hdc1   =   ::GetDC(GetSafeHwnd());      
  HDC   hdc2   =   pDC->GetSafeHdc();  
  }  
   
  hdc1   和hdc2有和区别;  
  我用hdc1画图,操作滚动条可以自动移动图形,但是DPtoLP不对,结果总是正值;  
  我用hdc2画图,操作滚动条不能自动移动图形,但是DPtoLP正确;

CScrollView::OnDraw(CDC*   pDC)  
  {  
  HDC   hdc1   =   ::GetDC(GetSafeHwnd());     //GetSafeHwnd()得到的是View的句柄  
  HDC   hdc2   =   pDC->GetSafeHdc();               //得到的是客户区DC的句柄  
  }   

不是在OnDraw()里的话,就相同,如:  
  CDC*   pDC   =   GetDC();  
  HDC   hdc1   =   ::GetDC(GetSafeHwnd());      
  HDC   hdc2   =   pDC->GetSafeHdc();  
  hdc1和hdc2作用一样  
  在OnDraw()里直接使用OnDraw()的参数pDC就不一样了,没记错的话,那个pDC是裁剪过的

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

参考资料:

http://blog.sina.com.cn/s/blog_4f8d956b0100hlrr.html

 

 

 

 

你可能感兴趣的:(测试,工具,图形)