Вопрос по c++, c, buffer, windows – Визуализация буфера на экране в Windows

4

Я ищу способ визуализации буфера символов в области содержимого окна. Это просто псевдо, но предназначено для демонстрации того, что я на самом деле хочу сделать:

char buffer[300][200][3];    // 300px x 200px x RGB bytes
// ... render stuff into buffer
FancyWindowsFunctionToRenderBufferOnWindow(my_hwnd, buffer, 300, 200, offset_x, offset_y);

Есть ли способ сделать что-то подобное?

Вы рисуете текст в своем собственном окне или в окне другой программы? chris
Этот вопрос очень широкий, может быть, вы хотитеwinapi DrawText? Jesse Good
@ Джесси, Крис Как вы, ребята, пришли к выводу, что я хочу нарисовать текст в окне? `^^ Niklas R

Ваш Ответ

2   ответа
8

вам нужно создать независимое от устройства растровое изображение (DIB). Если у вас уже есть массив пикселей, который можно поместить в окно приложения, вам может потребоваться скопировать весь массив в буфер, выделенный API-интерфейсом CreateDIBSection, и вызвать BitBlt для передачи DIB в окно. Это единственный известный мне способ показать на экране компьютера на платформе Win32 простой массив пикселей в виде видимой картинки, и это очень сложно и трудно понять.

Вот шаги, которые я использовал для проверки того, что вы хотите сделать:

Создание DIB:

BITMAPINFO bmi;
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = /* Width of your image buffer */
bmi.bmiHeader.biHeight = - /* Height of your image buffer */
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;

HDC hDesktopDC = GetDC(GetDesktopWindow());
HBITMAP hDib = CreateDIBSection(hDesktopDC, &bmi, DIB_RGB_COLORS, (void **)&buffer, 0, 0);
if (buffer == NULL) { /* ERROR */ }
HDC hDibDC = CreateCompatibleDC(hDesktopDC);
HGDIOBJ hOldObj = SelectObject(hDibDC, hDib);

/* Copy your array of pixels to buffer allocated above. */

ReleaseDC(GetDesktopWindow(), hDesktopDC);

Реализация обработчика событий WM_PAINT (переменная hWnd содержит дескриптор окна ниже):

case WM_PAINT:
    PAINTSTRUCT paint;
    HDC hWndDc = BeginPaint(hWnd, &paint);
    BitBlt(hWndDC, 0, 0, /* Width of DIB */, /* Height of DIB */,
           /* HDC of DIB (hDibDC in the above) */, 0, 0, SRCCOPY);
    EndPaint(hWnd, &paint);
    break;

Я действительно не ожидаю, что приведенные выше фрагменты кода помогут вам напрямую. Если вы полны решимости использовать функции GDI, подобные тем, что приведены в приведенных выше фрагментах, я рекомендую вам очень внимательно прочитать их документы API на MSDN. Потому что очень сложно правильно освободить или удалить контроллеры домена или объекты GDI, полученные во время использования API.

6

у вас есть изображение (растр), хранящееся в виде массива символов (что является странным выбором, поскольку вы обычно хотите использовать массив неподписанных символов для необработанных растровых изображений).

Если вы соответствуете определенным ограничениям выравнивания, вы можете отобразить свое растровое изображение довольно прямо сSetDIBits, Вы заполняете структуру BITMAPINFO, которая описывает формат пикселей и размеры изображения, а затем передаете это вместе со своими данными в SetDIBits. Он покрасит их в DC. Это может быть немного сложно, чтобы получить все параметры правильно.

Требование выравнивания состоит в том, что каждая строка сканирования должна начинаться с 4-байтовой границы. Если вы не соответствуете этому требованию, вы получите мусор, похожий на неправильный шаг. При необходимости вы можете сделать копию данных с правильным выравниванием.

Error: User Rate Limit Exceededunsigned charError: User Rate Limit Exceeded Niklas R

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