?? chap10.html
字號(hào):
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>第四章 基于對(duì)話框的應(yīng)用程序</TITLE>
</HEAD>
<BODY>
<FONT FACE="黑體" LANG="ZH-CN" SIZE=5><P ALIGN="CENTER"><A NAME="_Toc425698722">第十章</FONT><FONT FACE="Arial" SIZE=5> MFC</FONT><FONT FACE="黑體" LANG="ZH-CN" SIZE=5>通用類</A></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>不僅提供了大量的用于編寫(xiě)圖形用戶界面的類,它也包含了許多通用類用于處理字符串、列表、數(shù)組、日期和時(shí)間,有了這些通用類,編寫(xiě)程序時(shí)就可以避免使用復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。例如,由于</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的數(shù)組類能夠自動(dòng)的改變大小,我們?cè)诓恢罃?shù)組維數(shù)的情況下就不必使用一個(gè)大數(shù)組,這樣就可以節(jié)約內(nèi)存,提高程序的運(yùn)行速度。</P>
<P ALIGN="JUSTIFY">本章主要涉及以下內(nèi)容:</P>
<UL>
<P ALIGN="JUSTIFY"><LI>數(shù)組類</LI></P>
<P ALIGN="JUSTIFY"><LI>列表類</LI></P>
<P ALIGN="JUSTIFY"><LI>映射類</LI></P>
<P ALIGN="JUSTIFY"><LI>字符串類</LI></P>
<P ALIGN="JUSTIFY"><LI>日期和時(shí)間類</LI></P></UL>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425698723">第一節(jié)</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>數(shù)組類</A></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的數(shù)組類使你可以創(chuàng)建和操作一個(gè)實(shí)際上可以處理各種數(shù)據(jù)類型的一維數(shù)組對(duì)象。除了</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>可以在運(yùn)行時(shí)動(dòng)態(tài)的增大和縮小數(shù)組對(duì)象外,這些數(shù)組對(duì)象非常象常規(guī)的數(shù)組。這也意味者在聲明數(shù)組對(duì)象時(shí)不必關(guān)心它的維數(shù)。由于</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>可以動(dòng)態(tài)的變大和變小,你不必考慮使用常規(guī)數(shù)組時(shí)出現(xiàn)的內(nèi)存浪費(fèi)。使用常規(guī)數(shù)組時(shí)你必須將其定義成能夠容納所有可能需要的元素,而不管這些元素是否真的被會(huì)使用。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的數(shù)組類包含</FONT><FONT SIZE=3>CByteArray</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CDWordArray</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CPtrArray</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CUIntArray</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CWordArray</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>CStringArray.</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。從這些類的名稱可以看出,每一個(gè)類都被設(shè)計(jì)成能夠處理一個(gè)特定的數(shù)據(jù)類型。例如,在本節(jié)例子中將要用到的</FONT><FONT SIZE=3>CUIntArray</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>類是一個(gè)處理無(wú)符號(hào)整形數(shù)的數(shù)組類,而</FONT><FONT SIZE=3>CObjecArray</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>類代表對(duì)象數(shù)組類。這些數(shù)組類幾乎相同,僅僅的區(qū)別在于它們儲(chǔ)存的數(shù)據(jù)類型不同。如果你學(xué)會(huì)使用其中的一種數(shù)組類的使用,你就學(xué)會(huì)了所有數(shù)組類的使用。</P>
<P ALIGN="JUSTIFY">數(shù)組類有下列成員函數(shù):</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Add</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">在數(shù)組的最后追加一個(gè)元素,可以根據(jù)需要增大數(shù)組大小。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">ElementAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">獲得一個(gè)指向數(shù)組元素的指針</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">FreeExtra</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">釋放不用的數(shù)組內(nèi)存</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">GetAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">獲取數(shù)組內(nèi)指定位置處的值</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">GetSize</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">獲取數(shù)組中包含的元素個(gè)數(shù)</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">GetUpperBound</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">獲取數(shù)組的上界值。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">InsertAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">在數(shù)組的指定位置處插入一個(gè)元素,后面的元素的下標(biāo)加</FONT><FONT SIZE=3>1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">RemoveAll</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">刪除數(shù)組中所有的元素。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">SetAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">設(shè)定數(shù)組指定位置處的值。因?yàn)橹聘锖瘮?shù)不會(huì)增加數(shù)組的大小,故這個(gè)下標(biāo)此時(shí)一定要有效。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">SetAtGrow</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">設(shè)定數(shù)組的指定位置處的值,可以根據(jù)需要增大數(shù)組的大小。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">SetSize</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">設(shè)置數(shù)組的初始大小。</P>
<P ALIGN="JUSTIFY">下面將介紹一個(gè)數(shù)組的程序,這個(gè)程序可以讓你測(cè)試一下</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的數(shù)組類。</P>
<P ALIGN="JUSTIFY">首先,這個(gè)程序在</FONT><FONT SIZE=3>View</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>類中聲明一個(gè)數(shù)組對(duì)象,如下:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">CUIntArray array;</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">接著,在</FONT><FONT SIZE=3>View</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>類的構(gòu)造函數(shù)中初始化數(shù)組,將其設(shè)置成包含十個(gè)元素,</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=1><P>array.SetSize(10, 5);</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">SetSize</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)是數(shù)組的初始大小,第二個(gè)參數(shù)是數(shù)組元素每次增加時(shí)增加的個(gè)數(shù)。</P>
<P ALIGN="JUSTIFY">在設(shè)置完數(shù)組的大小之后,程序等待用戶在窗口中單擊鼠標(biāo)左鍵或右鍵。如果用戶這樣做了,程序?qū)@示一個(gè)合適的對(duì)話框并且處理輸入到對(duì)話框中的數(shù)據(jù)。下面的代碼是該程序的</FONT><FONT SIZE=3>OnLButtonDown</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù),用于處理用戶單擊右鍵的事件。</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=1><P>void CArrayView::OnLButtonDown(UINT nFlags, CPoint point) </P>
<P>{</P>
<P> CArrayAddDlg dialog(this);</P>
<P> dialog.m_index = 0;</P>
<P> dialog.m_value = 0;</P>
<P> dialog.m_radio = 0;</P>
<P> int result = dialog.DoModal();</P>
<P> if (result == IDOK)</P>
<P> {</P>
<P> if (dialog.m_radio == 0)</P>
<P> array.SetAtGrow(dialog.m_index, dialog.m_value);</P>
<P> else if (dialog.m_radio == 1)</P>
<P> array.InsertAt(dialog.m_index, dialog.m_value, 1);</P>
<P> else</P>
<P> </P>
<P>array.Add(dialog.m_value);</P>
<P> Invalidate();</P>
<P> }</P>
<P> CView::OnLButtonDown(nFlags, point);</P>
<P>}</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">這段代碼開(kāi)始先創(chuàng)建一個(gè)對(duì)話框?qū)ο蟛⒊跏蓟H绻脩暨x擇對(duì)話框的“確定”按鈕,</FONT><FONT SIZE=3>OnLButton</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù)將檢查對(duì)話框的成員變量</FONT><FONT SIZE=3>m_radio</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。值為</FONT><FONT SIZE=3>0</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>表示第一個(gè)單選按鈕(設(shè)置)被選中,值為</FONT><FONT SIZE=3>1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>表示第二個(gè)單選按鈕(插入)被選中,值為</FONT><FONT SIZE=3>2</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>表示第三個(gè)單選按鈕(添加)被選中。</P>
<P ALIGN="JUSTIFY">如果用戶希望設(shè)置數(shù)組的元素,程序?qū)⒄{(diào)用</FONT><FONT SIZE=3>SetAtGrow</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù),它需要兩個(gè)參數(shù),一個(gè)是數(shù)組元素的下標(biāo)值,另一個(gè)是希望設(shè)置的值。它不象常規(guī)的</FONT><FONT SIZE=3>SetAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù),用戶必須使用當(dāng)前有效的數(shù)組下標(biāo)值。</FONT><FONT SIZE=3>SetAtGrow</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()為了設(shè)置指定位置處的值將根據(jù)需要增大數(shù)組的大小。</P>
<P ALIGN="JUSTIFY">當(dāng)用戶選擇了“插入”單選按鈕,程序?qū)⒄{(diào)用</FONT><FONT SIZE=3>InsertAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù),它需要兩個(gè)參數(shù),一個(gè)是要插入的數(shù)組元素的下標(biāo),另一個(gè)是該數(shù)組元素的值。這將在指定位置處創(chuàng)建一個(gè)新的數(shù)組元素,并將把后面的元素往后推。最后當(dāng)用戶選擇了“添加”按鈕,程序?qū)⒄{(diào)用</FONT><FONT SIZE=3>Add()</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>函數(shù),這將在數(shù)組的后面添加一個(gè)元素。對(duì)</FONT><FONT SIZE=3>Invalidate</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()的調(diào)用將使程序重新顯示數(shù)據(jù)。</P>
<P ALIGN="JUSTIFY">下面的</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù)讀取并顯示數(shù)組。</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=1><P>void CArrayView::OnDraw(CDC* pDC)</P>
<P>{</P>
<P> CArrayDoc* pDoc = GetDocument();</P>
<P> ASSERT_VALID(pDoc);</P>
<P> // Get the current font's height.</P>
<P> TEXTMETRIC textMetric;</P>
<P> pDC->GetTextMetrics(&textMetric);</P>
<P> int fontHeight = textMetric.tmHeight;</P>
<P> // Get the size of the array. </P>
<P> int count = array.GetSize();</P>
<P> int displayPos = 10;</P>
<P> // Display the array data.</P>
<P> </P>
<P>for (int x=0; x<count; ++x)</P>
<P> {</P>
<P> UINT value = array.GetAt(x);</P>
<P> char s[81];</P>
<P> wsprintf(s, "Element %d contains the value %u.", x, value);</P>
<P> pDC->TextOut(10, displayPos, s);</P>
<P> displayPos += fontHeight;</P>
<P> }</P>
<P>}</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">這里,程序首先獲得當(dāng)前字體的高度,然后程序通過(guò)調(diào)用</FONT><FONT SIZE=3>GetSize</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù)獲得數(shù)組元素的個(gè)數(shù)。最后,使用數(shù)組元素的個(gè)數(shù)控制一個(gè)</FONT><FONT SIZE=3>for</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>循環(huán),調(diào)用</FONT><FONT SIZE=3>GetAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù)獲得當(dāng)前下標(biāo)處的數(shù)組元素的值。為了顯示程序?qū)?shù)組元素的值轉(zhuǎn)化成字符串。</P>
<P ALIGN="JUSTIFY">程序的</FONT><FONT SIZE=3>OnRButtonDown</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù)用來(lái)響應(yīng)用戶按下鼠標(biāo)右鍵的事件,此函數(shù)用來(lái)處理刪除數(shù)組元素的任務(wù)。下面是該函數(shù)的代碼:</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=1><P>void CArrayView::OnRButtonDown(UINT nFlags, CPoint point) </P>
<P>{</P>
<P>	// TODO: Add your message handler code here and/or call default</P>
<P> CArrayRemoveDlg dialog(this);</P>
<P> dialog.m_radio= 1;</P>
<P> dialog.m_index= 0;</P>
<P> int result = dialog.DoModal();</P>
<P> if (result == IDOK)</P>
<P> {</P>
<P> if (dialog.m_radio==0)</P>
<P> 		array.RemoveAll();</P>
<P> else</P>
<P> array.RemoveAt(dialog.m_index);</P>
<P> Invalidate();</P>
<P> }</P>
<P>	CView::OnRButtonDown(nFlags, point);</P>
<P>}</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在這個(gè)函數(shù)中,當(dāng)顯示完對(duì)話框后,程序檢查對(duì)話框的成員變量</FONT><FONT SIZE=3>m_removeAll</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。如果這個(gè)值為真意味著用戶希望刪除數(shù)組中所有的元素。這種情況下,程序調(diào)用數(shù)組類的成員函數(shù)</FONT><FONT SIZE=3>RemoveAll</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()。否則,程序?qū)⒄{(diào)用</FONT><FONT SIZE=3>RemoveAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()刪除指定位置處的數(shù)組元素。最后調(diào)用</FONT><FONT SIZE=3>Invalidate</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數(shù)刷新數(shù)據(jù)顯示。</P>
<P ALIGN="JUSTIFY">下面將介紹對(duì)話框類</FONT><FONT SIZE=3>CArrayAddDlg</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,按照下面的步驟創(chuàng)建這個(gè)對(duì)話框類。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">1.	</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>創(chuàng)建如圖</FONT><FONT SIZE=3>10.1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>所示的對(duì)話框,</FONT><FONT SIZE=3>3</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>個(gè)單選按鈕的</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>分別為</FONT><FONT SIZE=3>IDC_ADD0</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>IDC_ADD1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>IDC_ADD2</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="CENTER"><IMG SRC="Image292.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image292.gif" WIDTH=247 HEIGHT=154></P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">圖</FONT><FONT SIZE=1>10. 1 </FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=1>添加元素對(duì)話框</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.	</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>ClassWizard</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>中為兩個(gè)文本框映射兩個(gè)</FONT><FONT SIZE=3>UINT</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>類型的變量</FONT><FONT SIZE=3>m_index</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>m_value</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">3.	</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>給該對(duì)話框添加一個(gè)</FONT><FONT SIZE=3>UINT</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>類型的成員變量</FONT><FONT SIZE=3>m_radio</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">4.	</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>為</FONT><FONT SIZE=3>WM_INITDIALOG</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>添加函數(shù)</FONT><FONT SIZE=3>OnInitDialog()</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,在其中設(shè)置單選按鈕的初始狀態(tài)。</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=1><P>BOOL CArrayAddDlg::OnInitDialog() </P>
<P>{</P>
<P>	CDialog::OnInitDialog();</P>
<P>	</P>
<P>	// TODO: Add extra initialization here</P>
<P>	((CButton*)GetDlgItem(IDC_ADD0))->SetCheck(1);</P>
<P>	return TRUE; // return TRUE unless you set the focus to a control</P>
<P>	 // EXCEPTION: OCX Property Pages should return FALSE</P>
<P>}</P>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -