首页>>百科常识

怎样创建一个非模态对话框?

今天宠物迷的小编给各位宠物饲养爱好者分享设置非模态对话框的宠物知识,其中也会对怎样创建一个非模态对话框?(模态对话框与非模态对话框的创建)进行专业的解释,如果能碰巧解决你现在面临的宠物相关问题,别忘了关注本站哦,现在我们开始吧!

怎样创建一个非模态对话框?

怎样创建一个非模态对话框?

首先你要在资源面板添加一个对话框,假设ID为IDD_DIALOG1,类为CTestDlg
则可以用指针的方式创建:
CTestDlg* dlg;
dlg = new CTestDlg;
dlg->Create(IDD_DIALOG1); //非模态对话框ID号
dlg->ShowWindow(SW_SHOW);

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

MFC编程中怎么弹出非模态对话框?

一、非模态对话框的创建和删除是比较复杂些,下面说一下步骤吧。 1、在父窗口的构造函数中用new来创建非模态对话框对象; 2、调用基类函数Create()来打开话框; 3、重写OnCancel()函数,调用DestroyWindow()来关闭非模态对话框; 4、在父窗口的析构函数中用delete来删除非模态对话框对象; 二、非模态对话框创建后,父窗口是不能DestroyWindow()的,但是你可以隐藏父窗口来达到目的。 上述提供了一个思路,没有提供源代码,几句语句就能做出来了,还是自己尝试印象才深刻。如果对C++语言还没有掌握的话,建议还是先把C++语言掌握好了再去学习VC++ 希望采纳。

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(); //对返回数据的处理(自定)
}

模态对话框和非模态对话框有什么区别 举例说明

word中的“另存为”对话框就是模态对话框,你不把它关闭,不能进行其他操作。
word中的“查找与替换”对话框就是非模态对话框,你不把它关闭,能进行其他操作。

MFC非模态对话框中,怎么在子对话框中调用主对话框的一个输入参数进行

重载子对话框的构造函数,并为子函数添加对应类型的成员变量 比如说,子对话框的默认构造函数如下: ChildDlg(CWnd* pParent /*=NULL*/);那么,你重载一个构造函数,比如你想传个int m_a进来,那么如下: ChildDlg(int a, CWnd* pParent /*=NULL*/){ m_a = a; }然后你在声明子对话框类对象的时候,就不要调用默认构造函数,而调用你重载的构造函数 这样就能把你要的参数传到子对话框中来了

VS环境下如何将mfc主对话框改为非模态对话框,另外,我创建了4个非模态对话框,要实现包括主对话框在内的

如果你非要把主对话框改为非模态对话框,先找到app类的InitInstance() CsheetDiaDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){ // TODO: 在此放置处理何时用 // “确定”来关闭对话框的代码}else if (nResponse == IDCANCEL){ // TODO: 在此放置处理何时用 // “取消”来关闭对话框的代码}这里你可以看到主对话框显示的代码,你会写非模态对话框,自然知道怎么改。 不过我看你的需求,这种方法不算好,看看MFC的CPropertySheet和CPropertyPage类, 也许你会发现更好的方法,参考 http://hi.baidu.com/aijianmeng/item/8d5c2ece19864656ac00ef6b http://jingyan.baidu.com/article/6d704a13dd463e28db51ca12.html

非模态对话框:

这个问题,与栈和堆有点关系。
执行pDlg.Create()之后,对话框被创建,然后程序接着往下面走,走出了当前函数后,pDlg就走出作用域,消失掉了,被析构了(因为它不是指针),所以会看不到。
而是用指针的话,执行过程走出函数之后,只有pDlg指针消失掉,而指针指向的对话框对象,还保留在heap中,没有被析构,所以还能看见。

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(); //对返回数据的处理(自定)
}

MFC编程中怎么弹出非模态对话框?

一、非模态对话框的创建和删除是比较复杂些,下面说一下步骤吧。 1、在父窗口的构造函数中用new来创建非模态对话框对象; 2、调用基类函数Create()来打开话框; 3、重写OnCancel()函数,调用DestroyWindow()来关闭非模态对话框; 4、在父窗口的析构函数中用delete来删除非模态对话框对象; 二、非模态对话框创建后,父窗口是不能DestroyWindow()的,但是你可以隐藏父窗口来达到目的。 上述提供了一个思路,没有提供源代码,几句语句就能做出来了,还是自己尝试印象才深刻。如果对C++语言还没有掌握的话,建议还是先把C++语言掌握好了再去学习VC++ 希望采纳。

MFC中非模态对话框显示位置总是比预期靠下

在 CTestDlg::OnInitDialog()调用ClientToScreen(&m_pt);是错误的,应该在CTestView::OnLButtonDown函数里面调用 ClientToScreen(&point)之后,再调用m_TestDlg.m_pt=point;然后在OnInitDialog()函数里面就不要再进行坐标变换了

本文由宠物迷 百科常识栏目发布,非常欢迎各位朋友分享到个人朋友圈,但转载请说明文章出处“怎样创建一个非模态对话框?

标签:宠物爱好