【问题标题】:C++ Dialog Box TAB key not workingC++ 对话框 TAB 键不起作用
【发布时间】:2014-11-02 10:20:41
【问题描述】:

我已经尝试了所有方法,但无法使用 TAB 键将焦点从资源对话框中的一个控件移动到另一个控件。代码如下:

IDD_DLG_DIALOG DIALOGEX 0, 0, 219, 198
STYLE DS_SETFONT | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_EX_CONTROLPARENT
EXSTYLE WS_EX_APPWINDOW
CAPTION "Caption"
FONT 8, "Tw Cen MT", 400, 0, 0x0
BEGIN
        DEFPUSHBUTTON   "Done",IDOK,162,175,50,16
        EDITTEXT        IDC_EDIT1,27,13,185,12,ES_AUTOHSCROLL | WS_TABSTOP | WS_VISIBLE | WS_CHILD
        PUSHBUTTON      "Add",IDC_Add,109,30,33,13,WS_TABSTOP | WS_VISIBLE | WS_CHILD
        LISTBOX         IDC_LIST1,7,49,205,121,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | WS_CHILD
        EDITTEXT        IDC_EDIT2,27,31,81,12,ES_AUTOHSCROLL | WS_TABSTOP | WS_VISIBLE | WS_CHILD
        LTEXT           "Name",IDC_STATIC,7,33,18,11
        LTEXT           "Link",IDC_STATIC,7,15,15,11    
        PUSHBUTTON      "Delete",IDC_DEL,144,30,33,13 | WS_TABSTOP | WS_VISIBLE | WS_CHILD
        CONTROL         "Autorun at startup",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,174,70,10 
        PUSHBUTTON      "Edit",IDC_EDIT,179,30,33,13,WS_TABSTOP | WS_VISIBLE | WS_CHILD
END

主 While 循环:

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine,int nCmdShow)
        {
            MSG msg;
            HACCEL hAccelTable;

            // Perform application initialization:
            if (!InitInstance (hInstance, nCmdShow)) return FALSE;
            hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_STEALTHDIALOG);
            while (GetMessage(&msg, NULL, 0, 0))
            {
            if((!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))||(!IsDialogMessage(msg.hwnd,&msg))) 
                        {
                            TranslateMessage(&msg);
                            DispatchMessage(&msg);
                        }
            }
    }

请在此处找出问题所在。谢谢。

【问题讨论】:

标签: c++ visual-studio-2010 winapi visual-c++ dialog


【解决方案1】:

将您的 || 更改为 &&。目前,如果 TranslateAccelerator 返回 0(除非按下加速键,否则它会返回),则永远不会调用 IsDialogMessage - 这就是处理 tab 键的方法。

(此外,正如 Marco A. 在他的回答中暗示的那样,您应该传递对话框的 HWND,而不是 msg.hwnd 作为 IsDialogMessage 调用的第一个参数。但这无关紧要,除非 IsDialogMessage实际上被调用了,当你有||而不是&&时它几乎总是不会调用。

【讨论】:

【解决方案2】:

根据to this postthis kb确认的文章:

TranslateAccelerator() 向窗口发送 WM_COMMAND 消息 处理您作为参数传递给 TranslateAccelerator()。

您可能正在调用 TranslateAccelerator() 传递 hwnd 成员 你的味精结构;这将是窗口的句柄 焦点。您应该改为传递主窗口的句柄。

这适用于您的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2013-09-10
    相关资源
    最近更新 更多