【问题标题】:C++ BitBlt displaying checkerboard and skewed colorsC++ BitBlt 显示棋盘格和偏色
【发布时间】:2020-01-25 06:08:16
【问题描述】:

我正在尝试绘制到屏幕外设备上下文/位图并使用 bitblt 将图像移动到主 hdc。这是我目前看到的结果:

左侧的蓝色、黄色和绿色条直接绘制到窗口的 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 进行位传输。所有这些在我看来都是正确的。

我确定我没有做一些小事,但我找不到。

【问题讨论】:

  • 尝试创建与 桌面 窗口兼容的内存 DC。不知道为什么,但这在很多情况下都对我有用。
  • 旁注,通常你想响应WM_PAINT,所以你必须调用hdc = BeginPaint/EndPaint例程,而不是GetDC/ReleaseDC。如果您只想创建内存 dc,那么您可以按照 @Adrian 的建议使用 GetDC(0)。但CreateCompatibleDC 仍应使用实际的设备上下文 (hdc),而不是内存 dc。
  • @BarmakShemirani - 通常,是的。这实际上是在一个连续的、可变的 FPS 循环中呈现,而不是仅在 WM_PAINT 上重新绘制,但我保留了该代码以保持示例较小。

标签: c++ winapi bitmap gdi bitblt


【解决方案1】:

CreateCompatibleBitmap 的文档中对此进行了解释:

注意:创建内存设备上下文时,它最初会选择一个 1×1 单色位图。如果在 CreateCompatibleBitmap 中使用此内存设备上下文,则创建的位图是单色位图。要创建彩色位图,请使用用于创建内存设备上下文的 HDC

因此,改变

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

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

【讨论】:

  • 感谢您指出这一点 - 这有点违反直觉,而且新的上下文不会与原始上下文完全相同,这一点并不明显。 “兼容”这个词一定把我吓跑了。
猜你喜欢
  • 2020-12-12
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多