Как продвигаться данный "ручку" растрового отображения (C++ / Win32)?

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

Моя проблема состоит в том, что для рисования я должен получить контекст устройства, но когда я делаю GetDC (ПУСТОЙ УКАЗАТЕЛЬ), он дает мне контекст устройства для ОКНА! Параметр для GetDC () является дескриптором окна (HWND), но у меня нет окна; просто "ручка" растрового отображения.

Как я могу привлечь этот битовый массив?Спасибо!

5
задан user20493 29 June 2010 в 20:09
поделиться

4 ответа

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

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

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

2
ответ дан 15 December 2019 в 06:14
поделиться

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

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

1
ответ дан 15 December 2019 в 06:14
поделиться

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

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

0
ответ дан 15 December 2019 в 06:14
поделиться

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

0
ответ дан 15 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: