从另一个类表单对话框 MFC/C++ 获取变量

问题描述 投票:0回答:1

我遇到了有关在两个对话框之间获取变量的问题 我尝试在下面构建简单的项目:

DemoAppMFCDlg.h
class CDemoAppMFCDlg : public CDialog
{
// Construction
public:
    CDemoAppMFCDlg(CWnd* pParent = NULL);   // standard constructor
    void FillDataToArray();
public:
    CStringArray* arrData;
// Dialog Data
    enum { IDD = IDD_DEMOAPPMFC_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
...
};

DemoAppMFCDlg.cpp
BOOL CDemoAppMFCDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    FillDataToArray();
    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);         // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here

    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CDemoAppMFCDlg::FillDataToArray()
{
    arrData = new CStringArray();
    arrData->Add(L"A");
    arrData->Add(L"B");
    arrData->Add(L"C");
    arrData->Add(L"D");

}

现在 DemoAppMFCDlg 正在显示,如果我单击其上的“确定”按钮,DialogChild 将显示 这是DialogChild的代码

DialogChild.h
#pragma once
#include "Resource.h"
// DialogChild dialog

class DialogChild : public CDialog
{
    DECLARE_DYNAMIC(DialogChild)

public:
    DialogChild(CWnd* pParent = NULL);   // standard constructor
    virtual ~DialogChild();

    void GetDataDemoAppMFC();

// Dialog Data
    enum { IDD = IDD_DIALOG_CHILD };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    DECLARE_MESSAGE_MAP()
};

// DialogChild.cpp : implementation file
//

#include "stdafx.h"
#include "DemoAppMFC.h"
#include "DemoAppMFCDlg.h"
#include "DialogChild.h"
#include "afxdialogex.h"


// DialogChild dialog

IMPLEMENT_DYNAMIC(DialogChild, CDialog)

DialogChild::DialogChild(CWnd* pParent /*=NULL*/)
    : CDialog(DialogChild::IDD, pParent)
{
    GetDataDemoAppMFC();
}

void DialogChild::GetDataDemoAppMFC()
{
    **CDemoAppMFCDlg *cdemo = new CDemoAppMFCDlg();
    CStringArray* getData = cdemo->arrData;**
}
DialogChild::~DialogChild()
{
}

void DialogChild::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(DialogChild, CDialog)
END_MESSAGE_MAP()


// DialogChild message handlers

如您所知,初始化CDemoAppMFCDlg后,我通过调用FillDataToArray()函数将数据填充到arrData,初始化DialogChild后,调用GetDataDemoAppMFC()函数来获取arrData的值。 我知道我应该将 arrData 置于私有模式,但是我也尝试将其置于公共模式以直接访问,但它的值返回 NULL

请帮我解决问题。非常感谢。

c++ mfc
1个回答
0
投票

WINAPI 带有很多黑魔法(低级操作)。 MFC 和 MSVC 向导尽最大努力向程序员隐藏这些内容,但您仍然必须遵守一项主要规则:按预期用途使用 MFC 类。我强烈建议您按照 Microsoft (MSDN) 教程来学习您的第一个 MFC 应用程序:您不会真正理解如何以及为什么,但它们应该可以工作。

这里您面临的直接问题是初始化

CDemoAppMFCDlg::OnInitDialog
中的数据。当底层 (WINAPI) 窗口初始化时,通过框架调用它。但由于您只创建 MFC 类的实例,因此永远不会发生此初始化。您必须意识到 MFC 类旨在用作底层 WINAPI 对象的包装器,这就是为什么您应该仅通过其特殊方法创建它们的原因。

在这里,您应该创建一个新的

CDemoAppMFCDlg
,但(假设它是主窗口)使用
AfxGetMainWnd
来获取指向现有实例的指针:

void DialogChild::GetDataDemoAppMFC()
{
    CDemoAppMFCDlg *cdemo = (CDemoAppMFCDlg) AfxGetMainWnd();
    CStringArray* getData = cdemo->arrData;**
}
© www.soinside.com 2019 - 2024. All rights reserved.