2

如果按下 shift 键,我试图让我的程序切换一个布尔值。但是,由于某种原因,它似乎没有收到消息,因为我已经将 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);
}

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

4

1 回答 1

3

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

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

于 2013-04-14T20:16:53.613 回答