對C++ MFC實驗的分析與思考

寫在前邊

????????第一次在簡書上寫文章,因為總覺得學(xué)習(xí)過程必須要有所記錄。不管是所見還是所想,留下記錄才能說明自己沒有白學(xué)。

項目介紹

? ? ? ? 這篇文章是關(guān)于我自己選的C++這門課程中一個項目進行的思考與分析。項目介紹如下:

項目名稱

基于MFC的C++桌面應(yīng)用開發(fā)

項目內(nèi)容

一位小學(xué)教師Ken希望完成這樣的任務(wù):針對于小學(xué)生正在學(xué)習(xí)四邊形(quadrangle)的特性,編寫一個小軟件,能夠隨機在屏幕上顯示矩形(rectangle)、正方形(square)、平行四邊形(parallelogram)、梯形(trapezoid)和菱形(diamond)五種形體之一,同時顯示該形體的特性和關(guān)鍵數(shù)據(jù)(隨機產(chǎn)生),學(xué)生復(fù)習(xí)形體的特性,然后根據(jù)給出的關(guān)鍵數(shù)據(jù)計算形體的面積,軟件判斷其結(jié)果的正確性。在學(xué)習(xí)過程中,軟件記錄產(chǎn)生的每一個形體,在學(xué)生選擇不再繼續(xù)后,將其學(xué)習(xí)的過程重放一遍,用以重溫,加深印象。

????具體的項目要求就不再描述,可以知道的是開發(fā)桌面應(yīng)用、形體對象、隨機數(shù)據(jù),記錄形體這幾個關(guān)鍵詞,那么接下來對項目進行簡單的分析。

開發(fā)基礎(chǔ)

? ? 實驗已經(jīng)提供了一個程序的框架,里邊主要包含了Canvas、experiment、experimentDlg三個文件的聲明與實現(xiàn)的文件(.h文件與.cpp文件,一個聲明,一個實現(xiàn)),其中experiment文件定義和實現(xiàn)了類的行為,我理解為各個控件(按鈕、編輯框等)的可執(zhí)行操作;experimentDlg文件定義和實現(xiàn)了類各個行為的觸發(fā)事件,比如點擊關(guān)閉按鈕程序會關(guān)閉,點擊開始學(xué)習(xí)按鈕會開始顯示形體等;Canvas文件實現(xiàn)的是形體圖形輸出的操作。其他文件比如stdafx是一些常用的庫文件,其他的常用的并且不常更改的聲明等,resource.h是控件的符號定義。

接下來是講如何進行MFC開發(fā)。

首先我們重新建一個MFC項目,可以看到里邊包含的文件如下:

????????可以看到和之前的分析一樣,只是少了一個Canvas文件。

我們點擊資源視圖(Ctrl+Shift+E),并打開DIALOG:

? ? ? ? 可以看到如下界面:

設(shè)計界面

????????這就是界面設(shè)計的界面,我們可以在旁邊的工具欄添加新的控件,也可以在這里編輯控件的屬性,并且對控件的更改和操作系統(tǒng)都會體現(xiàn)在代碼里而不必由自己去修改。

工具箱:可以添加控件

? ? ? ? 開發(fā)MFC的過程就是先建立工程文件->編輯主界面->設(shè)置控件屬性->設(shè)置觸發(fā)事件->DEBUG->發(fā)布

? ? ? ? 那么現(xiàn)在來看看怎樣設(shè)置控件屬性,以按鈕為例,先單擊按鈕,右鍵選擇屬性,右邊會出現(xiàn)如下欄:

? ? ? ? 從圖中可以看到很多關(guān)于按鈕的屬性,這個可以自己去看,其中的Caption屬性是按鈕的描述字符串,和按鈕顯示的文字是一樣的,因此這個可以修改為自己想要的。

? ? ? ? 其他控件類似,可以自己根據(jù)需要去設(shè)置控件屬性,不作具體介紹。

????????接下來看設(shè)置觸發(fā)事件,以按鈕為例,雙擊開始按鈕,跳到如下位置:

? ? ? ? 可以看到這個函數(shù)的名稱OnClickedButtonStop(),即當(dāng)點擊STOP按鈕時;那代表著當(dāng)點擊了這個按鈕就會執(zhí)行函數(shù)里的代碼。我們看一下完整的函數(shù)代碼:



????????首先是點擊了按鈕,切換當(dāng)前的模式,如果是學(xué)習(xí)模式則切換為非學(xué)習(xí)模式,如果是非學(xué)習(xí)模式則切換為學(xué)習(xí)模式,接下來根據(jù)模式來執(zhí)行不一樣的代碼,enable變量為使能變量,先不解釋。然后我們看到這行代碼:

????????GetDlgItem可以根據(jù)元素的符號獲得其句柄,通過句柄可以在代碼中控制控件的屬性。這里獲取的是IDC_BUTTON_STOP這個符號的控件,看看上邊那個按鈕的屬性圖,左上角屬性下一行控件的符號就是IDC_BUTTON_STOP,因此這里是獲取這個按鈕的句柄。然后定義了一個字符串類s,從這個按鈕中讀取了它的描述字符串到s中,就是之前的“開始”字符串。

? ? ? ? 然后是接下來的代碼:

? ? ? ? 當(dāng)s等于“開始”時,點擊完應(yīng)該變?yōu)椤皬?fù)習(xí)”,因此用SetWindowText宏來設(shè)置描述字符串,然后開始學(xué)習(xí)以后應(yīng)該生成形體,這個交給OnclickedButtonNext函數(shù),應(yīng)為點擊開始后的事件和每答完一道題點擊下一題后的事件是一樣的,因此后續(xù)事件交給這個函數(shù)去執(zhí)行。

? ? ? ? 下一段代碼:

? ? ? ? 當(dāng)s不等于“開始”時,即等于“復(fù)習(xí)”的時候,點擊按鈕表示進入復(fù)習(xí)狀態(tài),這個時候按鈕應(yīng)該又變回到“開始”描述字符串,所以再次用SetWindowText宏設(shè)置按鈕屬性,然后是關(guān)于lastDone變量的判斷,這個變量表示的是當(dāng)前顯示的題目是否已經(jīng)提交了正確答案,如下圖所示:

在提交了答案時,這個形體應(yīng)該加入鏈表中,但是如果沒有提交正確答案,則不應(yīng)該加入鏈表,因此當(dāng)lastDone為False時,應(yīng)該把最后一個形體給刪除掉。

復(fù)習(xí)的時候,輸出界面應(yīng)該要顯示所有的已經(jīng)學(xué)習(xí)過的形體,因此需要定義輸出界面的大小SetScrollSizes函數(shù)定義了寬度為500,長度為形體數(shù)量乘以120,。顯示效果如下:

? ? ? ? 接下來的代碼就是當(dāng)鏈表為空時表示還沒有學(xué)習(xí)過,必須先學(xué)習(xí)后才能復(fù)習(xí),當(dāng)學(xué)習(xí)過以后,用traverse函數(shù)遍歷生成所有的形體。

? ? ? ? 然后重新更新Canvas對象。當(dāng)點擊開始或者點擊下一題時,我們還沒有輸入答案提交,應(yīng)該保證下一題按鈕是不可點擊的,提交答案按鈕為可點擊的,因此在接下來的代碼中設(shè)置了這一個屬性,同樣是先獲取按鈕的句柄,然后通過句柄進行設(shè)置。

????????所有的按鈕都會有觸發(fā)事件,首先需要定義好系統(tǒng)的流程圖,根據(jù)結(jié)構(gòu)圖定義各個觸發(fā)事件,定義好以后編譯通過就可以了。


? ? ? ? 這個項目主要的任務(wù)有:

1.編寫五個形體類,并合理定義好其繼承關(guān)系以及定義好接口。

2.編寫List類,用于存放形體對象

3.編譯調(diào)試通過


? ? ? ? 注意事項:

1.實驗不要求自己去畫形體圖像,所有的形體圖像都是定義好的,即所有的梯形都是一個樣子的,不會隨著特征值而變化,接口在Canvas中定義和實現(xiàn),只需要完成的是形體圖像下邊的那一行描述文字。

2.必須要保證形體的接口和其他已有代碼的接口一致才能編譯。

3.一定要先畫系統(tǒng)的結(jié)構(gòu)圖!?。?/b>


寫在最后

完整代碼:github.com/hexueyuan/MFCprobject

視頻演示:video.tudou.com/v/XMzIyNTI4ODY1Ng==.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容