DoModal()没有将dlg盒子作为模态

时间:2010-10-26 04:16:42

标签: c++ visual-c++ mfc modal-dialog

我有一个窗口,其中包含以下属性:.rc file:

STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU

它有一个关联的类(派生自CDialog),当我实例化它时,然后调用该对象的DoModal() 它不是真正的模态 - 我可以点击“父”窗口。

CMyDlg dlg;
int result = dlg.DoModal();

“父”窗口是一个dlg框,但被视为主窗口。它的属性是:

STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "My Main App"
MENU IDR_MENU_MAIN

我从DoModal的主窗口调用的其他dlg框我想离开而不是模态。但另一个我想有模态。

我对发生的事情感到有点困惑。有人可以解释如何让这个“孩子”dlg盒子成为模态(同时允许其他“孩子”不是模态的吗?

其他信息:

此应用的GUI不是应用的主要线程。它是一个命令行应用程序,它启动另一个线程并加载包含GUI的DLL。我不确定这是否与这个问题有关。

主要dlg窗口== A. 这个新的dlg框窗口我想表现为modal == B. 一个不同的dlg框== C

在A中:调用B.DoModal不是模态的,但我希望它是 在A:调用C.DoModal不是模态的,我想保持这种方式

在C中,如果我调用D.DoModal它是模态的,我想保持这种方式(所以app确实显示模态功能)

更可怕的信息

来自A: 调用标准文件打开或保存为dlg框导致NON MODAL dlg框。

CFileDialog dlg(TRUE);
dlg.DoModal();

这也是不可取的。

这两个问题似乎对其中一个问题有一些很好的可能性,但它们没有解决如何确保标准文件打开/保存被调用的dlgs是模态的...

Convert a modeless dialog to modal at runtime How do I create Modal dialog in worker thread(Non-UI thread)?

2 个答案:

答案 0 :(得分:3)

我没有看到您为模态对话框指定了父窗口。

也许这就是缺乏的。

答案 1 :(得分:-1)

如果要从.rc文件加载对话框,请在创建对话框对象时指定资源ID。

CMyDlg dlg(IDR_DLG1); 
int result = dlg.DoModal();