首先,全局化控件关联的成员变量是不推荐的,因为控件、对话框的生命周期是很难控制的。因此,最好是通过应用需求,通过对实例的公有成员来引用。
三种情况区别对待。情况一,CString 所在的Dlg是非模态Dlg,且已经成功创建
DialogA.h
class CDialogA: public CDialog
{
public:
CString
m_strVal;
};
DialogB.cpp
#include "DialogA.h"
...
CDialogB::func(...)
{
CDialogA
* pDlgA = 获取指向DialogA实例的指针
pDlgA->m_strVal
= "Hello";
pDlgA->UpdateData(FALSE);//显示控件上
}
情况2,CDialogA实例是模态对话框,另一个对话框由CDialogA实例弹出,则可以这样:
DialogA.h
#include "DialogB.h"
class CDialogA: public CDialog
{
public:
CString
m_strVal;
CDialogB
m_dlgB;
...
};
DialogA.cpp
...
void OnButtonPopupDlgB(...)
{
m_dlgB.m_pstrVal
= &m_strVal;
if
(m_dlgB.DoModal()==IDOK)
UpdateData(FALSE);
else
UpdateData();
}
DIalogB.h
class CDialogB: public CDialog
{
public:
CString *
m_pstrVal;
};
第三个情况,相反,就是由B弹出A,则可
DialogB.cpp
...
void OnButtonPopupDlgA(...)
{
CDialogA
dlg;
dlg.m_strVal
= "Haee";
dlg.DoModal();
...
}
当然,为了在初始化的时候刷新控件,各个 Dialog的OnInitialDialog方法都要UpdateData(FALSE)
三种情况区别对待。情况一,CString 所在的Dlg是非模态Dlg,且已经成功创建
DialogA.h
class CDialogA: public CDialog
{
public:
};
DialogB.cpp
#include "DialogA.h"
...
CDialogB::func(...)
{
}
情况2,CDialogA实例是模态对话框,另一个对话框由CDialogA实例弹出,则可以这样:
DialogA.h
#include "DialogB.h"
class CDialogA: public CDialog
{
public:
...
};
DialogA.cpp
...
void OnButtonPopupDlgB(...)
{
}
DIalogB.h
class CDialogB: public CDialog
{
public:
};
第三个情况,相反,就是由B弹出A,则可
DialogB.cpp
...
void OnButtonPopupDlgA(...)
{
...
}
当然,为了在初始化的时候刷新控件,各个 Dialog的OnInitialDialog方法都要UpdateData(FALSE)
本文探讨了在对话框间通信时如何有效管理生命周期,包括非模态对话框、模态对话框以及对话框间相互调用时的通信策略。通过实例分析,展示了如何在不同的场景下使用公有成员变量进行对话框实例间的引用。

1165

被折叠的 条评论
为什么被折叠?



