我对这个问题感到茫然,甚至不确定要发布什么代码。
我有一个c ++应用程序。初始窗口具有编辑控件,自定义控件和菜单。当用户按下F5时,会打开一个带有自己的消息循环的新窗口。然后新窗口打开一个DialogBox,按预期模态。
奇怪的是,DialogBox似乎隐藏在第二个窗口后面。我必须使用alt-tab到第一个窗口,然后使用alt-tab返回到第二个窗口以进入对话框。
如果我取消DialogBox,第二个窗口将被销毁(如预期的那样),并显示一个MessageBox(如预期的那样),但该消息框似乎隐藏在第一个窗口后面。再次,我必须使用alt-tab两次才能将MessageBox放到最前面,然后就可以了。
有没有人有任何想法可能会导致DialogBox和MessageBox这种奇怪的Pop-Under行为?
谢谢!
创建对话框的代码
INT_PTR ip = DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_AMBIGUOUS),this-> hWnd,DlgAmbiguous);
DlgAmbiguous Proceduels的代码
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;
答案 0 :(得分:1)
当您打开一个窗口时,无论它是否在同一个线程上运行,指定其父窗口都是有意义的。这将强制新窗口显示在其父窗口上方。这同样适用于对话框:
INT_PTR WINAPI DialogBox(
_In_opt_ HINSTANCE hInstance,
_In_ LPCTSTR lpTemplate,
_In_opt_ HWND hWndParent,
_In_opt_ DLGPROC lpDialogFunc
);
注意第三个参数。将窗口置于最佳位置的其他选项是调用SetWindowPos
函数。