使焦点无模式对话最顶层

时间:2017-09-26 06:22:21

标签: c++ mfc modeless-dialog

所以我的主对话框通过这个函数调用无模式对话框(这是项目中的遗留代码):

registerNewConstraint

问题:所有子对话框都保留在我的主对话框之上 期望的行为:无论哪个是(它们都是无模式的),无论是主对话框还是子对话框,我希望它成为最顶层的对话框。谢谢!

注意:我已尝试使用我的主对话框void MyClass::ShowDialog(CDialog* dialog) { if (!IsWindow(dialog->m_hWnd)) { return; } int nCmdshow1 = dialog->IsWindowVisible() ? SW_HIDE : SW_SHOW; dialog->ShowWindow( nCmdshow1 ); } 这些但是没有工作:
1. OnInitDialog()
2。SetWindowPos(&this->wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

修改
此外,子对话框以这种方式创建:
SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

1 个答案:

答案 0 :(得分:0)

只要两个窗口之间存在所有者关系。窗口的所有者永远不会位于拥有的窗口之上。

所有者,父级,子级关系中的Windows始终表现相同。拥有/子窗口始终位于父/所有者之上。

如果你想打破这个,你必须打破所有者/子关系。让所有对话窗口都没有所有者......而不是它们可以自由浮动。

但是:我希望你的程序表现不好。更糟。用户可能会搜索其他窗口下方深处的窗口。当你的程序活跃起来时,他们永远不会站在前面。

See the description about parent/child/owned windows here。此article也许有用。

编辑:问题是如果没有给出父级,MFC内部会将主窗口设置为所有者。只有对BOOL Wnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd, HINSTANCE hInst)的调用才允许将pParentWnd保留为NULL。

因此您可以正常创建窗口,但在创建后使用SetParent(NULL)。 MFC再次提出这个问题。因此,您可以使用API​​函数和对话框的句柄。