分享

如何从HDC建立一个CDC类

 jtll521 2010-12-01

有时Windows API将会给你一个DC句柄,你可以通过它建立一个CDC类。例如:下拉式列表、组合框和按钮。通过hDC你将接收到绘制消息。下面是将HDC转换成你更熟悉的CDC的程序段。你也可以将该技巧用在其他任何MFC类和Windows句柄的转换中。

void MyODList::DrawItem(LPDRAWITEMSTRUCT lpDrawItem)
{
  CDC myDC;
  myDC.Attach(lpDrawItem->hDC);
  //在此插入其他需要的代码。
  //如果你不将句柄分离,它将被删除,从而导致问题。
  myDC.Detach();
}
另一个方法是调用CDC类的FromHandle方法:
      CDC * pDC = CDC:FromHandle(lpDrawItem->hDC);


相互转换:
方法一: 此方法在设备结束时不会销毁原来的资源(即:hDC,hBitmap)
CDC *pDC = CDC::FromHandle(hDC);

方法二: 此方法在设备结束时会销毁原来的资源(即:hDC,hBitmap)
CDC dc;
dc.Attach(hDC);

关于HDC CDC
首先:CDC 不可以释放. FromHandle 是通过 HDC 来创建了一个CDC 对象,以方便操作,释放 DC 的操作应该针对于HDC 而非此CDC , 如果释放了它   pDC->ReleaseDC,就会造成隐患.  
   
  HDC   hDC   =   GetDC(hWnd);  
  CDC   *pDC   =   CDC::FromHandle(hDC);   
    
这两者是指向的一个DC对象,只能释放一次,而这个释放应该针对 hDC 而非 pDC.  

然后:GetDC和ReleaseDC的调用匹配,CreateDC和DeleteDC的调用匹配。
GetDC是从窗口获取現有的DC,而CreateDC是创建DC,所以ReleaseDC和DeleteDC的作用一个是释放,一个是销毁。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多