You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CDialog中添加CComboBox?解决断言失败问题

解决CComboBox添加字符串时ASSERT(::IsWindow(m_hWnd))断言失败问题

问题根源

  • 控件变量未与实际控件绑定:你的DoDataExchange函数仅用DDX_CBIndex绑定了选中索引变量,但未将m_comboBox与对话框上的ComboBox控件ID(IDC_FEEDBACK_DIALOG_COMBO)关联,导致m_comboBox的窗口句柄未初始化。
  • OnInitDialog未调用基类实现:重写的OnInitDialog跳过了CDialog::OnInitDialog(),基类函数负责完成对话框及控件的窗口创建流程,缺失它会导致控件窗口未就绪。
  • 错误时机调用AddString:在DoDataExchange中调用AddString完全错误,该函数仅用于数据交换,此时控件窗口还未创建。

正确实现步骤

  1. 绑定控件变量:在DoDataExchange中添加DDX_Control语句,关联m_comboBox与控件ID:
void FeedbackDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);

    DDX_Control(pDX, IDC_FEEDBACK_DIALOG_COMBO, m_comboBox); // 添加控件绑定
    DDX_CBIndex(pDX, IDC_FEEDBACK_DIALOG_COMBO, m_comboSelectedIndex);
    // 移除此处的m_comboBox.AddString调用
}
  1. 修正OnInitDialog:先调用基类OnInitDialog确保控件窗口创建完成,再添加下拉选项:
BOOL OnInitDialog() override
{
    CDialog::OnInitDialog(); // 必须先执行基类初始化

    m_comboBox.AddString(L"Super item");
    // 可继续添加更多选项
    m_comboBox.AddString(L"Item 2");
    m_comboBox.AddString(L"Item 3");

    // 可选:设置默认选中项
    m_comboBox.SetCurSel(0);

    return TRUE;
}
  1. 清理错误代码:删除DoDataExchange中的m_comboBox.AddString(L"Super item");语句。

流程说明

对话框模态创建流程为:构造函数 → DoDataExchange完成数据/控件绑定 → OnInitDialog执行初始化。此时OnInitDialog中调用AddString时,控件窗口已完全创建,不会触发断言失败。

内容的提问来源于stack exchange,提问作者qloq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:43:19