怎样创建一个非模态对话框? 关于一个非模态对话框创建和销毁的问题

作者&投稿:爱新觉罗莫 (若有异议请与网页底部的电邮联系)
首先你要在资源面板添加一个对话框,假设ID为IDD_DIALOG1,类为CTestDlg
则可以用指针的方式创建:
CTestDlg* dlg;
dlg = new CTestDlg;
dlg->Create(IDD_DIALOG1); //非模态对话框ID号
dlg->ShowWindow(SW_SHOW);

不过还是推荐把该对话框作为类成员变量或者全局变量,以避免内存泄露

估计是因为你的非模态对话框的生命周期太短导致。
你用 new 来做就可以。比如你的非模态对话框类为CDlg,那么可以这样:

class A
{
CDlg* d;
void ShowD();
}

void A::ShowD()
{
d = new CDlg(...);
d.Create(...);
d.ShowWindow(...);
}

当然你得在某个合适的地方将d销毁, 即delete d;

不能用局部变量,局部变量执行完就被析构掉了。只要你把变量改成全局的就行了。

也不建议用new来分配内存,因为你还得要delete掉,不然会内存泄漏。

如果是类的话,你可以定义为成员变量,如果没有类你就把他定义为静态变量加一个static就ok了,更或者定义为全局变量也行

那你要把它做成全局变量或者类的成员变量

mfc怎么创建一个非模态对话框~

添加一个非模态对话框
1、点击菜单 插入——资源,选择Dialog,点击新建。
2、编辑对话框,添加一些控件什么的。
3、双击对话框或者打开ClassWizard,为对话框建立一个类,如CMyDialog。
4、在*view.cpp的开头添加新建立的类的头文件(如:#include "mydialog.h")。这点很重要,漏了这步编译的时候经常提示出错的。
5、在主窗口的view类定义中添加一个对话框的指针定义,如:
class CTest3View : public CView
{
......
public:
CMyDialog* pMydialog;
......
}
6、为主窗口增加一个按钮或者菜单,准备点击后弹出对话框,用ClassWizard指定执行函数(如OnOption)。内容如下:
void CTest3View::OnOption()
{
pMydialog=new CMyDialog;//建立对话框
pMydialog->m_width=width;//向对话框输出数据(根据实际情况定)
pMydialog->Create(CMyDialog::IDD);
pMydialog->ShowWindow(SW_SHOW); //显示对话框
}
7、运行一下,对话框就出现了。
8、为了让对话框的数据能反馈回主窗口,需要通过对话框向主窗口发送一个自定义消息,触发主窗口的一个函数,把对话框的数据传回主窗。为了能向主窗口发送消息,需要取得主窗口指针,因此重载对话框的构造函数,生产对话框的时候把主窗的指针传给对话框。
9、在CMyDialog.h增加以下:
#define WM_DIALOGOK WM_USER+1 //自定义点击OK按钮的消息宏
#define WM_DIALOGAPPLY WM_USER+2 //自定义点击APPLY按钮的消息宏
class CMyDialog : public CDialog
{
...
public:
CMyDialog(CView* pParent); //重载的构造函数声明,原来的构造函数声明去掉
CView *pView; //定义一个存储主窗的指针
...
protected:
virtual void OnOK(); //重载OnOK函数声明,为了关闭对话框时间向主窗提供数据
};
在CMyDialog.cpp修改如下:
...
CMyDialog::CMyDialog(CView* pParent)//重新定义构造函数,原来的构造函数去掉
{
pView=pParent;//把**View类的指针保存
}
void CMyDialog2::OnOK()//点击对话框的OK按钮,关闭对话框同时数据生效
{
UpdateData(TRUE);//显式调用实现数据交换
pView->SendMessage(WM_DIALOGOK); //向主窗发送消息
CDialog::OnOK();
}
void CMyDialog::OnApply()//点击对话框的APPLY按钮,数据生效但不关闭对话框
{
UpdateData(TRUE);//显式调用数据交换
pView->PostMessage(WM_DIALOGAPPLY);//把消息发送给主窗
}
10、对话框把消息发送回主窗后,主窗需要响应该相应的消息,调用函数接受数据的变化。
在**view.h中,修改以下:
class CTest3View : public CView
{
...
public:
...
CMyDialog* pMydialog; //定义对话框
...
protected:
//{{AFX_MSG(CTest3View)
......
afx_msg void OnDialogOk(); //声明OK消息处理函数
afx_msg void OnDialogApply(); //声明apply消息处理函数
//}}AFX_MSG
...
}
在**view.cpp中,修改如下:
...
#include "mydialog.h" //引入对话框类定义(别忘记)
...
BEGIN_MESSAGE_MAP(CTest3View, CView)
...
ON_MESSAGE(WM_DIALOGOK,OnDialogOk) //自定义OK消息处理函数,对话框发回的消息这里吵醒主窗,然后它执行OnDialogOk
ON_MESSAGE(WM_DIALOGAPPLY,OnDialogApply)//自定义APPLY消息处理函数,同上
END_MESSAGE_MAP()
...
CTest3View::CTest3View()
{
pMydialog=new CMyDialog(this); //将当前指针传入对话框
pMydialog->Create(CMyDialog::IDD);
}
void CTest3View::OnOption()
{
pMydialog->m_width=width; //数据传入对话框
pMydialog->ShowWindow(SW_SHOW); //显示对话框
}
void CTest3View::OnDialogOk() //自定义的OK消息处理函数
{
width=pMydialog->m_width; //数据传回主窗
IfInvalidate(); //对返回数据的处理(自定)
}
void CTest3View::OnDialogApply() //自定义的APPLY消息处理函数
{
width=pMydialog->m_width; //数据传回主窗
IfInvalidate(); //对返回数据的处理(自定)
}

1、virtual BOOL Create(
UINT nIDTemplate,
CWnd* pParentWnd = NULL
);
我们可以看到
pParentWnd:
Points to the parent window object (of type CWnd) to which the dialog object belongs. If it is NULL, the dialog object's parent window is set to the main application window.
this是指向非模态对话框的父窗口的句柄指针。

2、当你创建非模态窗口的时候当然要NEW出来新的对象啊
3、需要在非模态窗口类中重载OnOK()和OnCancle()接口,并且需要增加PostNcDestory消息处理函数,在函数体中,Delete this;

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

在visual c++中,如何做出来非模态对话框?还有如何清除?
答:MS的指示:非模态对话框需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需...

mfc怎么创建一个非模态对话框
答:1、点击菜单 插入——资源,选择Dialog,点击新建。2、编辑对话框,添加一些控件什么的。3、双击对话框或者打开ClassWizard,为对话框建立一个类,如CMyDialog。4、在*view.cpp的开头添加新建立的类的头文件(如:#include "mydialog.h")。这点很重要,漏了这步编译的时候经常提示出错的。5、在主窗...

对一个对话框编程一般经过几个步骤 ?
答:1、在资源编辑器中画对话框,添加控件,设定控件位置、大小、ID和其它属性;2、定义对话框回调函数,添加控件的事件处理函数;3、注册对话框函数。

MFC 中创建Dlg的问题
答:非模态对话框必须使用函数DestroyWindow()来销毁窗口. 这个工作,最好通过下面的步骤来做:对CNewDlg类响应 IDOK 消息. 在消息响应函数中, 发送一个自定义消息给m_pDlg 父窗口, 也就是 你的主窗口, 在主窗口中对消息进行响应, 执行代码: m_pDlg->DestroyWindow(); 即可.还需要在主对话框的析构...

VC如何在对话框里创建一个非模态对话框出来
答:CXXXDlg *a;//定义要弹出的一个非模态对话框对象 a=new CXXXDlg;//分配 a->Create(IDD_XXX);//对话框ID a->ShowWindow(TRUE);//显示

请教od问题...
答:bp CreateDialogIndirect 创建非模态对话框 bp CreateDialogIndirectParam(A) 创建非模态对话框 bp GetDlgItemText(A) 获取对话框文本 bp GetDlgItemInt 获取对话框整数值 拦截剪贴板:bp GetClipboardData 获取剪贴板数据 拦截注册表:bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健 bp RegQueryValue(A...

非模态对话框的非模态对话框
答:非模态对话框允许用户在处理非模态对话框的同时处理目标对话框。其不会垄断用户的输入,如图所示。Windows应用程序中,对话框分为两种。另一种是模态对话框。二者的区别在于当对话框打开时,是否允许用户进行其他对象的操作。要建立非模态对话框需要调用两个函数Create()和ShowWindow()

c#中如何对非模式对话框的设计
答:对话框的显示有两个函数,一个是.show();另一个是.showDialog();第一个函数是以非模态对话框的形式显示,调完后会执行下面的函,当然会执行frModel.Dispose();所以弹出之后自动消毁了。改为第二个就是模态对话框了。要手动关闭

一个简单的MFC问题,创建一个基本的非模式对话框。结果一点击菜单整个...
答:一般非模态对话框创建语句如下 UnfoDlg dlg;if (!dlg.m_hWnd){ dlg.Create(IDD_DIALOG1);} dlg.ShowWindow(SW_SHOW);换成这样试试