gpt4 book ai didi

c++ - 处理 WM_KEYDOWN

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:50 26 4
gpt4 key购买 nike

我试图让我的程序在按下 shift 键时切换 bool 值。但是,出于某种原因,它似乎没有收到消息,因为我已经将 MessageBoxes 放在 KEYDOWN 和 KEYUP 的情况下,并且它们没有被触发。这感觉像是一个菜鸟问题,但我们将不胜感激。

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);
}

现在这是此回调的完整代码。我知道顶部的各种静态动态变量可能不是执行此操作的最有效方法,但可以满足我的目的。

最佳答案

WM_KEYUP/DOWN 消息被发布到具有焦点的窗口。这不会成为您的对话窗口,我们可以从 WM_COMMAND 消息处理程序中得知您至少有一个取消按钮。这很可能会引起关注。除了按空格键之外,该按钮对消息没有任何特殊作用。

这个问题是从使用对话框作为主窗口开始的。它不完全适合实现游戏的窗口类型,它适合对话。在窗口仅充当容器的情况下,工作由您放置在对话框上的控件完成。您可以通过在消息循环中拦截消息来挽救它,然后再将其分派(dispatch)到具有焦点的窗口。 TranslateAccelerator() 函数是实现快捷键击的标准方法。或者通过在循环内调用 IsDialogMessage 并实现 WM_GETDLGCODE 的处理程序。

关于c++ - 处理 WM_KEYDOWN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16002953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com