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

时间:2014-02-02 11:00:00

标签: 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);

3 个答案:

答案 0 :(得分:5)

修复非常简单。鉴于您正在处理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函数适用于无模式对话框,但您可以将其用于包含控件的任何窗口,从而使窗口能够提供与对话框中使用的相同的键盘选择。   当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);
    }
}

答案 1 :(得分:1)

据我记忆,你应该只在第一个条目上使用WS_GROUP。以下所有子窗口都将添加到该组中。创建新组时,在创建的第一个窗口上再次使用WS_GROUP。 因此,请将WS_GROUP保留在TextBox上,然后将其从其他窗口中移除。

您可以在MSDN上阅读此内容。

您还应该在消息循环中使用IsDialogMessage。您可以看到example here

答案 2 :(得分:0)

我有类似的问题,发现在TramnslateMessage和DispatchMessage(如接受的答案中所示)之前添加IsDialogMessage语句解决了我的问题。