m_pDC->GetSafeHdc()的思考

来源:互联网 发布:酒店清洗床单 知乎 编辑:程序博客网 时间:2024/06/15 22:15

问题:

      经常看到OpenGL中的视场设置中有m_pDC->GetSafeHdc()这句话,我就想了想为甚要这样写呢?看了OpenGL和Vc技术内幕后,我终于好想知道了为什么。

解答:

      首先从 OpenGL开始,因为每个OpenGL应用程序必须有一个渲染描述表RC,而必须在会之前它应该是当前得到。渲染描述表是OpenGL输出与Windows设备描述表联系的机制。而对于GDI C++对象返回的指针的有效期是临时的,所以不能将指针保存为类成员,而应该借助GetSafeHdc()将它转化为Windows的句柄。


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是裁剪过的


0 0
原创粉丝点击