所以我正在使用这个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有什么......可以吗?
答案 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类。这种方法的优点在于它确保无论对话类如何编程,用户始终可以“取消”对话框而无需修改任何数据。