在我的win32应用程序中使TAB键工作

cUs*_*r26 3 c++ winapi codeblocks

我想让我的应用程序上的标签按钮工作,所以当我按下标签时,它会从一个编辑框变为另一个,这些是编辑框代码:

    case WM_CREATE:

    TextBox = CreateWindow("EDIT",
                            "",
                            WS_BORDER|WS_CHILD|WS_VISIBLE|WS_EX_LAYERED|WS_TABSTOP|WS_GROUP,
                            60,50,200,20,
                            hwnd,NULL,NULL,NULL);
    DataBox = CreateWindow("EDIT",
                            "",
                            WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP,
                            60,72,200,20,
                            hwnd,NULL,NULL,NULL);
    MotivBox = CreateWindow("EDIT",
                            "",
                            WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP,
                            60,92,200,20,
                            hwnd,NULL,NULL,NULL);
    PretBox = CreateWindow("EDIT",
                            "",
                            WS_BORDER|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP,
                            60,112,200,20,
                            hwnd,NULL,NULL,NULL);
Run Code Online (Sandbox Code Playgroud)

enh*_*lep 6

修复非常简单.鉴于您正在处理WM_CREATE消息而不是WM_INITDIALOG消息,假设您将控件添加到"标准"窗口而不是"对话框"似乎是安全的.

考虑到这一点,我希望你的winmain中有以下内容:

/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
    /* Translate virtual-key messages into character messages */
    TranslateMessage(&messages);
    /* Send message to WindowProcedure */
    DispatchMessage(&messages);
}
Run Code Online (Sandbox Code Playgroud)

但是,IsDialogMessage州的文件:

"尽管IsDialogMessage函数适用于无模式对话框,但您可以将其用于包含控件的任何窗口,使窗口能够提供与对话框中使用的相同的键盘选择.当IsDialogMessage处理消息时,它会检查键盘消息并将它们转换为相应对话框的选择命令.例如,按下TAB键时,选择下一个控件或一组控件,按下DOWN ARROW键,选择组中的下一个控件.

由于IsDialogMessage函数执行所有必要的消息转换和分派,因此IsDialogMessage处理的消息不得传递给TranslateMessage或DispatchMessage函数.

因此,您可以将消息泵更改为类似以下内容:

/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
    /* Translate virtual-key messages into character messages */
    if (IsDialogMessage(hwnd, &messages) == 0)
    {
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
}
Run Code Online (Sandbox Code Playgroud)