?? 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 + -