Возможно, это - глупый вопрос, я не вижу, почему я не мог создать 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, названных перед этим..., таким образом, я думаю, что утечки памяти должны быть исключены.
Вы неправильно преобразовываете результат 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, но это НЕ применяется к указателю. Вы должны сначала разыменовать его.
Определенные контексты устройств не работают с CreateCompatibleDC (). Контроллер домена должен поддерживать растровые операции. Вы можете передать hdc в GetDeviceCaps () и проверить RASTERCAPS.
Но оказалось, что вызываемый GetDC - это метод класса, а не привязка C, как я думал, вы имели в виду. У SoapBox есть правильный ответ.