Странная ошибка с CreateCompatibleDC

Возможно, это - глупый вопрос, я не вижу, почему я не мог создать 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, названных перед этим..., таким образом, я думаю, что утечки памяти должны быть исключены.

6
задан sevaxx 26 May 2010 в 01:15
поделиться

2 ответа

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

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

CDC *pDC = GetDC();

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

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

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

6
ответ дан 10 December 2019 в 00:34
поделиться

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

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

4
ответ дан 10 December 2019 в 00:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: