У меня есть растровое изображение в виде массива из 32-битных целых чисел (ARGB-пиксели: uint32 *mypixels
) и int width
и int height
. Мне нужно вывести их на принтер.Как рисовать в контексте устройства
У меня есть контекст принтера: HDC hdcPrinter;
Как я узнал, что мне нужно сначала создать совместимый контекст:
HDC hdcMem = CreateCompatibleDC(hdcPrinter);
Тогда мне нужно создать HBITMAP
объект, выберите его в совместимый контекст и визуализации:
HBITMAP hBitmap = ...?
SelectObject(hdcMem, hBitmap);
BitBlt(printerContext, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY);
и, наконец, очистить:
DeleteObject(hBitmap);
DeleteDC(hdcMem);
Мой вопрос в том, как создать объект HBITMAP
и положить в него mypixels
?
Я нашел два варианта:
HBITMAP hBitmap = CreateCompatibleBitmap(hdcPrinter, width, height);
Выглядит хорошо, но как
mypixels
попасть в этот растровое изображение?HBITMAP hBitmap = CreateDIBSection(hdcPrinter /*or hdcMem?*/, ...);
Будет ли она работать? Это лучше, чем вариант 1.?
вы можете использовать или [SetDIBits] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd162973 (v = vs.85) .aspx) после того, как [CreateCompatibleBitmap] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd183488(v=vs.85).aspx) - или лучше сделать это при одном вызове [CreateDIBitmap] (https://msdn.microsoft .com/en-us/library/windows/desktop/dd183491 (v = vs.85) .aspx) - 'создает совместимое растровое изображение (DDB) из DIB и, опционально, устанавливает битовые биты' – RbMm
Множество способов, где он исходит. В основном из файла, ресурса, ячейки памяти. Вам нужно будет сосредоточиться на источнике растрового изображения, фрагмент кода автоматически выплывает из любого основного запроса Google. Обратите внимание на ошибку в коде, вы никогда не сможете игнорировать возвращаемое значение SelectObject(). Контекст устройства должен быть восстановлен, неспособность сделать это вызывает утечку памяти. Рекомендуется использовать библиотеку для этого, также помогает избежать поиска в Интернете. –