使用BitBlt进行C ++绘图

时间:2012-12-25 07:59:01

标签: c++ winapi bitmap draw

我有一个我正在进行的游戏的功能:

void DrawMap()
{
BITMAP bm;
PAINTSTRUCT ps;
HBITMAP sprites = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_COLOR_SPRITES));
HDC hdc = BeginPaint(hWnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, sprites);
GetObject(sprites, sizeof(bm), &bm);

// Find x and y coordinate for the top left of the visible screen
int x = 4, y = 4, ypos = 0;

// Draw lower layer
for (int i = 0; i < 9; i++)
    for (int j = 0; j < 9; j++)
        BitBlt(hdc, (i * 32) + 36, (j * 32) + 36, 32, 32, hdcMem, game.get_pos(game.Layer_One[x + i][y + j], ypos), ypos, SRCCOPY);

// Draw upper layer
for (int i = 0; i < 9; i++)
    for (int j = 0; j < 9; j++)
        if (game.Layer_One[x + i][y + j] != 0)
            BitBlt(hdc, (i * 32) + 36, (j * 32) + 36, 32, 32, hdcMem, game.get_pos(game.Layer_One[x + i][y + j], ypos, true), ypos, SRCCOPY);

SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
EndPaint(hWnd, &ps);
}

变量'game'是我用来保存所有游戏变量和函数的类的实例。基本上,两个分组for循环应该做的是创建一个32×32像素的双层9×9网格,这些图块是从一个地方包含所有图块的图像复制而来的。我测试了我的get_pos()函数,它在完整的sprite位图中返回部分位图的正确x和y位置。
get_pos()的第二个参数是引用 - 所以它可以给出一个y值并返回一个x值。 出于某种原因,我的功能虽然看似正确地设置给我(并且肯定被称为),但并没有在hWnd上产生任何绘图。我做错了什么?

1 个答案:

答案 0 :(得分:-1)

它没有直接回答您的问题,但如果您不需要与旧版本的Windows兼容,为什么不使用Direct2D? GDI非常被弃用(更不用说慢)。