📄 chap5_6.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>5.6 公用对话框</title>
</head>
<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="85%" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0"
cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><a
href="../../vc.htm"><span style="text-decoration: none"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></span></a></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="CENTER"></b></font><font
FACE="Times New Roman" size="4" color="#3973DE">5.6 </font><font size="4" color="#3973DE">公用对话框</font><font
FACE="Times New Roman" size="4"></p>
</font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY"></font><span
style="font-size: 9pt">在使用Windows的过程中,用户经常会遇到一些常用的有特定用途的对话框。例如,当选择File->Open,会弹出一个文件选择的对话框,用户可以在其中选择想要打开的文件。象文件选择这样的对话框,使用的非常普遍,因此Windows系统本身提供了对该对话框的支持,用户不必自己设计文件选择对话框。与文件选择对话框类似的还有颜色选择、字体选择、打印和打印设置以及正文搜索和替换对话框。这五种对话框均由Windows支持,被称为公用对话框。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">MFC提供了一些公用对话框类,它们均是CDialog类的派生类,封装了公用对话框的功能。表5.6列出了MFC的公用对话框类。</span><b></p>
<p ALIGN="CENTER"><span style="font-size: 9pt"> </span></p>
<p ALIGN="CENTER"><span style="font-size: 9pt">表5.6 公用对话框类</span></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">通用对话框类</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用途</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CColorDialog</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">选择颜色</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CFileDialog</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">选择文件名,用于打开和保存文件</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CFindReplaceDialog</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">正文查找和替换</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CFontDialog</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">选择字体</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CPrintDialog</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">打印和打印设置</span></td>
</tr>
</table>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">通用对话框类使用方便,读者只需知道怎样创建对话框和访问对话框的数据,不必关心它们的内部细节。</span></p>
<b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">5.6.1
CColorDialog类</font></span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CColorDialog类用于实现Color(颜色选择)公用对话框。Color对话框如图5.12所示,在Windows的画板程序中,如果用户在颜色面板的某种颜色上双击鼠标,就会显示一个Color对话框来让用户选择颜色。</span></p>
<p ALIGN="center"><span style="font-size: 9pt"><img src="T5_12.gif"
alt="T5_12.tif (167359 bytes)" WIDTH="491" HEIGHT="321"></span></p>
<p ALIGN="center"><span style="font-size: 9pt">图5.12 Color对话框</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">Color对话框的创建与一般的对话框没什么两样:首先是在堆栈上构建一个CColorDialog对象,然后调用CColorDialog::DoModal(
)来启动对话框。CColorDialog的构造函数为</span></p>
<blockquote>
<blockquote>
<blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CColorDialog( COLORREF clrInit = 0, DWORD
dwFlags = 0, CWnd* pParentWnd = NULL );</span></p>
</blockquote>
</blockquote>
</blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">参数clrInit用来指定初始的颜色选择,dwFlags用来设置对话框,pParentWnd用于指定对话框的父窗口或拥有者窗口。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">根据DoModal返回的是IDOK还是IDCANCEL可知道用户是否确认了对颜色的选择。DoModal返回后,调用CColorDialog::GetColor()可以返回一个COLORREF类型的结果来指示在对话框中选择的颜色。COLORREF是一个32位的值,用来说明一个RGB颜色。GetColor返回的COLORREF的格式是0x00bbggrr,即低位三个字节分别包含了蓝、绿、红三种颜色的强度。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">读者将在后面的章节中看到颜色选择对话框的例子。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">5.6.2
CFileDialog类</font></span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CFileDialog类用于实现文件选择对话框,以支持文件的打开和保存操作。用户要打开或保存文件,就会和文件选择对话框打交道,图5.13显示了一个标准的用于打开文件的文件选择对话框。用MFC
AppWizard建立的应用程序中自动加入了文件选择对话框,在File菜单选Open或Save
As命令会启动它们。</span></p>
<p ALIGN="center"><span style="font-size: 9pt"><img src="T5_13.gif"
alt="T5_13.tif (115270 bytes)" WIDTH="425" HEIGHT="250"></span></p>
<p ALIGN="center"><span style="font-size: 9pt">图5.13 文件选择对话框</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">文件选择对话框的创建过程与一般对话框的类似,首先是在堆栈上构建一个CFileDialog对象,然后调用CFileDialog::DoModal(
)来启动对话框。文件对话框的构造函数为</span></p>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CFileDialog( BOOL bOpenFileDialog, LPCTSTR
lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );</span></p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">如果参数bOpenFileDialog的值为TRUE,将创建Open(打开文件)对话框,否则就创建Save
As(保存文件)对话框。参数lpszDefExt用来指定缺省的文件扩展名。lpszFileName用于规定初始文件名。dwFlags用于设置对话框的一些属性。lpszFilter指向一个过滤字符串,用户如果只想选择某种或某几种类型的文件,就需要指定过滤字符串。参数pParentWnd是指向父窗口或拥有者窗口的指针。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">过滤字符串有特定的格式,它实际上是由多个子串组成,每个子串由两部分组成,第一部分是过滤器的字面说明,如“Text
file (*.txt)”,第二部分是用于过滤的匹配字符串,如“*.txt”,子串的两部分用竖线字符“
| ”分隔开。各子串之间也要用“ |
”分隔,且整个串的最后两个字符必须是两个连续的竖线字符“ ||
”。一个典型的过滤字符串如下面所示:</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">char szFilter[]=</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">“All files (*.*)|*.*|Text
files(*.txt)|*.txt|Word documents(*.doc)|*.doc||”;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">若CFileDialog::DoModal返回的是IDOK,那么可以用表5.7列出的CFileDialog类的成员函数来获取与所选文件有关的信息。</span></p>
<p ALIGN="JUSTIFY"><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="CENTER"><span style="font-size: 9pt">表5.7 CFileDialog类辅助成员函数</span></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
<tr>
<td WIDTH="24%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">函数名</span></b></td>
<td WIDTH="76%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用途</span></b></td>
</tr>
<tr>
<td WIDTH="24%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">GetPathName</span></td>
<td WIDTH="76%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">返回一个包含有全路径文件名的CString对象。</span></td>
</tr>
<tr>
<td WIDTH="24%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">GetFileName</span></td>
<td WIDTH="76%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">返回一个包含有文件名(不含路径)的CString对象。</span></td>
</tr>
<tr>
<td WIDTH="24%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">GetFileExt</span></td>
<td WIDTH="76%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">返回一个只含文件扩展名的CString对象。</span></td>
</tr>
<tr>
<td WIDTH="24%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">GetFileTitle</span></td>
<td WIDTH="76%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">返回一个只含文件名(不含扩展名)的CString对象。</span></td>
</tr>
</table>
<b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">5.6.3
CFindReplaceDialog类</font></span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CFindReplaceDialog类用于实现Find(搜索)和Replace(替换)对话框,这两个对话框都是非模态对话框,用于在正文中搜索和替换指定的字符串。图5.14显示了一个Find对话框,图5.15显示了一个Replace对话框。</span></p>
<p ALIGN="center"><span style="font-size: 9pt"><img src="T5_14.gif"
alt="T5_14.tif (55570 bytes)" WIDTH="389" HEIGHT="126"></span></p>
<p ALIGN="center"><span style="font-size: 9pt">图5.14 Find对话框</span></p>
<p ALIGN="center"><span style="font-size: 9pt"><img src="T5_15.gif"
alt="T5_15.tif (69140 bytes)" WIDTH="365" HEIGHT="168"></span></p>
<p ALIGN="center"><span style="font-size: 9pt">图5.15 Replace对话框</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">由于Find和Replace对话框是非模式对话框,它们的创建方式与其它四类公用对话框不同。CFindReplaceDialog对象是用new操作符在堆中创建的,而不是象普通对话框那样以变量的形式创建。要启动Find/Replace对话框,应该调用CFindReplaceDialog::Create函数,而不是DoModal。Create函数的声明是</span></p>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">BOOL Create( BOOL bFindDialogOnly, LPCTSTR
lpszFindWhat, LPCTSTR lpszReplaceWith = NULL, DWORD dwFlags = FR_DOWN, CWnd* pParentWnd =
NULL );</span></p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">当参数bFindDialogOnly的值为TRUE时,创建的是Find对话框,为FALSE时创建的是Replace对话框。参数lpszFindWhat指定了要搜索的字符串,lpszReplaceWith指定了用于替换的字符串。dwFlags用来设置对话框,其缺省值是FR_DOWN(向下搜索),该参数可以是几个FR_XXX常量的组合,用户可以通过该参数来决定诸如是否要显示Match
case、Match Whole Word检查框等设置。参数pParentWnd指明了对话框的父窗口或拥有者窗口。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">Find/Replace对话框与其它公用对话框的另一个不同之处在于它在工作过程中可以重复同一操作而对话框不被关闭,这就方便了频繁的搜索和替换。CFindReplaceDialog类只提供了一个界面,它并不会自动实现搜索和替换功能。CFindReplaceDialog使用了一种特殊的通知机制,当用户按下了操作的按钮后,它会向父窗口发送一个通知消息,父窗口应在该消息的消息处理函数中实现搜索和替换。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CFindReplaceDialog类提供了一组成员函数用来获得与用户操作有关的信息,如表5.8所示,这组函数一般应在通知消息处理函数中调用。</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -