我遇到了有关在两个对话框之间获取变量的问题 我尝试在下面构建简单的项目:
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
请帮我解决问题。非常感谢。
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;**
}