对话框位于错误的位置

Dialog in wrong place

本文关键字:位置 错误 于错误 对话框      更新时间:2023-10-16

我对这个问题不知所措,甚至不确定要发布什么代码。

我有一个 c++ 应用程序。初始窗口具有编辑控件、自定义控件和菜单。当用户按 F5 时,将打开一个新窗口,其中包含自己的消息循环。然后,新窗口将打开一个对话框,并且按预期是模式的。

奇怪的是对话框似乎隐藏在第二个窗口后面。我必须按 alt-tab 键转到第一个窗口,然后按 alt-tab 键返回第二个窗口才能进入对话框。

如果我取消对话框,第二个窗口将被销毁(如预期的那样),并显示一个消息框(如预期),但该消息框似乎隐藏在第一个窗口后面。同样,我必须按 alt-tab 两次才能将消息框放在最前面,并且确定它。

有没有人知道什么会导致对话框和消息框出现这种奇怪的弹出行为?

谢谢!

用于创建对话框的代码

INT_PTR ip = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_AMBIGUOUS), this->hWnd, DlgAmbiguous);

Dlg模棱两可的过程

的代码
INT_PTR CALLBACK DlgAmbiguous(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        {
            HWND hStaticTerm = GetDlgItem(hDlg, IDC_TERM);
            SetWindowText(hStaticTerm, lpAmbiguousTerm);
            if (wcscmp(lpAmbiguousTerm, L"canvas") == 0)
            {
                HWND hComboBox = GetDlgItem(hDlg, IDC_MEANING);
                SendMessage(hComboBox, CB_ADDSTRING, NULL, reinterpret_cast<LPARAM>(_T("Program Window")));
                SendMessage(hComboBox, CB_ADDSTRING, NULL, reinterpret_cast<LPARAM>(_T("Region in Program Window")));
            }
            return (INT_PTR)TRUE;
        }
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK)
        {
            HWND hComboBox = GetDlgItem(hDlg, IDC_MEANING);
            iAmbiguousResult = SendMessage(hComboBox, CB_GETCURSEL, NULL, NULL);
            EndDialog(hDlg, iAmbiguousResult + 100);
            return (iAmbiguousResult == -1) ? FALSE : TRUE;
        }
        else if (LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, DLG_CANCEL);
            return (INT_PTR)FALSE;
        }
        break;
    }
    return (INT_PTR)FALSE;

打开窗口时,无论它是否在同一线程上运行,指定其父窗口都是有意义的。这将强制新窗口出现在其父窗口上方。这同样适用于对话框:

INT_PTR WINAPI DialogBox(
  _In_opt_  HINSTANCE hInstance,
  _In_      LPCTSTR lpTemplate,
  _In_opt_  HWND hWndParent,
  _In_opt_  DLGPROC lpDialogFunc
);

请注意第三个参数。将窗口置于顶部的其他选项是调用 SetWindowPos 函数。