我正在使用简单的对话框。该对话框是从资源文件创建的。创建对话框 WS_CHILD 时,一切正常。我可以使用 VK_TAB 键轻松地在项目(编辑框和按钮)之间切换。但是当我尝试将对话框类型更改为 WS_POPUP 时,元素之间的切换变得不可能。焦点停留在第一个元素上,当我按下 VK_TAB 键时,我听到系统警报声(如“叮”)。有什么建议吗?
编译器:gcc 4.6.x
资源示例:
DIALOG_CLIENT_SETTINGS DIALOG 0, 0, 156, 132
STYLE WS_CHILD | WS_VISIBLE | DS_CONTROL // Tab key stucks when change to WS_POPUP
CAPTION "Settings"
FONT 8, "Ms Shell Dlg"
LANGUAGE LANG_NEUTRAL, 0
{
CONTROL "Account Settings", IDC_GROUPBOX_1, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 8, 4, 140, 50
CONTROL "Login:", IDC_STATIC_1, "STATIC", SS_RIGHT | WS_CHILD | WS_GROUP | WS_VISIBLE, 16, 20, 40, 8
CONTROL "Password:", IDC_STATIC_2, "STATIC", SS_RIGHT | WS_CHILD | WS_GROUP | WS_VISIBLE, 16, 36, 40, 8
EDITTEXT IDC_EDIT_1, 60, 18, 80, 12, ES_LEFT | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE, WS_EX_WINDOWEDGE
EDITTEXT IDC_EDIT_2, 60, 34, 80, 12, ES_LEFT | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE, WS_EX_WINDOWEDGE
CONTROL "Cancel", IDC_BUTTON_1, "BUTTON", BS_PUSHBUTTON | BS_VCENTER | BS_CENTER | WS_CHILD | WS_TABSTOP | WS_VISIBLE, 98, 112, 50, 14
CONTROL "Apply", IDC_BUTTON_2, "BUTTON", BS_PUSHBUTTON | BS_VCENTER | BS_CENTER | WS_CHILD | WS_TABSTOP | WS_VISIBLE, 42, 112, 50, 14
}
最佳答案
您需要使用 IsDialogMessage
在您的主消息循环中,以便对话可以正确拦截和处理消息。你没有解释你的消息循环是如何实现的,这将影响你如何做这件事。一种方法是直接编码:
while(GetMessage(&Msg, NULL, 0, 0))
{
if(!IsDialogMessage(hDialogWnd, &Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
如果您将某些框架(例如 MFC)用于您的消息循环,那么您将通过使用 PreTranslateMessage
的覆盖来拦截它,如下所示:
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if(IsDialogMessage(pMsg))
return TRUE;
else
return CDialog::PreTranslateMessage(pMsg);
}
关于c++ - WS_CHILD 对话框上的 WS_TABSTOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21062990/