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

Making TAB key work in my win32 app

本文关键字:TAB 工作 我的 Win32 应用程序      更新时间:2023-10-16

我想在我的应用程序上使"选项卡"按钮工作,因此,当我按下选项卡时,它将从一个编辑框更改为另一个编辑框,这些是编辑框代码:

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

修复程序非常简单。鉴于您正在处理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);
}

但是,IsDialogMessage的文档状态:

"尽管ISDialogMessage函数旨在用于无模型对话框,但您可以将其与任何包含控件的窗口一起使用,从而使Windows能够提供与对话框中使用的相同键盘选择。 当IsdialogMessage处理消息时,它会检查键盘消息,并将其转换为相应的对话框的选择命令。例如,按下时,"选项卡键"选择下一个控件或组的控件组,然后按下时向下箭头键选择组中的下一个控件。

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

据我所知,您应该仅在第一个条目时使用WS_GROUP。以下所有以下ChildWindows都将添加到该组中。创建一个新组时,您可以在创建的第一个窗口上再次使用WS_GROUP。因此,将WS_GROUP保留在TextBox上并将其删除,形成其他窗口。

您可以在MSDN上阅读此信息。

您还应在消息循环中使用IsDialogMessage。您可以在此处看到一个示例。

我也有类似的问题,发现在tramnslatemessage和dispatchMessage之前添加isDialogMessage语句(如接受的答案所示)解决了我的问题。