对话框程序设计概述
常用成员函数
对话框主要属性
一、在对话框使用按钮控件
1、按钮添加变量
变量名的基本形式:变量名=属性+类型+对象描述
2、按钮添加事件处理程序
事件处理程序是某个事件发生后控件要执行的程序。
事件处理程序就是一个类成员函数
Messagebox
AfxMessagebox
二、对话框窗口消息
通常用于向用户显示一段文本字符串信息
在**WM_CREATE**消息的时候,对话框还没有被显示在屏幕上要对控件初始化,通常是在对话框类的虚函数OnInitDialog 中进行 **WM_DESTROY和WM_CLOSE发送顺序:**- 用户单击窗口右上角的关闭按钮,发送WM_CLOSE消息在此过程中调用DestroyWindow 函数,发送WM_DESTROY 消息
- 此消息处理过程中调用PostQuitMessage 函数发送WM_QUIT 消息到消息队列中
- GetMessage 捕获到WM_QUIT 消息返回0,退出消息循环(应用程序真正退出,就是从任务管理器里消失)
1、为消息对话框显示消息处理函数
**注意:**WM_CLOSE 和WM_DESTROY 的触发条件是不同的
WM_CREATE
WM_CREATE 出现在对话框出现之前
int CTest1Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
AfxMessageBox(_T("我是消息对话框,马上出现"));
return 0;
}
WM_CLOSE
询问是否关闭程序
void CTest1Dlg::OnClose()
{
if (AfxMessageBox(_T("确定要关闭程序吗?"), MB_YESNO) == IDYES)
CDialogEx::OnClose();
}
WM_DESTROY
以下代码体现主对话框虽然关闭了,但并不意味着进程的退出
void CTest1Dlg::OnDestroy()
{
CDialogEx::OnDestroy();
AfxMessageBox(_T("主对话框已消失,但进程未退出!"));
}
2、为对话框添加自定义消息
在对话框中可以直接使用这两个函数,虽然这两个函数都是发送消息,但存在一定的区别。SendMessage 函数发送出消息后,该函数SendMessage 不会立即返回,而要等到发出消息所对应的消息处理函数执行完毕后才能返回,继续执行消息函数后面的代码。PostMessage 发出消息后立即返回,马上执行PostMessage后面的代码,而不会去管消息处理函数是否执行完毕。
三、模态对话框和非模态对话框
模态对话框使用CDialog::DoModal 函数进行创建。DoModel 会启动一个模态对话框自己的消息循环,这也是模态对话框要关闭后才能使用程序其他窗口的原因。DoModel 函数在对话框关闭后才会返回。
非模态对话框使用CDialog::Create 函数来实现,Create不会启动新的消息循环,对话框与应用程序共用一个消息循环,因此不会独占用户输入
1、模态对话框
- 资源视图Dialog ,在右键快捷菜单中选择“插入Dialog ”命令
- 在caption 属性(标题栏中显示的文本)中改为“模态对话框”
- 在对话框空白处右击,在快捷菜单中选择添加类以CDialog为基类(或以CDialogEx,比CDialog扩展一些功能)
- 在资源视图IDD_TEST1_DIALOG 的对话框,添加消息按钮函数
void CTestDlg::OnBnClickedButton1()
{
CDlgModel dlg;
dlg.DoModal();//创建并显示模态对话框
}
- 在TestDlg.cpp 中添加头文件
#include <DlgModel.h>
2、非模态对话框
- 定义非模态对话框指针
- 切换资源视图添加消息按钮函数
- 切换类视图重写函数下添加OnCancel() 重载函数,然后在OnOK(),OnCancel()中添加如下代码:
void CDlgModeless::OnOK{
CDialog::OnOK();
DestroyWindow();//销毁窗口,发出WM_DESTROY 消息
}
void CDlgModeless::OnCancel{
CDialog::OnCancel();
DestroyWindow();//销毁窗口,发出WM_DESTROY 消息
}
- 响应对话框WM_DESTROY 消息。切换类视图,在消息列表添加WM_DESTROY 响应函数OnDestroy :
void CDlgModeless::OnDestroy{
CDialog::OnDestroy();
delete this;
g_dlgModeless=null;
}
- 保存运行
四、通用对话框
是操作系统提供给所有应用程序使用的对话框,其功能已经实现好了,可以直接使用。例如,打开、保存文件对话框、字体选择对话框、颜色选择对话框、打印设置对话框、查找替换对话框等等。
在VS2017中所有的通用对话框都是从CCommonDialog 继承而来
1、文件对话框的使用
打开文件或保存文件的对话框,在文件对话框用户可以设置路径名和文件名等。
类CFILEDialog 实现文件对话框的各种功能,构造函数的第一个参数是TRUE 时,为打开对话框;第一个参数为FALSE 时,为保存对话框。
构造函数原型如下:
示例:
简单文件打开对话框
void CTextDlg::OnBnClickedButton1()
{
CFileDialog dlg(true, NULL, _T("MyDat"), NULL, NULL, this);
dlg.m_ofn.lpstrInitialDir=_T("c:\\windows");
dlg.DoModal();
}
设置初始目录的文件打开对话框
void CTextDlg::OnBnClickedButton1()
{
CFileDialog dlg(true, NULL, _T("MyDat"), NULL, NULL, this);
dlg.m_ofn.lpstrInitialDir=_T("c:\\windows");
dlg.DoModal();
AfxMessageBox(_T("设置的目录路径为:") + dlg.GetFolderPath());//GetFolderPath();
}
获取文件打开对话框所选的路径名
void CTextDlg::OnBnClickedButton1()
{
CFileDialog dlg(true, NULL, NULL, NULL, NULL, this);
dlg.m_ofn.lpstrInitialDir=_T("c:");
if(IDOK==dlg.DoModal())
AfxMessageBox(_T("设置的目录路径为:") + dlg.GetPathName());
}
获取文件打开对话框所选的文件名
类似同上
AfxMessageBox(_T("设置的目录路径为:") + dlg.GetFileName());
获取文件打开对话框所选的文件标题
AfxMessageBox(_T("设置的目录路径为:") + dlg.GetFileTitle());
获取所选文件的扩展名
AfxMessageBox(_T("设置的目录路径为:") + dlg.GetFileExt());
打开文件对话框选择多个文件
p186
设置文件打开对话框的过滤功能
设置打开对话框的过滤功能
带有标题的文件打开对话框
void CTextDlg::OnBnClickedButton1()
{
CFileDialog dlg(true, NULL, NULL, NULL, NULL, this);
dlg.m_pOFN->lpstrTitle = _T("请选择要打开的文件");
dlg.DoModal();
}
最简单文件保存对话框
void CTextDlg::OnBnClickedButton1()
{
CFileDialog dlg(false, NULL, NULL, NULL, NULL, this);
dlg.DoModal();
}
带自定义保存文件名的保存文件对话框
void CTextDlg::OnBnClickedButton1()
{
CFileDialog dlg(false, NULL,_T("Mydata"), NULL, NULL, this);
dlg.DoModal();
}
带自定义文件名和扩展名的保存文件对话框
void CTextDlg::OnBnClickedButton1()
{
LPCTSTR lpszFilters;
lpszFilters = _T("BMP文件|*.bmp|DIB文件|*.dib||");
CFileDialog dlgfile(FALSE, _T(""),_T("图片"), OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, lpszFilters, this);
if (dlgfile.DoModal()) {
CString sPathName = dlgfile.GetPathName();
AfxMessageBox(sPathName);
}
}
2、字体对话框的使用
3、浏览文件夹对话框的使用
可以让用户来选择文件夹。显示文件夹对话框可调用系统函数SHBrowseForFolder 该函数由操作系统shell32.lib 提供可直接拿来使用。
4、查找 / 替换对话框的使用
该对话框比较特殊,属于非模态对话框,它的使用与其他通用对话框有所不同。注意,该对话框只是提供一个接受用户要求的接口,使我们知道用户提出了何种要求(返回请求查找 / 替换),真正的工作需要另行编程实现。与文件对话框相似,用户打开文件对话框不能真的打开文件,而是让我们知道用户打开的文件是哪一个(图形窗口的形式返回要打开的文件路径)
类CFindReplaceDialog 对该对话框进行了封装,作为非模态对话框必须用new 操作符来分配存储空间,再用Create 函数对其进行初始化,最后用Show Window 函数显示对话框。里面就有成员函数Create 函数原型:
BOOL Create (
BOOL bFindDialogOnly, //1、对话框类型,TRUE时查找对话框,FALSE时查找/替换对话框
LPCTSTR lpszFindWhat, //2、在查找对话框中显示的字符串
LPCTSTR lpszReplaceWht = NULL, //3、在替换窗中显示的字符串
DWORD dwFlag, //4、标志位,用来定制对话框,可以是多个标志灯的组合,主要取值如下所述
CWnd* pParentWnd = NULL //5、指向对话框父窗口,NULL则为主框架窗口,使用时需让它指向接收查找/替换消息的窗口
);
dwFlag 标志位的标志:
示例:
- 在新建的Text 工程中在解决方案视图打开TestDlg.cpp 在开头定义全局变量
CFindReplaceDialog* CFindReplaceDlg = NULL; //指向查找对话框或替代对话框
BOOL bLastCase = FALSE; //记录上一次的大小写情况
int pos = 0, curpos; //pos是当前查找索引;curpos是当前索引
//gstrEdit 存放上一次编辑框中的正文内容;gstrLast存放上一次查找框中的内容
CString gstrEdit, gstrLast;
-
添加编辑框(Edit Control)该编辑框显示正文内容,设置编辑框Want Return 属性和Multisim 属性为True ,再为编辑框添加控件变量m_edt 和值变量 m_strEdit。添加“显示查找对话框”,添加按钮单击时间处理代码:
------ 待补充-----