CreateCompatibleDC出现奇怪错误

sev*_*axx 6 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();
    }  
    ...
    ...
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

Soa*_*Box 6

你不正确地将结果投射GetDC()到了HDC. GetDC()返回指向CDC对象的指针.

要做你想做的事,你可以做以下任何一种.第一个选择更适合MFC喜欢做的事情,但两者都很好用:

CDC *pDC = GetDC();

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

// Option 2
HDC hMemDC = CreateCompatibleDC((HDC)(*pDC));
Run Code Online (Sandbox Code Playgroud)

重要的是要注意,选项2与您当前做错的事情不同.所述CDC类具有operator HDC()允许其被转换为HDC构件,但是这并不适用于指针.你必须先取消引用它.