MFC对话框和控件

摘要:
对话框和控制对话框是Windows应用程序中的常见资源。它们的主要功能是输出信息和接收用户输入数据。MFC提供了一系列对话类,并实现了对话消息响应和处理机制。MFC常用对话框CColorDialog颜色设置对话框,选择不同颜色CFileDialog文件访问对话框,打开或保存文件CFindReplaceDialog查找和替换对话框,查找和替换文本字符串CFontDialog字体设置对话框,并选择不同字体。MFC以类的形式封装标准控件和通用控件,其中大多数直接从CWnd类派生。

对话框和控件

对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互。

MFC中,对话框的功能被封装在CDialog类中,而CDialog类是CWnd类的派生类。作为窗口,对话框和其它窗口一样具有窗口的一切功能。对话框的一个典型应用是通过菜单命令或工具栏按钮打开一个对话框,当然,对话框也可以作为一个程序的主界面。

MFC提供了一系列对话框类,并实现了对话框消息响应和处理机制。CDialog类是对话框类中最重要的类,我们在程序中创建的对话框类一般都是CDialog类的派生类。CDialog类还是其它所有对话框类的基类,其派生关系如下所示:CObject>CCmdTarget>CWnd>CDialog。有关对话框的常用处理函数

  1. CDialog::CDialog()通过调用派生类构造函数,根据对话框资源模板定义一个对话框。
  2. CDialog::DoModal()激活模态对话框,显示对话框窗口。
  3. CDialog::Create()根据对话框资源模板创建非模态对话框窗口。如果对话框不是Visible属性,还需通过调用CWnd::ShowWindow()函数显示非模态对话框窗口。
  4. CDialog::OnOk()单击OK按钮时调用该函数,接收对话框输入数据,关闭对话框。
  5. CDialog::OnCancel()单击Cancel按钮或按Esc键时调用该函数,不接收对话框输入数据,关闭对话框。
  6. CDialog::OnInitDialog()WM_INITDIALOG消息处理函数,在调用DoModalCreate函数时系统发送WM_INITDIALOG消息,在显示对话框前调用该函数进行初始化。
  7. CDialog::EndDialog()用于关闭模态对话框窗口。
  8. CWnd::ShowWindow()显示或隐藏对话框窗口
  9. CWnd::DestroyWindow()关闭并销毁非模态对话框
  10. CWnd::UpdateData()通过调用DoDataExchange()设置或获取对话框控件的数据
  11. CWnd::DoDataExchange()UpdateData()调用以实现对话框数据交换,不能直接调用。
  12. CWnd::GetWindowText()获取对话框窗口的标题
  13. CWnd::SetWindowText()修改对话框窗口的标题
  14. CWnd::GetDlgItemText()获取对话框中控件的文本内容
  15. CWnd::SetDlgItemText()设置对话框中控件的文本内容
  16. CWnd::GetDlgItem()获取控件或子窗口的指针
  17. CWnd::MoveWindow()用于移动对话框窗口
  18. CWnd::EnableWindow()使窗口处于禁用或可用状态

一般对话框工作流程

当定义了一个对话框类后,就可以利用这个对话框类声明一个对话框对象,即一个能够在屏幕上显示的对话框。

声明了一个对话框对象后,可以调用对话框类的成员函数DoModal()建立对话框窗口并显示对话框。例如,假设定义了一个名为CMyDialog的对话框类,为了在屏幕上显示一个对话框,可以编写如下代码:CMyDialogmyDlg;myDlg.DoModal();

函数OnOK()OnCancel()DoModal()的关系:

对话框中一般都有OKCancel按钮,单击OK按钮时调用CDialog::OnOK()函数,单击Cancel按钮时调用CDialog::OnCancel()函数。OnOK()函数和OnCancal()函数都将结束DoModal()函数调用,但令DoModal()返回不同的值。OnOK()函数令DoModal()返回IDOKOnCancel()函数令DoModal()返回IDCANCAL。用户可以根据DoModal()的返回值做出不同的选择。如:if(myDlg.DoModal()==IDOK){……}

对话框的初始化可以在三个不同的阶段所调用的函数中进行:

  1. 对话框类构造函数;
  2. WM_CREATE消息处理函数;
  3. WM_INITDIALOG消息处理函数。

通常是在消息WM_INITDIALOG的消息处理函数OnInitDialog()中进行初始化。在收到WM_INIT-DIALOG消息时,对话框的框架已创建,对话框中的每个控件也已建立起来,但它们还没有在屏幕上显示。此时自然可以设置或优化对话框中各个控件的外观、尺寸、位置以及其它属性。函数OnInitDialog()将被成员函数DoModal()调用。

公用对话框

为了在MFC应用程序中使用公用对话框,MFC提供了封装这些公用对话框的类。这些公用对话框类都是从CCommonDialog类派生而来,而CCommonDialog类又是CDialog类的派生类。

MFC公用对话框类

  1. CColorDialog颜色设定对话框,选择不同的颜色
  2. CFileDialog文件存取对话框,打开或保存文件
  3. CFindReplaceDialog查找和替换对话框,查找和替换文本串
  4. CFontDialog字体设定对话框,选择不同的字体。
  5. CPagesSetupDialog页面设置对话框,设置页码、页眉等
  6. CPrintDialog标准的打印对话框,用于打印和打印设置
  7. COleDialog该类及其派生类用于生成OLE对话框

标准控件

Windows提供的控件分为两类:标准控件和公共控件。

标准控件:静态控件、编辑框、按钮、列表框、组合框和滚动条等。利用标准控件可满足大部分用户界面程序设计的要求。

公共控件:滑块、进度条、列表视控件、树视控件和标签控件等,利用公共控件实现应用程序用户界面风格的多样性。

控件是Windows提供的完成特定功能的独立小部件,它使应用程序对话功能的设计更容易完成,在对话框与用户的交互过程中担任主要角色,用于完成用户输入和程序运行过程中的输出。控件对应一个CWnd派生类的对象,它实际上也是一个窗口,可以通过调用窗口类的成员函数实现控件的移动、显示或隐藏、禁用或可用等操作,也可以重新设置它们的尺寸和风格等属性。MFC以类的形式对标准控件和公共控件进行了封装,这些类大部分是从CWnd类直接派生而来。

常用的MFC控件类

MFC对话框和控件第1张

MFC对话框和控件第2张

实例

文件对话框CFileDialog,动画控件CAnimateCtrl,列表框控件CListBox,其关键代码

void CDlgControlDlg::DoDataExchange(CDataExchange* pDX)
{
	// 	CAnimateCtrl mWndAnimate;
	// 	CListBox mListFileName;
	// 	CString mStrFilePath;
	// 	CString mStrFileName;
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_ANIMATE1, mWndAnimate);//动画控件的关联控件变量
	DDX_Control(pDX, IDC_LIST_FILENAME, mListFileName);//列表框控件关联的控件变量
	DDX_LBString(pDX, IDC_LIST_FILENAME, mStrFileName);//列表框控件关联的字符串变量
	DDX_Text(pDX, IDC_EDIT_FILEPATH, mStrFilePath);//编辑框控件关联的字符串变量
}
//按钮事件,打开avi的文件对话框事件
void CDlgControlDlg::OnBnClickedButtonOpenfile()
{ 
	//CFileDialog--打开或保存对话框,构造函数的参数lpszFilterd的格式
	//1.过滤字符串以“||”作为结束符
	//2.过滤字符串中不同的行以“|”分割
	//3.每一行有被分为两部分,以“|”分割,(显示在下列框的字符|过滤字符信息)
	TCHAR szFilter[]=L"视频文件(*.avi)|*.avi|所有文件(*.*)|*.*||";
	CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);
	if (IDOK!=dlg.DoModal())
	{
		return;
	}
	mStrFilePath=dlg.GetPathName();//将文件路径显示在编辑框控件上
	UpdateData(FALSE);
	//将文件路径显示到编辑框控件上
	CString strName=dlg.GetFileName();
	if (LB_ERR==mListFileName.FindString(-1,strName))
	{
		int nItem=mListFileName.AddString(strName);
		//保存路径
		CString* pPath=new CString;
		*pPath=mStrFilePath;
		mListFileName.SetItemData(nItem,(DWORD)pPath);
	}
	Play();
} 
//双击列表框事件
void CDlgControlDlg::OnLbnDblclkListFilename()
{ 
	int nSel=mListFileName.GetCurSel();//获取当前的选择项
	if (nSel==LB_ERR)
	{
		return;
	}
	CString* pPath=(CString*)mListFileName.GetItemData(nSel);//获取列表框中保存的文件路径
	mStrFilePath=*pPath;
	UpdateData(FALSE);
	Play();
}
//动画播放成员函数
void CDlgControlDlg::Play()
{
	mWndAnimate.Open(mStrFilePath);
	mWndAnimate.Play(0,-1,-1);
}

其结果:MFC对话框和控件第3张

免责声明:文章转载自《MFC对话框和控件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android开发 Html工具类详解Gradle 升级的一些坑下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

超全!iOS 面试题汇总

作者:Job_Yang 之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家。(题目来源于网络,侵删) 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多...

深入理解xLua基于IL代码注入的热更新原理

目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题。另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一。 热更新可以分为资源热更和代码热更两类,其中代码热更又包括Lua热更和C#热更。Lua作为一种轻量小巧的脚本语言,由Lua虚拟机解释执行。所以Lua热更通过简单的源代码文...

C++异常

一、什么是异常处理         一句话:异常处理就是处理程序中的错误。 二、为什么需要异常处理,以及异常处理的基本思想         C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);另一...

MFC 扫雷

花了两天时间做了一个MFC的扫雷,简单的实现了扫雷的功能,界面很草小毛病很多(比如标题。。),还望大家多多指正。 开发工具: VS2008 代码:https://files.cnblogs.com/GhostZCH/FindMine.rar 界面如下,红色的是标记,绿色的是还没有打开的各种,黄色的是已经打开的,红星是地雷(原谅程序的丑陋,唉,我也不是做美工...

第五章 Python 函数(一)

Python 函数 一、函数功能和特性   功能: 1. 函数是对实现对实现某一功能的代码的封装 2. 函数可以实现代码的复用,从而减少代码的重复编写   特性: 1. 函数可以接受任何数字或者任何类型的输入作为其参数 2. 函数也可以通过关键字 return 可以返回任何数字或者其他类型的结果 二、函数的定义和调用 我们通常可以对函数进行的操作有:定义函...

Android中Message机制的灵活应用

转自:http://qaohao.iteye.com/blog/509145 1.活用Android线程间通信的Message机制 1.1.Message 代码在frameworks\base\core\java\android\Os\Message.java中。 Message.obtain函数:有多个obtain函数,主要功能一样,只是参数不一样。...