MFC中不同数值传递

新建一个就有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_pFather;                                      //强制将LPVOID类型转换
       Main->
       就可以通过指针Main来对父窗口进行操作。这样就可以实现两个对话框中的信息相互传递了。
       另外在建立非模态对话框的时候要注意,重写OnOk()和OnCancel()两个函数,要在里面加入DestoryWindow()函数,OnOk()和OnCancel()函数里面并没有销毁窗口,而是使得窗口不可见,如果不销毁窗口,在下一次再次打开子窗口时,就会出现错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 MFC 客户端和服务端之间传递图片,可以使用以下步骤: 1. 在客户端选择要传递的图片,并将其转换为字节组。 2. 将字节组传递给服务端,可以使用 TCP 或 UDP 协议。 3. 在服务端接收字节组,并将其转换回图片格式。 4. 将图片保存到服务端的文件系统,或者将其转发给其他客户端。 下面是一个简单的示例代码,展示了如何在 MFC 客户端和服务端之间传递图片: MFC 客户端: ```c++ // 选择要传递的图片 CFileDialog dlg(TRUE); if (dlg.DoModal() == IDOK) { // 加载图片并转换为字节组 CImage image; image.Load(dlg.GetPathName()); CByteArray byteArray; IStream* pStream = image.GetEncoderClsid(); image.Save( CComPtr<IStream>(pStream), pStream->GetClsid(), NULL ); BYTE *pData = NULL; ULONG nSize = 0; pStream->Seek( {0}, STREAM_SEEK_SET, NULL ); STATSTG statstg = {0}; pStream->Stat( &statstg, STATFLAG_NONAME ); nSize = statstg.cbSize.QuadPart; pData = new BYTE[nSize]; pStream->Read( pData, nSize, NULL ); byteArray.SetSize(nSize); memcpy(byteArray.GetData(), pData, nSize); // 发送字节组到服务端 // ... } ``` MFC 服务端: ```c++ // 接收字节组 // ... // 将字节组转换为图片格式 CByteArray byteArray; // ... CImage image; IStream* pStream = image.GetEncoderClsid(); pStream->Write(byteArray.GetData(), byteArray.GetSize(), NULL); image.Load( CComPtr<IStream>(pStream) ); // 保存图片到文件系统或者转发给其他客户端 // ... ``` 注意事项: 1. 在传递字节组时,需要考虑据的大小和传输的可靠性。 2. 在转换图片格式时,需要使用正确的编解码器,以确保图像质量和文件大小的平衡。 3. 在保存图片到文件系统或者转发给其他客户端时,需要考虑安全性和权限问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值