2010-05-26 2 views
4

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

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

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

ответ

4

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

+0

Вы совершенно правы. Это была ошибка. Благодарен всем за помощь! – sevaxx

2

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

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

+0

GetDeviceCaps (hdc, RASTERCAPS) возвращается 0 .... означает ли это отсутствие поддержки растровых операций? – sevaxx

+0

@sevaxx: ну, в документации говорится, что GetDeviceCaps (hdc, RASTERCAPS) должен вернуть одно из этих значений битового поля, так что нуль, казалось бы, не будет иметь никаких растровых возможностей. Когда я просто запустил его с открытым окном DC, он вернулся 0x7E99 – JustJeff

Смежные вопросы