C++ Win32-为什么没有任何东西被吸引到屏幕上?

C++ Win32-为什么没有任何东西被吸引到屏幕上?,c++,winapi,C++,Winapi,我正在尝试使用一个屏幕外缓冲区,这样我就可以在WM_画图之前/之后跟踪屏幕的变化,并通过WM_画图中的一行复制它们。下面是一些我必须设置图形的代码: hdc = GetDC(hWnd); hdcmem = CreateCompatibleDC(hdc); hbcmem = CreateCompatibleDC(hdcmem); // Load bitmaps bg = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BACKGROUND)); side = Load

我正在尝试使用一个屏幕外缓冲区,这样我就可以在WM_画图之前/之后跟踪屏幕的变化,并通过WM_画图中的一行复制它们。下面是一些我必须设置图形的代码:

hdc = GetDC(hWnd);
hdcmem = CreateCompatibleDC(hdc);
hbcmem = CreateCompatibleDC(hdcmem);

// Load bitmaps
bg = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BACKGROUND));
side = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SIDEINFO));
mainCont = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GAME_CONT));
if(bg == NULL || side == NULL || mainCont == NULL)
            ThrowError("A bitmap failed to load.");

// Background
hdcold = (HBITMAP)SelectObject(hbcmem, bg);
BitBlt(hdcmem, 0, 0, 237, 196, hbcmem, 0, 0, SRCCOPY);
BitBlt(hdcmem, 237, 0, 237, 196, hbcmem, 0, 0, SRCCOPY);
BitBlt(hdcmem, 237 * 2, 0, 237, 196, hbcmem, 0, 0, SRCCOPY);
BitBlt(hdcmem, 0, 196, 237, 196, hbcmem, 0, 0, SRCCOPY);
BitBlt(hdcmem, 237, 196, 237, 196, hbcmem, 0, 0, SRCCOPY);
BitBlt(hdcmem, 237 * 2, 196, 237, 196, hbcmem, 0, 0, SRCCOPY);

// Side Info
hdcold = (HBITMAP)SelectObject(hbcmem, side);
BitBlt(hdcmem, 339, 26, 154, 300, hbcmem, 0, 0, SRCCOPY);

// Main Game Container
hdcold = (HBITMAP)SelectObject(hbcmem, mainCont);
BitBlt(hdcmem, 26, 26, 300, 300, hbcmem, 0, 0, SRCCOPY);
hdc、hdcmem、hbcmem、hdcold、bg、side和MAINTCONT之前已声明。其范围包括该文件中的所有内容(包括此代码和WM_PAINT中的代码)

以下是WM_PAINT中的代码:

PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);

BitBlt(hdc, 0, 0, 518, 401, hdcmem, 0, 0, SRCCOPY);

EndPaint(hWnd, &ps);

由于某种原因,没有任何东西被吸引到屏幕上。我绞尽脑汁想弄明白。如果指针指向正确的方向,我们将不胜感激。

首先为您的内存设备上下文创建一个兼容的位图,然后将该位图选择到内存dc,它应该会工作

hdc = GetDC(hWnd); // used only to create compatibles.
hdcmem = CreateCompatibleDC(hdc);
hbcmem = CreateCompatibleDC(hdc);

// Create client-area-sized compatible bitmap.
RECT rc;
GetClientRect(hWnd, &rc);
HBITMAP hbm_memdc = CreateComptibleBitmap(hdc, rc.right, rc.bottom);
HBITMAP hbm_memdc_old = (HBITMAP)SelectObject(hdcmem, hbm_memdc)

ReleaseDC(hdc); // this no longer needed

// now start rendering into hdcmem... 

在关机时销毁自定义位图句柄之前,您需要保留选中的旧位图句柄以将其放回。如何处理这一切完全取决于您。

您已经检查了WM_PAINT是否真的被调用了?也许您需要一个Invalidate()来更新屏幕?我已经检查过了。肯定有人叫它。很高兴它对你有用。请确保您的
hdc
中的
WM_PAINT
处理程序来自
hdc=BeginPaint(hWnd,&ps)
。这就是在WM_绘制处理期间,您应该从
hdcmem
快速进入的内容。(注意,只要调用
EndPaint()
,它就无效,这是正确的行为)。这意味着在EndPaint()之后,我仍然可以绘制到hdc中。还是我不该这么做?Sry不在我的办公桌旁。不,一旦设置了内存DC,您甚至不需要客户端DC(请参阅下面更新的答案)。您应该在绘制处理程序中使用DC from BeginPaint()。调用EndPaint()将为您释放它。换句话说,您不必调用ReleaseDC(),但在回答这个问题时,您可以在初始设置代码中调用它。同样,请参见下面更新的答案。这与我所做的有什么区别?新创建的DC中的默认位图对于您正在执行的操作不可行。您需要一个CreateCompatibleBitmap(),然后将其选择到memoryDC中。这就是你正在画的东西。当你这么做的时候,DC就是支撑它的东西。从CreateCompatibleDC()上的MS docs:“应用程序在使用内存设备上下文进行绘图操作之前,必须在设备上下文中选择正确宽度和高度的位图。这可以通过使用CreateCompatibleBitmap指定函数调用中所需的高度、宽度和颜色组织来完成。”每个设备上下文必须包含窗口尺寸的位图,该设备上下文表示。当我们绘制时,该位图的内容正在更改。除非您选择此主位图,否则您无法正确绘制,这是有意义的,并且似乎可以工作,但它是以黑白显示的。请解决它。SelectObject()应将“hdc”作为第一个参数。不是“hdcmem”。