使用 DoModal 调用时,对话框不显示 CListBox 内容

Posted

技术标签:

【中文标题】使用 DoModal 调用时,对话框不显示 CListBox 内容【英文标题】:Dialog box does not show CListBox Contents when called with DoModal 【发布时间】:2014-11-13 21:53:14 【问题描述】:

我正在尝试初始化一个包含 CListBox 的 CDialog 框。我想通过在 CDialogBox 上调用 DoModal 来做到这一点。但是问题是当我调用 DoModal 时,对话框打开,但 CListBox 是空的。 (它的项目已经初始化) 当我调用 ShowWindow(SW_SHOW) 时,还会显示对话框,并且 CListBox 包含我插入其中的项目。但是,我不想使用这种方法,因为它不会暂停程序的执行。 (DoModal 暂停程序执行,直到窗口关闭)

所以我的问题是:如何使用 DoModal 打开对话框,并让 CListBox 显示其内容? 非常感谢。

初始化 CDialog 子类,并调用 start(打开对话框)

loadNewWorld = new LoadNewWorld(this);
loadNewWorld->Create(IDD_LOAD_NEW_WORLD , this);
loadNewWorld->Start();

LoadNewWorld 类:

//Constructor header
LoadNewWorld::LoadNewWorld(CWnd* pParent /*=NULL*/) : CDialog(LoadNewWorld::IDD, pParent)

//This shows the dialog box, but does NOT show the items in CListBox
    void LoadNewWorld::Start ()
    
        populateList();
        DoModal();
    

//This shows the dialog box AND shows the populated CListBox. However, don't want to do this way
    void LoadNewWorld::Start ()
    
        populateList();
        ShowWindow(SW_SHOW);
    

【问题讨论】:

对话可以无模式(使用Create)或模态(使用DoModal)创建。这些方法不能混用。此外,如果您要使用DoModal,则列表框的填充必须在其OnInitDialog 处理程序中完成,即。创建对话框和列表框窗口之后。 【参考方案1】:

在对话框启动并创建时填充列表视图。

当没有创建对话框时,您不能填充列表框。执行此操作的最佳位置是 OnInitDialog。您的问题是您想在创建列表框之前填充它(在调用 DoModal 之前)。

正如注释已经告诉你的那样:你不能混合使用 DoModal 和 Create。

【讨论】:

以上是关于使用 DoModal 调用时,对话框不显示 CListBox 内容的主要内容,如果未能解决你的问题,请参考以下文章

如何准确找到调用了哪个类 DoModal() ?

如何初始化模态对话框? (C++/MFC)

当 CDialog.DoModal() 函数无法创建对话框时?

临界区中的 DoModal

MFC(C++)CDialog DoModal()没有按预期工作

我的 IE 在另一个新对话框的 EndDialog 和 DoModal 上崩溃