?? chap10.html
字號:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>第四章 基于對話框的應用程序</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>不僅提供了大量的用于編寫圖形用戶界面的類,它也包含了許多通用類用于處理字符串、列表、數組、日期和時間,有了這些通用類,編寫程序時就可以避免使用復雜的數據結構。例如,由于</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的數組類能夠自動的改變大小,我們在不知道數組維數的情況下就不必使用一個大數組,這樣就可以節約內存,提高程序的運行速度。</P>
<P ALIGN="JUSTIFY">本章主要涉及以下內容:</P>
<UL>
<P ALIGN="JUSTIFY"><LI>數組類</LI></P>
<P ALIGN="JUSTIFY"><LI>列表類</LI></P>
<P ALIGN="JUSTIFY"><LI>映射類</LI></P>
<P ALIGN="JUSTIFY"><LI>字符串類</LI></P>
<P ALIGN="JUSTIFY"><LI>日期和時間類</LI></P></UL>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425698723">第一節</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>數組類</A></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的數組類使你可以創建和操作一個實際上可以處理各種數據類型的一維數組對象。除了</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>可以在運行時動態的增大和縮小數組對象外,這些數組對象非常象常規的數組。這也意味者在聲明數組對象時不必關心它的維數。由于</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>可以動態的變大和變小,你不必考慮使用常規數組時出現的內存浪費。使用常規數組時你必須將其定義成能夠容納所有可能需要的元素,而不管這些元素是否真的被會使用。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的數組類包含</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>。從這些類的名稱可以看出,每一個類都被設計成能夠處理一個特定的數據類型。例如,在本節例子中將要用到的</FONT><FONT SIZE=3>CUIntArray</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>類是一個處理無符號整形數的數組類,而</FONT><FONT SIZE=3>CObjecArray</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>類代表對象數組類。這些數組類幾乎相同,僅僅的區別在于它們儲存的數據類型不同。如果你學會使用其中的一種數組類的使用,你就學會了所有數組類的使用。</P>
<P ALIGN="JUSTIFY">數組類有下列成員函數:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Add</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">在數組的最后追加一個元素,可以根據需要增大數組大小。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">ElementAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">獲得一個指向數組元素的指針</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">FreeExtra</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">釋放不用的數組內存</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">GetAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">獲取數組內指定位置處的值</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">GetSize</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">獲取數組中包含的元素個數</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">GetUpperBound</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">獲取數組的上界值。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">InsertAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">在數組的指定位置處插入一個元素,后面的元素的下標加</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">刪除數組中所有的元素。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">SetAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">設定數組指定位置處的值。因為制革函數不會增加數組的大小,故這個下標此時一定要有效。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">SetAtGrow</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">設定數組的指定位置處的值,可以根據需要增大數組的大小。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">SetSize</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()</P>
<P ALIGN="JUSTIFY">設置數組的初始大小。</P>
<P ALIGN="JUSTIFY">下面將介紹一個數組的程序,這個程序可以讓你測試一下</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的數組類。</P>
<P ALIGN="JUSTIFY">首先,這個程序在</FONT><FONT SIZE=3>View</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>類中聲明一個數組對象,如下:</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>類的構造函數中初始化數組,將其設置成包含十個元素,</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>()函數有兩個參數,第一個參數是數組的初始大小,第二個參數是數組元素每次增加時增加的個數。</P>
<P ALIGN="JUSTIFY">在設置完數組的大小之后,程序等待用戶在窗口中單擊鼠標左鍵或右鍵。如果用戶這樣做了,程序將顯示一個合適的對話框并且處理輸入到對話框中的數據。下面的代碼是該程序的</FONT><FONT SIZE=3>OnLButtonDown</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數,用于處理用戶單擊右鍵的事件。</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">這段代碼開始先創建一個對話框對象并初始化。如果用戶選擇對話框的“確定”按鈕,</FONT><FONT SIZE=3>OnLButton</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數將檢查對話框的成員變量</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>表示第一個單選按鈕(設置)被選中,值為</FONT><FONT SIZE=3>1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>表示第二個單選按鈕(插入)被選中,值為</FONT><FONT SIZE=3>2</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>表示第三個單選按鈕(添加)被選中。</P>
<P ALIGN="JUSTIFY">如果用戶希望設置數組的元素,程序將調用</FONT><FONT SIZE=3>SetAtGrow</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數,它需要兩個參數,一個是數組元素的下標值,另一個是希望設置的值。它不象常規的</FONT><FONT SIZE=3>SetAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數,用戶必須使用當前有效的數組下標值。</FONT><FONT SIZE=3>SetAtGrow</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()為了設置指定位置處的值將根據需要增大數組的大小。</P>
<P ALIGN="JUSTIFY">當用戶選擇了“插入”單選按鈕,程序將調用</FONT><FONT SIZE=3>InsertAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數,它需要兩個參數,一個是要插入的數組元素的下標,另一個是該數組元素的值。這將在指定位置處創建一個新的數組元素,并將把后面的元素往后推。最后當用戶選擇了“添加”按鈕,程序將調用</FONT><FONT SIZE=3>Add()</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>函數,這將在數組的后面添加一個元素。對</FONT><FONT SIZE=3>Invalidate</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()的調用將使程序重新顯示數據。</P>
<P ALIGN="JUSTIFY">下面的</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數讀取并顯示數組。</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">這里,程序首先獲得當前字體的高度,然后程序通過調用</FONT><FONT SIZE=3>GetSize</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數獲得數組元素的個數。最后,使用數組元素的個數控制一個</FONT><FONT SIZE=3>for</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>循環,調用</FONT><FONT SIZE=3>GetAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數獲得當前下標處的數組元素的值。為了顯示程序將數組元素的值轉化成字符串。</P>
<P ALIGN="JUSTIFY">程序的</FONT><FONT SIZE=3>OnRButtonDown</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數用來響應用戶按下鼠標右鍵的事件,此函數用來處理刪除數組元素的任務。下面是該函數的代碼:</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">在這個函數中,當顯示完對話框后,程序檢查對話框的成員變量</FONT><FONT SIZE=3>m_removeAll</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>。如果這個值為真意味著用戶希望刪除數組中所有的元素。這種情況下,程序調用數組類的成員函數</FONT><FONT SIZE=3>RemoveAll</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()。否則,程序將調用</FONT><FONT SIZE=3>RemoveAt</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()刪除指定位置處的數組元素。最后調用</FONT><FONT SIZE=3>Invalidate</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>()函數刷新數據顯示。</P>
<P ALIGN="JUSTIFY">下面將介紹對話框類</FONT><FONT SIZE=3>CArrayAddDlg</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,按照下面的步驟創建這個對話框類。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">1.	</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>創建如圖</FONT><FONT SIZE=3>10.1</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>所示的對話框,</FONT><FONT SIZE=3>3</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>個單選按鈕的</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>添加元素對話框</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>中為兩個文本框映射兩個</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>給該對話框添加一個</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>添加函數</FONT><FONT SIZE=3>OnInitDialog()</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,在其中設置單選按鈕的初始狀態。</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>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -