有时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的作用一个是释放,一个是销毁。
|