2)MFC对话框程序设计

对话框程序设计概述

常用成员函数

对话框主要属性

一、在对话框使用按钮控件

1、按钮添加变量

变量名的基本形式:变量名=属性+类型+对象描述

2、按钮添加事件处理程序

事件处理程序是某个事件发生后控件要执行的程序。
事件处理程序就是一个类成员函数

Messagebox

AfxMessagebox

二、对话框窗口消息

通常用于向用户显示一段文本字符串信息

   在**WM_CREATE**消息的时候,对话框还没有被显示在屏幕上要对控件初始化,通常是在对话框类的虚函数OnInitDialog 中进行 **WM_DESTROY和WM_CLOSE发送顺序:**
  1. 用户单击窗口右上角的关闭按钮,发送WM_CLOSE消息在此过程中调用DestroyWindow 函数,发送WM_DESTROY 消息
  2. 此消息处理过程中调用PostQuitMessage 函数发送WM_QUIT 消息到消息队列中
  3. 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、模态对话框

  1. 资源视图Dialog ,在右键快捷菜单中选择“插入Dialog ”命令
  2. 在caption 属性(标题栏中显示的文本)中改为“模态对话框”
  3. 在对话框空白处右击,在快捷菜单中选择添加类以CDialog为基类(或以CDialogEx,比CDialog扩展一些功能)
  4. 在资源视图IDD_TEST1_DIALOG 的对话框,添加消息按钮函数
void CTestDlg::OnBnClickedButton1()
{
	CDlgModel dlg;
	dlg.DoModal();//创建并显示模态对话框
}
  1. 在TestDlg.cpp 中添加头文件
#include <DlgModel.h>

2、非模态对话框

  1. 定义非模态对话框指针
  2. 切换资源视图添加消息按钮函数
  3. 切换类视图重写函数下添加OnCancel() 重载函数,然后在OnOK(),OnCancel()中添加如下代码:
void CDlgModeless::OnOK{
	CDialog::OnOK();
	DestroyWindow();//销毁窗口,发出WM_DESTROY 消息
}
void CDlgModeless::OnCancel{
	CDialog::OnCancel();
	DestroyWindow();//销毁窗口,发出WM_DESTROY 消息
}
  1. 响应对话框WM_DESTROY 消息。切换类视图,在消息列表添加WM_DESTROY 响应函数OnDestroy :
void CDlgModeless::OnDestroy{
	CDialog::OnDestroy();
	delete this;
	g_dlgModeless=null;
}
  1. 保存运行

四、通用对话框

是操作系统提供给所有应用程序使用的对话框,其功能已经实现好了,可以直接使用。例如,打开、保存文件对话框、字体选择对话框、颜色选择对话框、打印设置对话框、查找替换对话框等等。

  在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 标志位的标志:

示例:

  1. 在新建的Text 工程中在解决方案视图打开TestDlg.cpp 在开头定义全局变量
CFindReplaceDialog* CFindReplaceDlg = NULL;		//指向查找对话框或替代对话框
BOOL bLastCase = FALSE;							//记录上一次的大小写情况
int pos = 0, curpos;							//pos是当前查找索引;curpos是当前索引
//gstrEdit 存放上一次编辑框中的正文内容;gstrLast存放上一次查找框中的内容
CString gstrEdit, gstrLast;
  1. 添加编辑框(Edit Control)该编辑框显示正文内容,设置编辑框Want Return 属性和Multisim 属性为True ,再为编辑框添加控件变量m_edt 和值变量 m_strEdit。添加“显示查找对话框”,添加按钮单击时间处理代码:

------ 待补充-----

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucky_Turtle

感谢您的打赏,作者会多多努力的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值