CreateCompatibleDC出现奇怪错误

时间:2010-05-26 01:10:01

标签: c++ windows mfc gdi device-context

也许这是一个愚蠢的问题,我无法理解为什么我无法在以下代码中创建DC:

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();
    }  
    ...
    ...
    ...

位图hBmp加载正常,hdc具有有效值。但是对CreateCompatibleDC()的调用返回一个NULL指针。然后,GetLastError()返回0! 有谁能猜到这里发生了什么事,拜托?

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

2 个答案:

答案 0 :(得分:6)

您错误地将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,但这不适用于指针。你必须先取消引用它。

答案 1 :(得分:4)

某些设备上下文不适用于CreateCompatibleDC()。 DC必须支持光栅操作。您可以将hdc提供给GetDeviceCaps()并检查RASTERCAPS。

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