Как нарисовать на данном дескрипторе растрового изображения (C ++ / Win32)? - PullRequest
5 голосов
/ 30 июня 2010

Я пишу неуправляемую функцию Win32 C ++, которая получает дескриптор растрового изображения, и мне нужно рисовать на нем.

Моя проблема в том, что для рисования мне нужно получить контекст устройства, но когда я делаю GetDC (NULL), он дает мне контекст устройства для WINDOW! Параметр для GetDC () является дескриптором окна (HWND), но у меня нет окна; просто растровый дескриптор.

Как я могу рисовать на этом растровом изображении? Спасибо!

Ответы [ 4 ]

2 голосов
/ 30 июня 2010

В дополнение к ответу Павла, «совместимость с экраном» также всегда меня раздражала, но, поскольку CreateCompatibleDC(NULL) универсально используется для этой цели, я предполагаю, что это правильно.

Я думаю, что«совместимая» вещь связана только с DDB (контроллер DC настроен на запись с правильным типом DDB для текущего экрана), но не влияет на чтение / запись на DIB.

Итак, чтобы быть в безопасности,всегда используйте DIB, а не DDB, если вам нужно работать с растровыми изображениями, которые не просто должны временно отображаться на экране, в настоящее время разница в производительности незначительна.См. здесь для получения дополнительной информации о DIB и DDB.

1 голос
/ 30 июня 2010

CreateCompatibleDC () и SelectObject () вашего растрового изображения в нем.

Однако, не каждый растровое изображение может быть выбран в любом DC.Возможно, вам придется поиграть с режимом отображения и другими параметрами DC памяти.

0 голосов
/ 30 июня 2010

Ну, это немного нестандартно ... Я думаю ... Но я знаю, что Graphics может вернуть HDC , а Graphics принимает Bitmap в качестве аргумента дляего ктор .Bitmap в свою очередь может быть , созданным из HBITMAP и HPALETTE .Единственная проблема здесь заключается в том, что я не знаю, может ли аргумент HPALETTE быть NULL.

Graphics* g;
Bitmap* bitmap;
HBITMAP _bitmap;   // <- this one is yours

bitmap = Bitmap::FromHBITMAP(_bitmap, NULL);
g = new Graphics(bitmap);

HDC hdc = g->GetHDC();

// when done, call g->ReleaseHDC(hdc);

Однако я призываю вас получить HDC в качестве аргумента для вашей функции.Я не думаю, что у кого-то будет BITMAP, и у него НЕ будет DC.
Если у вас возникли проблемы с поиском HDC для HBITMAP, то и у всех остальных.

0 голосов
/ 30 июня 2010

Основная парадигма win32 для рисования на растровом изображении заключается в том, что вы выбираете растровое изображение в контексте устройства, после чего все операции рисования в этом контексте устройства сохраняются в растровом изображении.Затем вы используете одну из различных операций 'blit' (например, StretchBlt), чтобы передать это на поверхность дисплея, которая является просто контекстом устройства клиентской области окна.

Другие предоставили более подробную информацию, это простовысокоуровневое представление.

...