无模式对话框的创建与使用

在编程过程中,对话框经常用到,但对无模式和模式对话框的创建和销毁过程,经常有误解,下面提供一个无模式对话框的例子来剖析无模式对话框的形成:

无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口。创建无模式对话框需要调用BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用BOOL CDialog::ShowWindow( SW_SHOW);进行显示,否则无模式对话框将是不可见的。相关代码如下:

void CYourView::OnOpenDlg(void)
{
/*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/
CTestDlg *dlg=new CTestDlg;
dlg->Create(IDD_TEST_DLG,NULL);
dlg->ShowWindows(SW_SHOW);
/*不要调用 delete dlg;*/
}

在上面的代码中我们新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁),而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。我时常使用的方法有两个:

在对话框退出时销毁自己:在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下:

void CTestDlg1::OnOK()
{
CDialog::OnOK();
DestroyWindow();
}
void CTestDlg1::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
void CTestDlg1::OnDestroy()
{
CDialog::OnDestroy();
AfxMessageBox("call delete this");
delete this;
}

这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的调用会引起OnDestroy()的调用) 通过向父亲窗口发送消息,要求其他窗口对其进行销毁:首先需要定义一个消息用于进行通知,然后在对话框中映射WM_DESTROY消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下:

/*更改对话框的有关文件*/
CTestDlg2::CTestDlg2(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg2::IDD, pParent)
{
/*m_pParent为一成员变量,用于保存通知窗口的指针,
所以该指针不能是一个临时指针*/
ASSERT(pParent);
m_pParent=pParent;
//{{AFX_DATA_INIT(CTestDlg2)
 // NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CTestDlg2::OnOK()
{
CDialog::OnOK();
DestroyWindow();
}
void CTestDlg2::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
void CTestDlg2::OnDestroy()
{
CDialog::OnDestroy();
/*向其他窗口发送消息,将自身指针作为一个参数发送*/
m_pParent->PostMessage(WM_DELETE_DLG,(WPARAM)this);
}

时间: 2024-11-19 08:39:22

无模式对话框的创建与使用的相关文章

MFC如何获得一个无模式对话框的指针

问题描述 MFC如何获得一个无模式对话框的指针 我在创建一个无模式对话框的时候,想实现不关闭对话框也能向视图中发送数据的功能. 我是在对话框里弄了一个按钮,然后在这个按钮的响应函数中发送一个自定义消息,这个自定义消息响应函数是在**CxxxView**类里定义的,要想把数据发送过来,需要对话框的指针,请问如何获得这个对话框的指针? 我查过一些资料,试过**GetParent()**,但是用这个的时候,我的程序画出来的图像完全不对.. 代码如下:**CNPenDlg NPenDlg=(CNPenD

c++问题-vc++无模式对话框显示问题

问题描述 vc++无模式对话框显示问题 对话框架构下,在CWinApp派生类的InitInstance函数中,启动对话框之前,构造了另一个只含有进度条和文本框的对话框,用来显示加载数据的进度.此对话框为无模式对话框,初始显示正常,但一旦最小化,再还原后,进度条和文本框均无法显示,背景也变为白色.对话框架构下,再使用一个无模式对话框确实比较另类,所以遍查不到解决方法,恳请哪位高手帮忙! 解决方案 http://blog.163.com/guo_ahui/blog/static/4465088320

IE中ocx控件的无模式对话框不接收方向键等键盘消息的问题的解决办法

在ocx控件中如果含有无模式对话框,那么当ocx在ie中显示时,往往接收不到 诸如tab,方向键和退格键.所有这些消息都被IE容器给截取了,对于这个问题,ms给出了解决方法: 首先:   int CMyActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)   {      if (COleControl::OnCreate(lpCreateStruct) == -1)         return -1;      OnActivateInPl

MFC应用程序中处理消息的顺序,创建窗口的过程关闭窗口的顺序(非模态窗口),打开模式对话框的函数调用顺序

MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,                    然后调用WindowProc()函数 3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.O

关于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式对话框 非模式对话框

总结OnOK().OnCancel().OnClose().OnDestroy()之间的区别(转) 2009年09月22日 下午 08:33 第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数.从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框中的"确定"."取消"按钮则对应了CDialog. 第二,OnClose()和OnDestr

IE的模式对话框设计

对话框|设计 在开发 Intranet Web Mis 的过程中,大家发现如果运用模式对话框,程序的流程将更为清楚.在某些情况,用户必须进行某些操作之后,才能继续后面的事情.比如:某些安全性要求比较高的操作,需要操作者输入口令以确认.如果实现了模式对话框,那么一个WEB程序看上去更象一个VB 或 DELPHI 开发的应用程序.结合运用 ASP 和 DHTML ,可以实现模式对话框. 本文以 msgbox 的实现为例.客户端 VBScript 有一个函数 Msgbox() (以及衍生出来的Aler

窗体显示有模式与无模式之分...

无模式显示的窗体,可以互相切换,方法:from1.show 模式显示的窗体,可以理解为对话框,你必须在完成操作或关闭窗体后才能返回打开此窗体的窗体,方法:from1.showdialog

BootStrap+Angularjs+NgDialog实现模式对话框_AngularJS

本篇文章主要介绍了"angularjs+bootstrap+ngDialog实现模式对话框",对于Javascript教程感兴趣的同学可以参考一下: 在完成一个后台管理系统时,需要用表显示注册用户的信息.但是用户地址太长了,不好显示.所以想做一个模式对话框,点击详细地址按钮时,弹出对话框,显示地址. 效果如下图: 通过查阅资料,选择使用ngDialog来实现,ngDialog是一个用于Angular.js应用的模式对话框和弹出窗口.ngDialog非常小(?2K),拥有简约的API,通

使用MySQL来存储FriendFeed的无模式的数据的方法

我们使用MySQL存储了FriendFeed的所有数据.数据库随着用户基数的增长而增长了很多.现在已经存储了超过2.5亿条记录与一堆涵盖了从评论和"喜欢"到好友列表的其他数据. 随着数据的增长,我们也曾迭代地解决了随着如此迅猛的增长而带来的扩展性问题.我们的尝试很有代表性,例如使用只读mysql从节点和memcache来增加读取吞吐量,对数据库进行分片来提高写入吞吐量.然而,随着业务的增长,添加新功能比扩展既有功能以迎合更多的流量变得更加困难. 特别的,对 schema 做改动或为超过