2010-05-26 104 views
4

也许这是一个愚蠢的问题,我不明白为什么我不能让一个DC在下面的代码创建:与CreateCompatibleDC奇怪的错误

HBITMAP COcrDlg::LoadClippedBitmap(LPCTSTR pathName,UINT maxWidth,UINT maxHeight) 
{ 
    HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, pathName, IMAGE_BITMAP, 0, 0, 
            LR_LOADFROMFILE | LR_CREATEDIBSECTION);  
    if (!hBmp) 
     return NULL; 

    HDC hdc = (HDC)GetDC(); 
    HDC hdcMem = CreateCompatibleDC(hdc); 
    if (!hdcMem) 
    { 
     DWORD err = GetLastError(); 
    } 
    ... 
    ... 
    ... 

位图骨形态发生蛋白是加载罚款和HDC具有有效值。但是对CreateCompatibleDC()的调用返回一个NULL指针。然后,GetLastError()返回0! 有人可以猜到这里发生了什么事吗?

PS:在这个之前没有调用内存分配或GDI例程......所以我认为应该排除内存泄漏。

回答

4

您错误地将GetDC()的结果转换为HDCGetDC()返回指向CDC对象的指针。

要做你想做的事情,你可以做以下任一项。第一种选择更适合到MFC怎么喜欢做的事情,但都工作得很好:

CDC *pDC = GetDC(); 

// Option 1 
CDC memDC; 
memDC.CreateCompatibleDC(pDC); 

// Option 2 
HDC hMemDC = CreateCompatibleDC((HDC)(*pDC)); 

要注意的是选择2不这样做,你现在正在做什么错同样的事情是很重要的。 CDC类有一个operator HDC()成员,允许将其转换为HDC,但这不适用于指针。你必须先解除引用。

+0

你是完全正确的。这是错误。感谢所有人的帮助! – sevaxx 2010-05-26 01:46:45

2

某些设备上下文无法与CreateCompatibleDC()一起使用。 DC必须支持光栅操作。您可以将HDC提供给GetDeviceCaps()并检查RASTERCAPS。

但事实证明,你调用的GetDC是一个类的方法,而不是我认为你的意思的C绑定。 SoapBox有正确的答案。

+0

GetDeviceCaps(hdc,RASTERCAPS)返回0 ....这是否表示不支持光栅操作? – sevaxx 2010-05-26 01:34:13

+0

@sevaxx:那么,文档说GetDeviceCaps(hdc,RASTERCAPS)应该返回其中一个着名的位域值,所以零似乎意味着没有栅格功能。当我用普通的窗口DC运行它时,它返回0x7E99 – JustJeff 2010-05-26 01:58:35