创建了对话框类A(含有字符串型成员变量,与控件关联的整形变量,都为public),对话框类B(含有字符串型成员变量,与控件关联的整形变量都为public),属性表单类C(与控件关联的整形变量都为public),并将属性表单转化为向导,对话框类D,当点击A中一按钮时弹出模态对话框B,当点击B中一按钮时弹出模态对话框C,当点击C中完成按钮时弹出模态对话框D,请问如何将A,B,C中的成员变量传给D?
大家帮帮忙啊,弄了好长时间都没解决。不胜感激啊!
大家帮帮忙啊,弄了好长时间都没解决。不胜感激啊!
//灵活运用SetWindowLong和GetWindowLong
typedef struct {
int a;
TCHAR sza[256];
HWND hwnda;
WNDPROC wndproc;
}MYDATA;MYDATA * pData; //假设这个结构中包含了你所有要传递的数据。//////////////////////////////////////////////////////////
// Dialog A 把数据传给 Dialog B// 在Dialog A 中分配一块内存。pData = new MYDATA;
pData.a =...
pData.hwnda =...
... ...
pData.WndProc = wndproc;// 将该值传递给Dialog 2SetWindowLong ( hDialog2, //Dialog2 的句柄
GWL_USERDATA,
(LONG)pData);////////////////////////////////////////////////////
// 在 Dialog2 中使用 GetWindowLong 取出数据就可以了。
{
//创建窗B;
B.data = A.data;
B.ShowModal();
}按钮B
{
//创建窗C;
C.data = B.data;
C.ShowModal();
}//同理
按钮C
...
答:模态对话框可以在关闭后将值传递给紧接着打开的对话框。如将CDialog1中的值m_username传递给紧接着要打开的对话框CDialog2,在CDialog2中定义一个成员变量m_username2.
在CDialog2的OnInitDialog函数的CDialog::OnInitDialog();后面加如下代码:
CDialog1 dlg;
m_username2=dlg.m_username;
当然不要忘了头文件#include "Dialog1.h"
如果你不是将值传给紧接着后面打开的对话框,那么你可以先传给后面的,再后面的又传给它后面的,这样一步一步的就可以到达,你要传值的那个对话框。2.如何获取主对话框中的值。
答:如主对话框为CMainDlg,值为m_username1,子对话框为CSubDlg,值为m_username2:
CMainDlg *dlg= (CMainDlg*)(AfxGetApp()->GetMainWnd()); //取得主窗口线程句柄
m_username2=dlg->m_userName1;
外部数据传给对话框只要在对话框初始化完成之后,DoModal或者Create之前直接给对话框相应的数据成员赋值就行了.前提是对话框的数据成员要设置为public.
另外.自己写构造函数需要初始化基类部分的成员.
比如从CDialog继承一个类CTestDialog,并且有一个需要以外部数据初始化的成员int nExternelInit;
那么其构造函数这么写:
CTestDialog::CTestDialog(CWnd* pParent, int nExternel) : CDialog(CDialog::IDD, pParent),nExternelInit(nExterlnel)
{
//....
}
2。全局变量
3.修改对话框构造函数,用结构体传参
最简单的方法是全局变量。在A窗口中声明一个变明int g_val;在B窗口中声明外部变量extern int g_val;g_val 就可以由A窗口和B窗口访问。
比如在你的CxxApp类文件里声明变量:
CString str;
在你引用时加上代码:
CxxApp *app = (CMyApp *)AfxGetApp();
app->str = 你要用的值;app->str就可以用了