在MFC中怎样添加一个非模态的对话框
2009-11-23 01:32
267 查看
添加一个非模态对话框
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(); //对返回数据的处理(自定)
}
11、完成,运行。
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(); //对返回数据的处理(自定)
}
11、完成,运行。
相关文章推荐
- MFC中,我从一个对话框,同时在按钮的消息处理函数中利用DoModal()函数一级一级的创建许多模态对话框,那么怎样从某个子对话框返回第一个对话框呢?
- mfc中怎样在一个基于对话框程序中添加菜单栏
- VS如何为基于对话框的MFC添加菜单及菜单项事件
- VS新建基于对话框MFC 添加button后双击无反应
- VS2008向MFC 对话框 添加托盘图标(显示和消失)
- Visual Studio 2017 MFC 对话框添加方法 对话框添加失败
- MFC 模态对话框dlg.DoModal()返回值
- 在VS2010/MFC中如何对对话框添加控件
- MFC 非模态,无内存泄漏对话框应该是怎么创建
- MFC模态对话框和非模态对话框
- VS2010/MFC对话框三:创建对话框类和添加控件变量
- MFC 如何实现对话框添加位图作为背景图
- MFC(3) 对话框里面添加一个网页浏览窗口
- MFC编程入门之七(对话框:为对话框添加控件)
- MFC对话框添加菜单栏并添加鼠标单击响应(实例,包你一学就会)
- MFC在对话框中添加了一个richedit控件,窗口就不显示了。
- MFC模态对话框和非模态对话框
- bootstrap添加多个模态对话框支持
- MFC 在对话框中添加WM_ERASEBKGND响应函数
- MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息