这是一些代码:
PAINTSTRUCT ps;
HDC hidden = CreateCompatibleDC(NULL);
HBITMAP hiddenbmp = CreateBitmap(288,288,1,24,NULL);
HBITMAP hiddenold = (HBITMAP)SelectObject(hidden,hiddenbmp);
HDC other = GetDC(NULL);
HDC otherhdc = CreateCompatibleDC(other);
HBITMAP sprites;
if (color)
sprites = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_COLOR_SPRITES));
else sprites = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BLACKWHITE_SPRITES));
HBITMAP otherold = (HBITMAP)SelectObject(otherhdc, sprites);
// Find x and y coordinate for the top left of the visible screen
int x = game.Player_x, y = game.Player_y, ypos = 0;
if (x < 4) x = 4;
if (x > 27) x = 27;
if (y < 4) y = 4;
if (y > 27) y = 27;
if (modx == -100) modx = x; // modx and mody are initialized to -100
else x = modx;
if (mody == -100) mody = y;
else y = mody;
x -= 4;
y -= 4;
// Draw lower layer
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (game.Layer_Two[x + i][y + j] != 0)
{
int xpos = game.get_pos(game.Layer_Two[x + i][y + j], ypos, false);
BitBlt(hidden, (i * 32), (j * 32), 32, 32, otherhdc, xpos, ypos, SRCCOPY);
}
}
}
// Draw upper layer
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if ((game.Layer_Two[x + i][y + j] != 0 && game.Layer_One[x + i][y + j] >= 64 && game.Layer_One[x + i][y + j] <= 111))
{
int xpos = game.get_pos(game.Layer_One[x + i][y + j], ypos, true);
TransparentBlt(hidden, (i * 32), (j * 32), 32, 32, otherhdc, xpos, ypos, 32, 32, RGB(255, 255, 255));
} else {
int xpos = game.get_pos(game.Layer_One[x + i][y + j], ypos, false);
BitBlt(hidden, (i * 32), (j * 32), 32, 32, otherhdc, xpos, ypos, SRCCOPY);
}
}
}
// Draw the compiled image to the main window
HDC hdc = GetDC(hWnd);
BitBlt(hdc, 32, 32, 288, 288, hidden, 0, 0, SRCCOPY);
SelectObject(hidden,hiddenold);
DeleteDC(hidden);
DeleteObject(hiddenbmp);
SelectObject(other,otherold);
DeleteObject(other);
DeleteDC(otherhdc);
ReleaseDC(hWnd, hdc);
这是在一个名为 DrawMap() 的函数中 - 你知道什么 - 绘制地图(由 9 x 9、32 x 32 像素的 2 层组成)。我想要做的是在屏幕外(即不可见)DC 中编译 9 x 9 瓷砖,然后一次将其渲染到主窗口,这样就不可能看到瓷砖的实际绘制方式 -从左到右,从上到下。使用此代码,不会将任何内容绘制到主窗口。
更奇怪的是,我尝试只使用“其他”hdc(不是“隐藏”的——尽管我的意图是隐藏“其他”hdc)。我在第 35、48 和 51 行有 BitBlt() 和 TransparentBlt() 函数,使用“otherhdc”作为源 hdc,“other”作为目标 hdc。然后在第 56 行将“其他”复制到“hdc”(hWnd 的 DC)。这完全按照我想要的方式工作,除了“其他”在屏幕上呈现为 0、0(屏幕,而不是窗口 - 像0, 0 在实际的物理屏幕上)。奇怪的。虽然我想这基本上是我的目标,减去绘制“其他”。
我意识到,由于这将被大量使用,为了最大限度地提高效率,不应该在函数中调用 DC 等的析构函数,而应该在应用程序结束时调用(即仅一次)。我只是将它们包括在内以更好地了解该功能。