C++ C++;显示棋盘格和倾斜颜色的BitBlt

C++ C++;显示棋盘格和倾斜颜色的BitBlt,c++,winapi,bitmap,gdi,bitblt,C++,Winapi,Bitmap,Gdi,Bitblt,我正在尝试绘制屏幕外设备上下文/位图,并使用bitblt将图像移动到主hdc。以下是我目前看到的结果: 左侧的蓝色、黄色和绿色条将直接绘制到窗口的hdc。右边那些看起来很奇怪的图片被画到后缓冲区,并作为一帧复制过来。它们应该是相同的,但显然不是这样 下面是我正在使用的代码,简化为一个简单的示例: COLORREF color_yellow = RGB (224, 224, 0); COLORREF color_green = RGB (0, 192, 0); COLORREF color_bl

我正在尝试绘制屏幕外设备上下文/位图,并使用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进行位闪烁。所有这些在我看来都是正确的


我肯定有些小事情我没有做,但我找不到它。

这在以下文档中解释:

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

因此,改变

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


尝试创建与桌面窗口兼容的内存DC。我真的不知道为什么,但这在很多情况下都对我有效。旁注,通常情况下,您需要根据
WM_paint
进行绘制,因此您必须调用
hdc=BeginPaint/EndPaint
例程,而不是
GetDC/ReleaseDC
。如果您只想创建内存dc,那么可以按照@Adrian的建议使用
GetDC(0)
。但是
CreateCompatibleDC
仍应使用实际的设备上下文(
hdc
),而不是内存dc。@BarmakShemirani-通常是。这实际上是在一个连续的、可变的FPS循环中进行渲染,而不是仅仅在WM_PAINT上重新绘制,但我保留了该代码以保持示例的小型化。感谢您指出这一点-这有点违反直觉,并且不明显的是,新上下文不会与原始上下文完全相同。“兼容”这个词一定让我很反感。
CreateCompatibleBitmap(hdc, width, height);//colored bitmap