Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange error with CreateCompatibleDC

Tags:

c++

windows

mfc

gdi

Maybe this is a foolish question, I can't see why I can not get a DC created in the following code :

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

The bitmap hBmp is loaded fine and hdc has a valid value. But the call to CreateCompatibleDC() returns a NULL pointer. Then, GetLastError() returns 0 ! Anybody can guess what's going on here , please ?

PS : There are no memory allocations or GDI routines called before this one...so I think memory leaks should be ruled out.

like image 947
sevaxx Avatar asked May 26 '10 01:05

sevaxx


1 Answers

You are improperly casting the result of GetDC() to an HDC. GetDC() returns a pointer to a CDC object.

To do what you want you can do either of the following. The first choice fits more into how MFC likes to do things, but both work just fine:

CDC *pDC = GetDC();

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

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

It is important to note that option 2 does not do the same thing that you're currently doing wrong. The CDC class has an operator HDC() member that allows it to be converted to an HDC, but this does NOT apply to the pointer. You must dereference it first.

like image 151
SoapBox Avatar answered Sep 27 '22 20:09

SoapBox