MFC ::使用结构传递数据

时间:2012-01-21 02:42:51

标签: c++ inheritance mfc dialog

所以我正在使用这个MFC对话框程序。对话框已写入,但现在我无法将数据从对话框传递到对话框。我在从CWinApp派生的类中设置了以下结构_dlgDataHandler,并为指向此类型的指针创建了一个“new”语句。

// ....... SRK.h文件

class CSRK_App : public CWinApp
    {
public:

    CFSB_App();

     // added the following data structure for data passing withing the program

    typedef struct _dlgDataHandler {
      char RepetitionRadio[24];
          // another member
          // yet another member and so on as necessary
    } *dlgDataHandlerPtr;

      // extern dlgDataHandlerPtr dlgDataHandler;

// Overrides
     // ClassWizard generated virtual function overrides
     //{{AFX_VIRTUAL(CSRK_App)
     public:
     virtual BOOL InitInstance();
     //}}AFX_VIRTUAL

// Implementation

    //{{AFX_MSG(CSRK_App)
    // NOTE - the ClassWizard will add and remove member functions here.
        //    DO NOT EDIT what you see in these blocks of generated code !
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
 }; 

// ....... SRK.cpp指向在此块中创建的新dataHandler约2/3的指针

// CSRK_App initialization

BOOL CSRK_App::InitInstance()
{
AfxEnableControlContainer();

// Standard initialization
// If you are not using these features and wish to reduce the size
//  of your final executable, you should remove from the following
//  the specific initialization routines you do not need.
//SetRegistryKey(_T("Local AppWizard-Generated Aplications"));

#ifdef _AFXDLL
Enable3dControls();         // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic();   // Call this when linking to MFC statically
#endif

//CSRK_Dlg dlg;
CDialogMain dlg("SRK - Beta");    // added 12/27 **
m_pMainWnd = &dlg;

//const char* m_pszHelpFilePath = NULL;
//free((void*)m_pszHelpFilePath);
//m_pszHelpFilePath=_tcsdup(_T("c:\SRKHelp.rtf"));

// the following line added to allocate memory for the structure
    dlgDataHandlerPtr dlgDataHandler = new _dlgDataHandler;

dlg.SetWizardMode();          // added 12/27 **
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
    // TODO: Place code here to handle when the dialog is
    //  dismissed with OK
}
else if (nResponse == IDCANCEL)
{
    // TODO: Place code here to handle when the dialog is
    //  dismissed with Cancel
}

// Since the dialog has been closed, return FALSE so that we exit the
//  application, rather than start the application's message pump.
return FALSE;
}

在对话框.cpp文件中,有五个,我需要能够从AFX变量“m_”获取数据并将它们加载到这个dataHandler Structure(或其他类似的)中,以便它们可以用于其他对话框和程序的各个部分,特别是完成所有对话框数据收集后的实际代码。有人说使用AfxGetApp()以便我可以处理当前实例,但我不明白他们在说什么。是的,我在许多论坛上都读到了它,我只是不明白。我进一步意识到这可能不是最好的方法。我正在尝试学习MFC / OOP,但是现在,我只是试图处理基本过程,因为我可以在稍后了解如何收集和传递简单数据后对其进行调整。

我还不明白如何调用AfxGetApp()来帮助我处理CSRK_App的成员。它继承了CWinApps公共成员,但AfxGetapp()无法看到CSRK_App有什么......可以吗?

1 个答案:

答案 0 :(得分:3)

首先,解释您收到的AfxGetApp建议。使用'new'和指针有一些额外的挥手,但这基本上是使用全局变量来保存数据的结构。这不是做你想做的事情的最佳方式。有很多陷阱。

AfxGetApp()是一个MFC调用,它返回一个指向从CWinApp派生的主App类的指针。 如果要使用返回的指针,则需要将其作为CSRK_App *指针强制转换为:

CSRK_App* pApp = static_cast <CSRK_App*> ( AfxGetApp());

然后你可以使用pApp-&gt; dlgDataHandlerPtr-&gt; ...来访问你需要的变量。

现在,对于陷阱。其他人可能会因为'new'和指针有用而引起反响,但与在CSRK_App类中只有一个局部变量dlgDataHandler相比,我认为这种方法没有任何优势。这样可以简化代码。

下一个问题是所有数据在结构中都是公共的。任何可以调用AfxGetApp的对话框类都可以读取或写入该结构中的任何数据。您无法控制访问权限。

此外,所有对话框类现在必须包含SRK_App.h,以便他们知道结构,并且可以访问该App类中的所有其他变量。

更简洁,面向对象的方法是在单独的.h文件中声明数据的结构(类),该文件可以包含在对话框类中。然后,您将对此数据的指针/引用传递到对话框类的构造函数中。对话框类不需要知道关于App类的任何信息。

对于更高级别的隔离,可以编写对话框类,这样它们只能获得在调用.DoModal()之前传入的dlgDataHandler类的副本,然后在DoModal调用返回IDOK之后,App类可以控制对话框中的哪些数据更新到dlgDataHandler类。这种方法的优点在于它确保无论对话类如何编程,用户始终可以“取消”对话框而无需修改任何数据。