C ++ BitBlt отображает шахматную доску и перекошенные цвета - PullRequest
3 голосов
/ 25 сентября 2019

Я пытаюсь нарисовать контекст устройства / растровое изображение вне экрана и переместить изображение на основной HDC, используя bitblt.Вот результат, который я сейчас вижу:

enter image description here

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

Вот код, который я использую, приведенный к минимальному примеру:

COLORREF color_yellow = RGB (224, 224, 0);
COLORREF color_green = RGB (0, 192, 0);
COLORREF color_blue = RGB (0, 0, 192);

HBRUSH brush_yellow = CreateSolidBrush (color_yellow);
HBRUSH brush_green = CreateSolidBrush (color_green);
HBRUSH brush_blue = CreateSolidBrush (color_blue);

HDC hdc = GetDC (Window);
HDC hdc_buffer = CreateCompatibleDC (hdc);
HBITMAP bitmap_buffer = CreateCompatibleBitmap (hdc_buffer, blit.screen_width, blit.screen_height);
SelectObject (hdc_buffer, bitmap_buffer);

draw_rectangle (hdc, 0, 0, 100, 30, brush_blue);
draw_rectangle (hdc, 0, 30, 100, 60, brush_yellow);
draw_rectangle (hdc, 0, 60, 100, 90, brush_green);

draw_rectangle (hdc_buffer, 0, 0, 100, 30, brush_blue);
draw_rectangle (hdc_buffer, 0, 30, 100, 60, brush_yellow);
draw_rectangle (hdc_buffer, 0, 60, 100, 90, brush_green);

BitBlt (hdc, 120, 0, 100, 90, hdc_buffer, 0, 0, SRCCOPY);

void draw_rectangle (HDC hdc, int left, int top, int right, int bottom, HBRUSH brush)
  {
  RECT rect;
  SetRect (&rect, left, top, right, bottom);
  FillRect (hdc, &rect, brush);
  }

Я создаю новый HDC (совместимыйс окном), создавая совместимое растровое изображение, выбирая его, рисуя прямоугольники и разбрасывая биты с помощью SRCCOPY.Все это мне подходит.

Я уверен, что есть кое-что, что я не делаю, но я не могу его найти.

1 Ответ

1 голос
/ 25 сентября 2019

Это объясняется в документации для CreateCompatibleBitmap:

Примечание. При создании контекста устройства памяти изначально выбирается монохромное растровое изображение 1 на 1внутрь.Если этот контекст устройства памяти используется в CreateCompatibleBitmap, то создается растровое изображение монохромное растровое изображение .Чтобы создать цветное растровое изображение, используйте HDC, который использовался для создания контекста устройства памяти

. Поэтому измените

CreateCompatibleBitmap(hdc_buffer, width, height);//monochrome

на

CreateCompatibleBitmap(hdc, width, height);//colored bitmap
...