Странная ошибка с CreateCompatibleDC - PullRequest
6 голосов
/ 26 мая 2010

Может быть, это глупый вопрос, я не понимаю, почему я не могу создать 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 () возвращает нулевой указатель. Затем GetLastError () возвращает 0! Кто-нибудь может угадать, что здесь происходит, пожалуйста?

PS: До этого не было выделений памяти или процедур GDI, поэтому я думаю, что утечки памяти следует исключить.

Ответы [ 2 ]

6 голосов
/ 26 мая 2010

Вы неверно приводите результат GetDC() к HDC. GetDC() возвращает указатель на CDC объект.

Чтобы сделать то, что вы хотите, вы можете сделать одно из следующих. Первый выбор больше соответствует тому, как MFC любит делать что-то, но оба прекрасно работают:

CDC *pDC = GetDC();

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

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

Важно отметить, что вариант 2 не делает то же самое, что вы в настоящее время делаете неправильно. Класс CDC имеет член operator HDC(), который позволяет преобразовывать его в HDC, но это НЕ относится к указателю. Сначала вы должны разыменовать его.

4 голосов
/ 26 мая 2010

Определенные контексты устройства не будут работать с CreateCompatibleDC (). DC должен поддерживать растровые операции. Вы можете передать hdc в GetDeviceCaps () и проверить RASTERCAPS.

Но оказывается, что GetDC, который вы вызываете, - это метод класса, а не привязка C, как я думал, вы имели в виду. SoapBox имеет правильный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...