Я пишу неуправляемому Win32 функцию C++, которая получает дескриптор к битовому массиву, и я должен привлечь ее.
Моя проблема состоит в том, что для рисования я должен получить контекст устройства, но когда я делаю GetDC (ПУСТОЙ УКАЗАТЕЛЬ), он дает мне контекст устройства для ОКНА! Параметр для GetDC () является дескриптором окна (HWND), но у меня нет окна; просто "ручка" растрового отображения.
Как я могу привлечь этот битовый массив?Спасибо!
В дополнение к ответу Павла, "совместимый с экраном" меня тоже всегда смущал, но, поскольку CreateCompatibleDC(NULL)
повсеместно используется для этой цели, я полагаю, что это правильно.
Я думаю, что "совместимый" относится только к DDB (DC настроен на запись на правильный тип DDB для текущего экрана), но не влияет на чтение/запись на DIB.
Поэтому, чтобы перестраховаться, всегда используйте DIBs, а не DDBs, если вам нужно работать с растровыми изображениями, которые не просто должны временно отображаться на экране, в настоящее время разница в производительности ничтожна. См. здесь для получения дополнительной информации о DIBs и DDBs.
CreateCompatibleDC () и SelectObject () ваше растровое изображение в нем.
Однако не каждое растровое изображение может быть выбрано в любой DC. Возможно, вам придется поиграться с режимом сопоставления и другими параметрами контроллеров домена памяти.
Основная парадигма Win32 для рисования на растровом изображении заключается в том, что вы выбираете растровое изображение в контексте устройства, после чего все операции рисования в этом контексте устройства сохраняются в растровом изображении. Затем вы используете одну из различных операций «blit» (например, StretchBlt), чтобы передать это на поверхность отображения, которая является просто контекстом устройства клиентской области окна.
Другие предоставили более подробную информацию, это просто общий вид.
Ну, это немного нестандартно ... Я думаю ... Но я знаю, что Графика
может вернуть HDC , а Графика
взять Bitmap
в качестве аргумента его ctor . 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, то же самое будет со всеми остальными.