如何在无模式对话框中模拟模态对话框UI行为?

时间:2014-11-05 08:47:00

标签: winapi mfc

是否有一种简单的方法可以在保留阻止模式对话框提供的UI的同时无模式显示对话框?

我希望在显示对话框时停止用户与其他对话框/控件交互,但让应用程序继续运行。有没有办法将对话框设置为"独占焦点"或类似的东西?

3 个答案:

答案 0 :(得分:2)

不,没有简单的方法可以做你想做的事。

如果你真的想要走上你描述的路线,我建议先阅读Raymond Chen博客上的整个'模态'系列。第一期是http://blogs.msdn.com/b/oldnewthing/archive/2005/02/18/376080.aspx

但是,这似乎是XY问题的一个实例。你想做什么?获取主要应用程序以继续更新?如果是这样,我认为(根据我们给出的信息)调用AfxPumpMessage()将做你想要的。或者您想继续处理主应用程序中的数据?然后,你将通过使用工作线程来拯救自己一个受伤的世界。

答案 1 :(得分:1)

未经测试,但您可以尝试禁用所有者窗口(应用程序主窗口),创建无模式对话框,然后在关闭对话框时再次启用它:

要禁用主窗口:

AfxGetMainWnd()->EnableWindow(FALSE);

创建模态/非阻止对话框:

dlg->Create(resId)

再次启用它,OnClose事件或类似事件:

AfxGetMainWnd()->EnableWindow(TRUE);

模态对话框中可能还有其他细节,我不知道。如果您愿意调查,请阅读MFC CDialog::DoModal()的源代码。如果我没记错的话,这个MFC函数使用无模式Win32 API CreateDialog*()模拟模态阻塞对话框,以实现全局加速器,挂钩,消息等。

答案 2 :(得分:-1)

以下是您的问题的可能答案:

您可以禁用应用程序中的所有其他控件,然后在对话框完成后重新启用它们。

使用此回调

BOOL CALLBACK EnableDisableAllChildren ( HWND hwnd, LPARAM lp ) 
{
    ::EnableWindow ( hwnd, (BOOL)lp );

    return TRUE;
}

致电

  EnumChildWindows ( HWNDToYourApp, EnableDisableAllChildren, true );

执行Modaless对话

  EnumChildWindows ( HWNDToYourApp, EnableDisableAllChildren, false );  

想一些不同的东西。