如何在VC++中两个对话框相互传递信息.docx_第1页
如何在VC++中两个对话框相互传递信息.docx_第2页
如何在VC++中两个对话框相互传递信息.docx_第3页
如何在VC++中两个对话框相互传递信息.docx_第4页
如何在VC++中两个对话框相互传递信息.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何在VC+中两个对话框相互传递信息?在主对话框Main_OnCommand中,利用DialogBoxParam弹出一个新的对话框,在函数最后一个参数里传一个long型的参数?123456789101112131415case IDC_OK: HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE); /获得实例 /TCHAR *buf = abc; login_data ld; ld.username = geekgu; ld.password = 7634336; /DialogBoxParam 最后一个参数传值 ret得到返回值 int ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_LOGIN), NULL, Login_Proc,(LPARAM)&ld); if (ret = 0) MessageBox(hwnd,TEXT(用户点击了取消),TEXT(),MB_OK); 在新建对话框里初始化代码里得到参数?123456789BOOL Login_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) login_data *buf = (login_data *)lParam; /MessageBox(hwnd,buf-username,MB_OK); /SetDlgItemText(hwnd,IDC_EDITUSERNAME,buf-username); /SetDlgItemText(hwnd,IDC_EDITPASSWORD,buf-password); SetWindowLong(hwnd,GWL_USERDATA,(LPARAM)buf); /将数据跟窗口关联起来(存起来),比全局变量更好的方法。 return TRUE; 在新建对话框里取回保存的数据并实现其他功能?12345678910case IDOK: /TCHAR username255; /TCHAR password255; login_data *buf = (login_data *)GetWindowLong(hwnd,GWL_USERDATA); /取用户数据 SetDlgItemText(hwnd,IDC_EDITUSERNAME,buf-username); SetDlgItemText(hwnd,IDC_EDITPASSWORD,buf-password); break;/*在VC+中,打开对话框一般是用DoModal()函数调用模态对话框,但是模态对话框只能在对弹出的当前子窗口进行操作,而不能对父窗口进行操作,也无法传递数据到父窗口中,根据笔者的研究发现,采用非模态对话框的模式可以很好的解决这一问题。 在VS2008中新建一个就有MFC应用程序的Project项目,在弹出的MFC应用程序向导中选择“基于对话框”,取消“使用Unicode库”,单击完成。在“资源视图”里面添加一个对话框,默认ID为IDD_DIALOG1。 双击IDD_DIALOG1对话框,在弹出的MFC类向导中,类名填写CSonDialog,基类选择CDialog,单击完成。这样我们就将新建的IDD_DIALOG1关联上一个基于CDialog的类了。 在父窗口上添加一个按钮,双击,便可进入这个按钮的消息响应函数。在最上面包含CSonDialog的头文件#include “SonDialog.h”。如果在消息响应函数中写入如下代码: CSonDialog SonWnd; SonWnd.DoModal();运行之后按下父窗口上的按钮,可以发现弹出了IDD_DIALOG1,但是只能在IDD_DIALOG1上操作,无法操作父窗口。如果想要在弹出子窗口后还可以操作父窗口的话,需要采用非模态对话框的模式弹出子窗口。MFC在CDialog类中有一个Create(UINT nIDTemplate, CWnd *pParentWnd = 0),这个函数可以创建一个Dialog,其中参数nIDTemplate为需要创建的Dialog的ID。同时还有一个函数ShowWindow(int nCmdShow),用来显示创建的这个Dialog。在消息响应函数中写入如下代码:CSonDialog SonWnd;SonWnd.Create(IDD_DIALOG1);SonWnd.ShowWindow(SW_SHOW);运行之后按下父窗口上的按钮发现窗口闪了一下,然后就消失了。这是因为对象SonWnd是一个局部对象,在运行完SonWnd.ShowWindow(SW_SHOW)这条语句之后便退出了消息响应函数,因此SonWnd对象也就被销毁了。如果想要退出消息响应函数之后窗口依然存在,则需要将SonWnd定义为一个全局变量。因此在ProjectDlg.h中添加一个CSonDialog SonWnd的定义,同时由于VC+在编译的时候预编译头文件,因此还需要在ProjectDlg.h中包含CSonDialog的头文件#include “SonDialog.h”,这样在ProjectDlg.cpp中,便可以把SonDialog.h删掉了。然后在按钮的消息响应函数中添加如下代码:SonWnd.Create(IDD_DIALOG1);SonWnd.ShowWindow(SW_SHOW);我们发现IDD_DIALOG1被创建出来,并且一直保留着。但是还是无法和父窗口进行数据交流。根据查找资料我们发现在C+中有一个指针很特别,它指向的是当前窗口,这个指针就是this指针。我们通过传递this指针来相互调用对方的数据。在CSonDialog类中,我们添加一个指向父窗口的全局指针变量CProjectDlg *m_pFaher,同时添加一个函数WndCreate(CProjectDlg *pParent),代码如下:void CSonDialog:WndCreate(CProjectDlg *pParent) Create(IDD_DIALOG1); /创建对话框 ShowWindow(SW_SHOW); /显示对话框 m_pFather = pParent; /将父窗口指针传递进来这个函数中调用了CDialog类中的Create()和ShowWindow()函数来创建和显示对话框,同时采用参数传递的办法将父窗口的指针传递到子窗口中。而在父窗口ProjectDlg.cpp的消息响应函数中,我们添加如下代码:SonWnd.WndCreate(this);编译运行之后发现有错,因为在ProjectDlg.h的头文件中包含了SonDialog.h,而在SonDialog.h中又包含了ProjectDlg.h,这样程序在进行编译的时候就会出现头文件重复包含的错误,有两种办法可以解决此问题。第一种办法是在两个头文件中分别加入预编译命令#ifndef #define #endif命令,在SonDialog.h最上面加入#ifndef SONDIALOG#define SONDIALOG最下面加入#endif在ProjectDlg.h最上面加入#ifndef RPOJECTDLG#define PROJECTDLG最下面加入#endif以上语句块的意思是如果SONDIALOG/PROJECTDLG没有被定义的话,那么就定义SONDIALOG/PROJECTDLG,如果SONDIALOG/PROJECTDLG被定义的话,直接跳转到#endif,这样就可以很好的避免被重复定义的情况。这种方法我在以前编程的时候很好用,但是不知道为什么最近几次写程序这种方法都失效了,于是我又想出了另外一种办法。第二种办法的原理是采取避免在头文件中定义具体类型的指针变量,用定义空指针的方法绕过头文件重复包含的问题。由于在父窗口中,指向子窗口的对象必须是全局变量,这样才能保证子窗口在销毁之前一直有显示。因此在父窗口ProjectDlg.h中不得不包含SonDialog.h的头文件,这样就只能在SonDialog.h中想办法了。其实仔细想来我们发现在SonDialog.h中只要定义一个空指针就可以解决问题。具体方法如下:在SonDialog.h不包含ProjectDlg.h头文件,也不定义CProjectDlg的对象,而是定义一个空指针LPVOID m_pFather,将WndCreate()函数的参数改为LPVOID pPaernt,然后在WndCreate()函数中添加如下代码:void CSonDialog:WndCreate(LPVOID pParent) Create(IDD_DIALOG1); /创建对话框 ShowWindow(SW_SHOW); /显示对话框 m_pFather = pParent; /将父窗口指针传递进来这样,父窗口的this指针传递进来之后到m_pFather还是一个指向任意对象的指针,只要在SonDialog.cpp的函数中需要调用父窗口中的函数或者是改动父窗口的某些变量时,在cpp文件中包含头文件ProjectDlg.h,在函数开始时加入代码:CProjectDlg *Main;Main = (CProjectDlg *)m_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论