把两个图像放在一起
BitBlt two images atop one another
我正在尝试编写一个程序,当选中一个复选框时,在屏幕的大片区域上显示一个网格。我试图使用BitBlt在WM_PAINT中做到这一点,我的显示函数肯定是用正确的布尔值调用的。但是,它不会对窗口进行任何更改。是我做了什么愚蠢的事情,还是没有实现这一目标的实际方法?如果这是无法实现的,有没有办法得到类似的结果,而不指定一组不同的图像包含网格?
void DisplayRoom(HWND hwnd, char TileList[][100], POINT pMaxDisplay, POINT pMinDisplay, HBITMAP ahbmTileset[], bool bDisplayBars)
{
HBITMAP hbmSprite, hbmMask;
BITMAP bm;
PAINTSTRUCT ps;
HINSTANCE hinNULL = GetModuleHandle(NULL);
HDC hdc = BeginPaint(hwnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld;
POINT Position;
hbmSprite = LoadBitmap(hinNULL, MAKEINTRESOURCE(IDB_CLEAR_GROUND));
hbmOld = (HBITMAP)SelectObject(hdcMem, hbmSprite);
GetObject(hbmSprite, sizeof(bm), &bm);
for (int iii = pMinDisplay.x; iii < pMaxDisplay.x; iii++)
for (int jjj = pMinDisplay.y; jjj < pMaxDisplay.y; jjj++)
{
switch(TileList[iii][jjj])
{
case 'g':
hbmSprite = ahbmTileset[0];
break;
case 'd':
hbmSprite = ahbmTileset[1];
break;
case 'i':
hbmSprite = ahbmTileset[2];
break;
case 'l':
hbmSprite = ahbmTileset[3];
break;
}
assert(hbmSprite != NULL);
SelectObject(hdcMem, hbmSprite);
BitBlt(hdc, (iii - pMinDisplay.x) * 34 + 90, (jjj - pMinDisplay.y) * 34 + 60, 34, 34, hdcMem, 0, 0, SRCCOPY);
}
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
if (bDisplayBars)
{
HDC hdc = BeginPaint(hwnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
hbmSprite = LoadBitmap(hinNULL, MAKEINTRESOURCE(IDB_GRID));
assert(hbmSprite != NULL);
hbmMask = CreateBitmapMask(hbmSprite, RGB(0,0,0));
for (int iii = pMinDisplay.x; iii < pMaxDisplay.x; iii++)
for (int jjj = pMinDisplay.y; jjj < pMaxDisplay.y; jjj++)
{
SelectObject(hdcMem, hbmMask);
BitBlt(hdc, (iii - pMinDisplay.x) * 34 + 90, (jjj - pMinDisplay.y) * 34 + 60, 34, 34, hdcMem, 0, 0, SRCAND);
SelectObject(hdcMem, hbmSprite);
BitBlt(hdc, (iii - pMinDisplay.x) * 34 + 90, (jjj - pMinDisplay.y) * 34 + 60, 34, 34, hdcMem, 0, 0, SRCPAINT);
}
DeleteDC (hdcMem);
EndPaint(hwnd, &ps);
}
}
对话过程如下所示。
BOOL CALLBACK CreateRoom(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
static char achTileDetails[100][100];
static POINT pDimensions, pMonsterLocations, pMinDisplay, pMaxDisplay;
static HBITMAP ahbmTileset[4];
static bool bShowBars;
switch(Message)
{
case WM_INITDIALOG:
SetFocus(hwnd);
for (int iii = 0; iii < 100; iii++)
for(int jjj = 0; jjj < 100; jjj++)
achTileDetails[iii][jjj] = 'g';
pDimensions.x = 20;
pDimensions.y = 10;
pMinDisplay.x = 0;
pMinDisplay.y = 0;
pMaxDisplay.x = 20;
pMaxDisplay.y = 10;
for (int iii = 0; iii < 4; iii++)
ahbmTileset[iii] = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_CLEAR_GROUND + iii));
return TRUE;
case WM_PAINT:
DisplayRoom(hwnd, achTileDetails, pMaxDisplay, pMinDisplay, ahbmTileset, bShowBars);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
break;
case IDC_DISPLAY_GRID:
switch(HIWORD(wParam))
{
case BN_CLICKED:
bShowBars = SendMessage(GetDlgItem(hwnd, IDC_DISPLAY_GRID), BM_GETCHECK, 0, 0);
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
break;
}
break;
}
break;
case WM_LBUTTONDOWN:
break;
default:
return FALSE;
}
}
我可以看到的主要问题是您调用BeginPaint
和EndPaint
两次。你应该只在任何油漆之前做一次BeginPaint
,在所有油漆完成后做EndPaint
。
可能还有其他问题,这些东西很难准确无误
相关文章:
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 将图形属性与 std::unique_ptr 捆绑在一起
- 你能在 c++ 中将不同的数字类型加在一起吗?
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 为什么push_back和emplace_back结合在一起时,会有不同的行为
- 在浮点精度成为一个问题之前,可以将多少个浮点值加在一起
- 为什么在template函数广播中把两个extensor表达式加在一起不正确
- 实现具有浮点键的类似哈希表的数据结构,其中公差内的值被合并在一起
- 图像在本地主机上显示已损坏
- 如何在Qt TableView中将列的宽度调整为数据并将最后一部分拉伸在一起
- 编译器如何将链表中的地址字符串在一起?
- 在 c++ 中,两个日志行与 log4Cxx 混合在一起
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 将许多向量排序在一起
- C++ std:: 并包括它们如何组合在一起?
- 通过字符串迭代并将每个循环中的先前字符组合在一起
- photoshop如何将两个图像融合在一起
- 将两个图像拼接在一起的问题
- Photoshop如何将两个图像混合在一起