Вопрос

Может быть, это глупый вопрос, я не вижу, почему я не могу получить постоянный ток, созданный в следующем коде:

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

Bitmap HBMP загружается нормально, и HDC имеет допустимое значение. Но звонок для CreateCompatibleDC () возвращает нулевой указатель. Тогда getlasterror () возвращается 0! Кто-нибудь может угадать, что здесь происходит, пожалуйста?

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

Это было полезно?

Решение

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

Другие советы

Некоторые контексты устройства не будут работать с CreateCompatibleDC (). DC должен поддерживать растровые операции. Вы можете кормить HDC для getDeviceCaps () и проверять растреkaps.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top