c++ - WS_CHILD 对话框上的 WS_TABSTOP

标签 c++ winapi dialog

我正在使用简单的对话框。该对话框是从资源文件创建的。创建对话框 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/

相关文章:

具有全息灯主题的 Android 对话框 Activity

c++ - 如何转发打包的可变参数

c++ - 通过返回指向 map 的指针访问 map C++

c++ - 如何编写一个空类,初始化另一个类的三个对象

winapi - LogonUser 使用 LOGON32_LOGON_NEW_CREDENTIALS 对远程不受信任的域机器起作用

java - 处理主 Activity 中的外部类对话框按钮

c++ - 如何从提升图列表容器中查看顶点/边

windows - 确定给定窗口当前是否正在移动

c++ - 提示重新启动进程以获取管理权限

android - 对话框 fragment 中的自动完成 TextView 显示 Android 中的建议