Dialog box in C++ not receiving certain keystrokes

2019-06-23 17:58发布

As I'm (finally) learning to code Windows apps in C++ I stumbled upon this: I have a dialog box which I create with CreateDialog() and I also have a default button. However, each time I press TAB or ENTER, nothing happens, nor does the control focus change, nor does the default button activate. Here's the resource for my dialog.

IDD_MAINWIND DIALOG 0, 0, 312, 205
STYLE DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_SYSMENU
EXSTYLE WS_EX_WINDOWEDGE
CAPTION "Dialog"
FONT 8, "Tahoma"
{
    PUSHBUTTON      "&Send", IDC_BUTTON_SEND , 280, 168, 22, 14, BS_DEFPUSHBUTTON
    LTEXT           "Hello", IDC_STATIC1, 9, 9, 296, 149, SS_LEFT | SS_NOPREFIX | SS_SUNKEN, WS_EX_TRANSPARENT
    EDITTEXT        IDC_MESSAGE, 9, 168, 265, 13, ES_AUTOHSCROLL
    PUSHBUTTON      "Tools", IDC_BUTTON_TOOLS, 8, 185, 146, 14
    PUSHBUTTON      "Exit", IDC_BUTTON_EXIT, 163, 185, 136, 14
}

Any help is greatly appreciated. Especially now on the 3rd day of Christmas.

1条回答
放我归山
2楼-- · 2019-06-23 18:28

The solution is to add WS_TABSTOP styles to every child element of the dialog box.

For ex.:

PUSHBUTTON      "&Send", IDC_BUTTON_SEND , 280, 168, 22, 14, BS_DEFPUSHBUTTON | WS_TABSTOP

Be sure that every control has WS_VISIBLE | WS_CHILD styles. Also do not forget to add WS_EX_CONTROLPARENT style to the window and remove WS_GROUP style from the dialog window.

Moreover

Check your dialog proc

Or if you use window proc instead use the following snippet

Tabbing is provided by the dialog manager, not the Window manager. Therefore, to get tab handling, you need to call IsDialogMessage in your message loop with the hwnd of your window:

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

Please, learn about WS_TABSTOP and WS_GROUP dialog box items attributes.

This link should be helpful for you: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644994.aspx#controls

查看更多
登录 后发表回答