关于模态对话框和非模态对话框的创建、显示,以及和父对话框的传值

来源:互联网 发布:图文排版软件 编辑:程序博客网 时间:2024/06/05 01:18

当然网上关于这方面的技术博文非常多,此处我只是进行一下小记,再加一点自己的体会,方便以后查询。

一、模态对话框
1.创建及显示
模态对话框是一种阻塞式的对话框,即没有处理完该对话框,不能对其他地方进行操作。比如我自己项目中药输入网络流的播放url的那种对话框。它的创建很简单。

Curl_File dlg;    if (dlg.DoModal()==IDOK)    {         //do something here.    }

Curl_File是该模态对话框类,使用前应先使用类向导先创建好。

2.和父对话框传值
我只写我自己常用的方法啊。首先在该模态对话框类里面声明一个成员变量,比如我自己的CString url;再在父对话框中声明一个变量用来接收它,比如CString myurl;那么传值就很简单,直接在上面的代码if中写上myurl=dlg.url;就完事。同理,若要是从父对话框传值到该模态子对话框中,也用同样的方法。当然也还有其他的方法。

二、非模态对话框
1.创建及显示
非模态对话框和模态对话框相反,它不是阻塞型的,即你可以同时操作其他的窗口,比如父窗口。相比模态对话框来说,它可能稍微复杂点。一般创建有两种方法。采用局部变量和成员变量两种方式。
a.采用局部变量

 CTerminal *     ptty=new  CTerminal();    ptty ->Create(IDD_DIALOGtty, GetDesktopWindow()); ptty ->ShowWindow(SW_SHOWNORMAL);

其中第二句ptty ->Create(IDD_DIALOGtty, GetDesktopWindow());可以换成ptty ->Create(IDD_DIALOGtty),如果像我那样写的话是可以实现子对话框和父对话框焦点的切换的。用过MFC的人知道,非模态子对话框被弹出后焦点一直在子对话框上,当你点击父对话框 时,父对话框并不会跑到最上面显示。所以我要加一个 GetDesktopWindow()。这种方式当然是可以的,由于是局部变量,你会发现当你创建之后,回到父对话框再点击创建的按钮,又有一个子对话框被创建出来了,再点击,又弹出一个,而且我试过,彼此互不影响。原因是什么,就是因为声明的对话框指针是局部的,并不是全局的。
b.采用成员变量
首先在父对话框类中声明成员变量CTerminal * ptty;然后在动作按钮函数中写:

 ptty=new  CTerminal();    ptty ->Create(IDD_DIALOGtty, GetDesktopWindow()); ptty ->ShowWindow(SW_SHOWNORMAL);

这种方式你就会发现,如果你回到父对话框再次点击创建按钮,并没有新的子对话框被弹出来。即没有任何反应。原因就是因为对话框指针是父窗口类的成员变量,创建之后一直存在直到父窗口退出。(这里好像不对,我写完博客后又试了一下,好像也弹出了新的子对话框,具体再研究研究)

2.和父对话框的传值
由于子对话框类的指针是父类的成员函数,所以由父对话框传值到子对话框很容易,比如ptty->Str_ip=ip;那么从子对话框传值到父对话框呢?我看到网上的方法是在子对话框的cpp文件中,获取父对话框的指针,然后操作。我试了很多次没有成功,原因是当我使用CMyPlayerDlg *的转换指针的时候提示没有声明CMyPlayerDlg ,那么我之后就在头文件Terminal.h中包含了父对话框类的头文件即#include”MyPlayerDlg.h”,然后更是出现了很多的error.可能我的方法不对,或许应该在Terminal.cpp中添加#include”MyPlayerDlg.h”。具体现在我还没试,因为我后来用了另外一种方法,就没管了,现在由于已经在写其他的部分了,现在写博文只是一种回忆和整理。具体我后面再试试。

那么我的方法是采用全局变量,这里要注意,声明extern 的时候要在cpp文件中,不要在.h文件中,不信你试试!

3、销毁
当点击非模态子对话框的关闭按钮后,要在父类的析构函数中释放指针的内存空间(针对成员变量类的).

delete ptty;

此处还有一点,我再下篇博客接着写。
哎,写的很慢啊,写了一个小时了,才这么点。要去写代码了,今早必须得完成昨晚那个困扰我的问题了。

                      拙见,小记!
0 0
原创粉丝点击