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

MFC/C++中从另一个对话框类获取变量的问题

MFC对话框间获取变量问题的解决方案

问题根源

你在DialogChild::GetDataDemoAppMFC()中新建了一个全新的CDemoAppMFCDlg实例,这和已经显示在界面上的主对话框是完全独立的两个对象。新实例的OnInitDialog方法没有被框架调用(仅当对话框实际显示时才会触发),导致FillDataToArray从未执行,arrData自然为NULL。

解决方案

方案1:通过父窗口指针获取原主对话框对象

由于DialogChild是由主对话框弹出的,它的父窗口指针就是主对话框的实例,直接类型转换即可访问原数据:

修改DialogChild.cpp中的GetDataDemoAppMFC函数

void DialogChild::GetDataDemoAppMFC()
{
    // 安全转换父窗口指针为主对话框类型
    CDemoAppMFCDlg* pMainDlg = dynamic_cast<CDemoAppMFCDlg*>(GetParent());
    if (pMainDlg != nullptr)
    {
        CStringArray* getData = pMainDlg->arrData;
        // 在此处使用getData中的数据,例如遍历输出
        for (int i = 0; i < getData->GetSize(); ++i)
        {
            CString item = getData->GetAt(i);
            // 处理逻辑
        }
    }
}

主对话框中弹出子对话框时传入父窗口指针

确保在主对话框的OK按钮响应中,将this作为父窗口参数传入:

void CDemoAppMFCDlg::OnOK()
{
    DialogChild dlg(this); // 传递主对话框指针作为父窗口
    dlg.DoModal();
    // 若不想关闭主对话框,注释掉默认的CDialog::OnOK()
    // CDialog::OnOK();
}

方案2:构造函数直接传递数据指针

通过子对话框的构造函数直接接收主对话框的数据指针,逻辑更清晰:

修改DialogChild.h

class DialogChild : public CDialog
{
    DECLARE_DYNAMIC(DialogChild)

public:
    // 新增参数接收主对话框的数据数组指针
    DialogChild(CStringArray* pMainData, CWnd* pParent = NULL);
    virtual ~DialogChild();

private:
    CStringArray* m_pMainData; // 存储主对话框的数据指针

protected:
    virtual void DoDataExchange(CDataExchange* pDX);

    DECLARE_MESSAGE_MAP()
};

修改DialogChild.cpp

DialogChild::DialogChild(CStringArray* pMainData, CWnd* pParent /*=NULL*/)
    : CDialog(DialogChild::IDD, pParent), m_pMainData(pMainData)
{
    // 可直接在构造函数或其他方法中使用m_pMainData
}

// 示例:在子对话框初始化时访问数据
BOOL DialogChild::OnInitDialog()
{
    CDialog::OnInitDialog();

    if (m_pMainData != nullptr)
    {
        // 遍历数据示例
        for (int i = 0; i < m_pMainData->GetSize(); ++i)
        {
            CString item = m_pMainData->GetAt(i);
            // 处理数据
        }
    }

    return TRUE;
}

主对话框中调用子对话框

void CDemoAppMFCDlg::OnOK()
{
    DialogChild dlg(arrData, this);
    dlg.DoModal();
}

优化建议

  • 遵循封装原则:将arrData设为private,提供public访问方法(如CStringArray* GetDataArray() const),避免直接暴露成员变量。
  • 避免内存泄漏:在主对话框的析构函数中释放arrData的内存:
    CDemoAppMFCDlg::~CDemoAppMFCDlg()
    {
        delete arrData;
    }
    
  • 使用现代容器:考虑用std::vector<CString>替代CStringArray,更符合现代C++规范,且无需手动管理内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:22:47