如果按下shift键,我试图让我的程序切换bool。但是,由于某种原因,它似乎没有收到消息,因为我已经将MessageBoxes放在KEYDOWN和KEYUP情况下,并且它们不会被触发。这感觉就像是一个noob问题,但任何帮助都会受到赞赏。
BOOL CALLBACK CreateRoom(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
static char *achTileDetails = new char[100,100];
static POINT *pDimensions = new POINT, *pMonsterLocations = new POINT[10], *pMinDisplay = new POINT, *pMaxDisplay = new POINT;
static HBITMAP *pahbmTileset = new HBITMAP[4];
static bool *pbShowBars = new bool;
switch(Message)
{
case WM_INITDIALOG:
g_hDialogInUse = hwnd;
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++)
pahbmTileset[iii] = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_CLEAR_GROUND + iii));
return TRUE;
case WM_PAINT:
DisplayRoom(hwnd, achTileDetails, *pMaxDisplay, *pMinDisplay, pahbmTileset, *pbShowBars);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDCANCEL:
delete[] achTileDetails;
delete pDimensions;
delete[] pMonsterLocations;
delete pMinDisplay;
delete pMaxDisplay;
delete[] pahbmTileset;
delete pbShowBars;
EndDialog(hwnd, IDCANCEL);
break;
}
break;
case WM_LBUTTONDOWN:
break;
case WM_KEYDOWN:
MessageBox(hwnd, "Down", "", NULL);
switch (wParam)
{
case VK_SHIFT:
*pbShowBars = true;
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
break;
}
break;
case WM_KEYUP:
{
MessageBox(hwnd, "Up", "", NULL);
switch(wParam)
{
case VK_SHIFT:
*pbShowBars = false;
InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);
break;
}
}
break;
default:
return FALSE;
}
}
消息循环:
while(GetMessage(&Msg, NULL, 0, 0) != 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
现在这是此回调的完整代码。我知道顶部的各种静态动态变量可能不是最有效的方法,但是可以用于我的目的。
答案 0 :(得分:3)
WM_KEYUP / DOWN消息将发布到具有焦点的窗口。这不会是你的对话窗口,我们可以从WM_COMMAND消息处理程序告诉你至少有一个Cancel按钮。这很有可能成为焦点。除按空格键外,该按钮不会对消息做任何特殊处理。
使用对话框作为主窗口开始解决此问题。它不是一个适合实现游戏的窗口类型,它适用于对话框。在窗口只是作为容器的情况下,工作由您放在对话框上的控件完成。您可以通过拦截消息循环中的消息来抢救它,然后再将其分派到具有焦点的窗口。 TranslateAccelerator()函数是实现快捷键击的标准方法。或者通过在循环中调用IsDialogMessage并为WM_GETDLGCODE实现处理程序。