版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、10.1 Windows消息與命令消息與命令10.2 單文檔與多文檔程序單文檔與多文檔程序10.3 對(duì)話框與常用組件對(duì)話框與常用組件10.4 通用對(duì)話框與通用對(duì)話框與Windows 95控件控件第第 10 章章 Windows用戶(hù)界面用戶(hù)界面返回主目錄10.1 Windows消息與命令消息與命令 10.1.1 消息驅(qū)動(dòng)機(jī)制消息驅(qū)動(dòng)機(jī)制 消息是一種報(bào)告有關(guān)事件發(fā)生的通知,類(lèi)似于DOS下的用戶(hù)輸入。Windows應(yīng)用程序是由消息驅(qū)動(dòng)的。Windows操作系統(tǒng)允許多個(gè)任務(wù)同時(shí)運(yùn)行,應(yīng)用程序的輸入輸出由Windows統(tǒng)一管理;Windows系統(tǒng)下每一個(gè)窗口都維護(hù)一個(gè)消息隊(duì)列,操作系統(tǒng)接收和管理所有輸入
2、消息、系統(tǒng)消息,并把它們發(fā)送給相應(yīng)窗口的消息隊(duì)列。應(yīng)用程序初始化完成后,進(jìn)入消息循環(huán),維護(hù)自己的消息隊(duì)列,從中取出消息,對(duì)其進(jìn)行處理。編寫(xiě)消息處理函數(shù)是Windows編程的主要工作之一。 Windows應(yīng)用程序的消息來(lái)源有以下四種: (1) 輸入消息:包括鍵盤(pán)和鼠標(biāo)的輸入。這一類(lèi)消息首先放在系統(tǒng)消息隊(duì)列中,然后由Windows將它們送入應(yīng)用程序消息隊(duì)列中,由應(yīng)用程序來(lái)處理消息。 (2) 控制消息:用來(lái)與Windows的控制對(duì)象,如列表框、按鈕、檢查框等進(jìn)行雙向通信。當(dāng)用戶(hù)在列表框中改動(dòng)當(dāng)前選擇或改變了檢查框的狀態(tài)時(shí)發(fā)出此類(lèi)消息。這類(lèi)消息一般不經(jīng)過(guò)應(yīng)用程序消息隊(duì)列,而是直接發(fā)送到控制對(duì)象上去。
3、(3) 系統(tǒng)消息:對(duì)程序化的事件或系統(tǒng)時(shí)鐘中斷作出反應(yīng)。一些系統(tǒng)消息,像DDE消息(動(dòng)態(tài)數(shù)據(jù)交換消息)要通過(guò)Windows的系統(tǒng)消息隊(duì)列,而有的則不通過(guò)系統(tǒng)消息隊(duì)列而直接送入應(yīng)用程序的消息隊(duì)列,如創(chuàng)建窗口消息。 (4) 用戶(hù)消息:這是程序員自己定義并在應(yīng)用程序中主動(dòng)發(fā)出的,一般由應(yīng)用程序的某一部分內(nèi)部處理。 基于MFC類(lèi)庫(kù)的應(yīng)用程序完成初始化后,調(diào)用Run( )函數(shù)進(jìn)入消息循環(huán)。在CWnd類(lèi)(所有窗口類(lèi)的基類(lèi))中預(yù)定義標(biāo)準(zhǔn)Windows消息的處理函數(shù),處理函數(shù)的名稱(chēng)以“On”開(kāi)始,用戶(hù)可以根據(jù)需要重寫(xiě)這些函數(shù)。 在CWnd類(lèi)中,標(biāo)準(zhǔn)Windows消息的處理函數(shù)聲明都帶有afx_msg關(guān)鍵字,例
4、如消息 WM_PAINT的處理函數(shù)被聲明為: afx_msg void OnPaint( ); 關(guān)鍵字afx_msg用于把消息處理函數(shù)與其它CWnd成員函數(shù)分開(kāi),這些函數(shù)是通過(guò)消息映射實(shí)現(xiàn)的,依賴(lài)于標(biāo)準(zhǔn)的預(yù)處理宏。預(yù)處理之后,關(guān)鍵字afx_msg的位置就變成了空白。以全局對(duì)象theApp為例,其中的消息映射如下: BEGIN_MESSAGE_MAP(CEx01App, CWinApp) /AFX_MSG_MAP(CEx01App)ON_COMMAND(ID_APP_ABOUT, OnAppAbout) / 注意:ClassWizard(類(lèi)向?qū)В⒖赡芴砑踊騽h除消息映射宏/AFX_MSG_MAP
5、/ 標(biāo)準(zhǔn)的基于文檔的文件命令O N _ C O M M A N D ( I D _ F I L E _ N E W , CWinApp:OnFileNew)O N _ C O M M A N D ( I D _ F I L E _ O P E N , CWinApp:OnFileOpen)/ 標(biāo)準(zhǔn)的打印設(shè)置命令ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp:OnFilePrintSetup)END_MESSAGE_MAP( ) 其 中 的 B E G I N _ M E S S A G E _ M A P 和END_MESSAGE_MAP都是預(yù)處理宏,用于聲明消
6、息映射的開(kāi)始和結(jié)束。而在類(lèi)中重新修改的消息處理函數(shù)聲明形式為:/Generated message map functionsprotected:/AFX_MSG(CEx01Ciew)afx_msg void OnPaint( );/AFX_MSGDECLARE_MESSAGE_MAP( ) 最后的DECLARE_MESSAGE_MAP宏,聲明在該類(lèi)中使用消息映射。 10.1.2 應(yīng)用程序菜單應(yīng)用程序菜單 Windows菜單是應(yīng)用程序命令項(xiàng)列表,菜單項(xiàng)可以是文字或位圖。通過(guò)選擇菜單項(xiàng)使應(yīng)用程序完成與菜單項(xiàng)相關(guān)的命令。 下面通過(guò)一個(gè)例子來(lái)介紹如何在應(yīng)用程序中建立新菜單、如何在菜單中加入新的菜單項(xiàng)
7、、如何為菜單項(xiàng)建立相應(yīng)的命令處理函數(shù)以實(shí)現(xiàn)消息映射。 首先看看如何在已有的下拉菜單中增加一個(gè)菜單項(xiàng)。 第一步,編輯菜單項(xiàng)資源,步驟如下: (1) 運(yùn)行AppWizard創(chuàng)建Ex02(參看9.5.2 節(jié)的“利用AppWizard建立一個(gè)新項(xiàng)目”),選中“Single document”(單文檔SDI)單選項(xiàng)后,直接按下Finish按鈕。 (2) 在項(xiàng)目工作區(qū)窗口中打開(kāi)ResourceView(資源視圖)。 (3) 雙擊該視圖中的Menu圖標(biāo),展開(kāi)菜單資源。 (4) 雙擊IDR_MAINFRAME,打開(kāi)菜單編輯器,如圖10.1所示。 (5) 可以看到,在“文件”菜單的最下方有一個(gè)空白菜單項(xiàng),用戶(hù)可
8、以編輯這個(gè)菜單項(xiàng)來(lái)添加菜單項(xiàng)。也可以單擊某個(gè)菜單項(xiàng),然后按鍵盤(pán)上的Insert鍵,在選定的菜單項(xiàng)前面插入一個(gè)新的菜單項(xiàng)。 (6) 雙擊空白菜單項(xiàng),打開(kāi)Menu Item Properties對(duì)話框,如圖10.2所示。圖10.1 菜單編輯器圖10.2 Menu Item Properties對(duì)話框 (7) 在Caption文本框中輸入新菜單項(xiàng)名,輸入的名字是“Demo”。在ID組合框中輸入新菜單項(xiàng)的ID。注意,這個(gè)ID必須是唯一的,不能和別的ID重名。一般菜單項(xiàng)ID的命令規(guī)則是:ID_菜單名_菜單項(xiàng)名。因此將該菜單項(xiàng)命名為ID_FILE_DEMO。 (8) 關(guān)閉該對(duì)話框,新的菜單項(xiàng)已經(jīng)添加到原有
9、的菜單中。運(yùn)行這個(gè)程序可以看到,在“文件”菜單的最下方有一個(gè)“Demo”菜單項(xiàng),如圖10.3所示。 注意:這里選SDI類(lèi)型,一是為了簡(jiǎn)化程序設(shè)計(jì),二是想讓讀者對(duì)比SDI應(yīng)用程序(如本例的Ex02)和MDI應(yīng)用程序(如第9章的Ex01)在外觀和使用上的一些區(qū)別,對(duì)SDI和MDI有一個(gè)簡(jiǎn)單了解。關(guān)于SDI和MDI應(yīng)用程序?qū)⒃诤罄m(xù)章節(jié)中向讀者詳細(xì)介紹。 第二步,進(jìn)行消息映射。圖10.3中Demo菜單項(xiàng)是灰色的,不可用,因?yàn)樗鼪](méi)有命令處理函數(shù)。為此必須要對(duì)菜單項(xiàng)進(jìn)行消息映射,為新的菜單項(xiàng)建立處理函數(shù)。操作步驟如下: (1)在View菜單中選擇Class Wizard選項(xiàng)或使用加速鍵Ctrl+W,打開(kāi)C
10、lassWizard對(duì)話框,選中其中的Message Maps選項(xiàng)卡,如圖10.4所示。 (2)在Class Name下拉列表框中選擇CEx02View。 (3)在Object IDs列表框中選擇菜單項(xiàng)Demo的ID,即ID_FILE_DEMO。 (4)在Messages列表框中單擊COMMAND,此時(shí)Add Function按鈕變亮,表示可以 圖10.3 添加了Demo菜單項(xiàng)的應(yīng)用程序圖10.4 ClassWizard 的Message Maps選項(xiàng)卡 添加處理函數(shù)。單擊Add Function按鈕或雙擊COMMAND,彈出Add Member Function對(duì)話框,如圖10.5所示。 在
11、Member function name編輯框中給出了系統(tǒng)推薦使用的函數(shù)名是OnFileDemo。通??梢允褂眠@個(gè)缺省的名字,如果有特殊需要也可以修改它。單擊OK按鈕,這時(shí)可以在Member functions列表框中看到Demo菜單項(xiàng)的處理函數(shù)已經(jīng)創(chuàng)建,如圖10.6所示。也就是說(shuō),當(dāng)用戶(hù)選擇Demo菜單項(xiàng)時(shí),應(yīng)用程序?qū)⒄{(diào)用OnFileDemo函數(shù)實(shí)現(xiàn)消息映射。 在圖10.6中單擊OK按鈕完成消息映射。 圖10.5 Add Member Function對(duì)話框圖10.6 創(chuàng)建Demo的處理函數(shù)OnFileDemo 第三步,編寫(xiě)響應(yīng)程序代碼。現(xiàn)在為OnFileDemo函數(shù)編寫(xiě)實(shí)際的處理程序。比如
12、,當(dāng)用戶(hù)選擇菜單項(xiàng)Demo時(shí),在窗口中顯示“您選擇了Demo菜單項(xiàng)。”信息。操作步驟如下: (1) 在文檔類(lèi)CEx02Doc中聲明一個(gè)CString對(duì)象m_String。從上一章可以知道,程序中的文檔對(duì)象用于存儲(chǔ)在視圖中的數(shù)據(jù),因此這里選擇在文檔類(lèi)中創(chuàng)建字符串對(duì)象。 在項(xiàng)目工作區(qū)工作區(qū)中選ClassView類(lèi)視圖,雙擊CEx02Doc,打開(kāi)類(lèi)編輯器,如圖10.7所示。對(duì)CEx02Doc.h頭文件中修改CEx02Doc類(lèi)的定義: class CEx02Doc : public CDocument protected: / create from serialization onlyCEx02Do
13、c( );DECLARE_DYNCREATE(CEx02Doc)CString m_String;/輸入本行內(nèi)容 程序中的黑體字部分表示需要輸入的內(nèi)容,本書(shū)下面章節(jié)的片段中均使用此方法。“m_”前綴聲明成員變量是Visual C+的標(biāo)準(zhǔn),讀者應(yīng)該習(xí)慣于使用這種變量聲明方法。 (2) 在CEx02Doc的構(gòu)造函數(shù)中初始化m_String。在類(lèi)視圖中單擊文檔類(lèi)CEx02Doc前面的“+”,將其展開(kāi)。雙擊CEx02Doc( )函數(shù),將會(huì)在正文窗口內(nèi)打開(kāi)代碼編輯器。對(duì)CEx02Doc( )函數(shù)編輯如下:CEx02Doc:CEx02Doc( ) / TODO: add one-time construc
14、tion code here m_String=; /輸入本行內(nèi)容 (3) 編輯OnFileDemo( )函數(shù),將m_String賦值為“您選擇了Demo菜單項(xiàng)?!薄T趫D10.6(若在屏幕上看不到它,按下Ctrl+W加速鍵)的Member function列表框中單擊OnFileDemo,然后按下Edit Code按鈕或雙擊OnFileDemo, 出現(xiàn)Ex02View.cpp代 碼 編 輯 窗 口 , 并 且 光 標(biāo) 已 經(jīng) 處 于 需 要 編 輯 的 函 數(shù)OnFileDemo中。編輯OnFileDemo( )函數(shù): void CEx02View:OnFileDemo( ) / TODO:
15、Add your command handler code hereCEx02Doc* pDoc=GetDocument( ); /輸入以下四行內(nèi)容ASSERT_VALID(pDoc);pDoc-m_String=您選擇了Demo菜單項(xiàng)。;Invalidate( ); 由于對(duì)象m_String處于文檔類(lèi)CEx02Doc中,要在視圖類(lèi)中對(duì)這一對(duì)象進(jìn)行存取,必須先獲得一個(gè)指向文檔對(duì)象的指針,這可通過(guò)GetDocument函數(shù)完成。ASSERT_VALID( )函數(shù)則用于確保一定能獲取該指針,這是Visual C+的技術(shù),如果不使用這一函數(shù),可能會(huì)產(chǎn)生錯(cuò)誤信息。Invalidate( )函數(shù)使客戶(hù)區(qū)
16、內(nèi)容失效,強(qiáng)迫程序調(diào)用OnDraw( )函數(shù),重新繪制視圖。 (4) 用OnDraw()函數(shù)重新繪制客戶(hù)區(qū)。視圖對(duì)象管理程序客戶(hù)區(qū),對(duì)客戶(hù)區(qū)的繪制工作由成員函數(shù)OnDraw( )完成。幾乎所有應(yīng)用程序的繪制工作都通過(guò)這一函數(shù)實(shí)現(xiàn),編程時(shí)必須修改這個(gè)函數(shù)。 在項(xiàng)目工作區(qū)中單擊類(lèi)視圖中CEx02View前面的“+”將其展開(kāi),雙擊OnDraw( )函數(shù),打開(kāi)CEx02View.cpp編輯窗口,光標(biāo)位于OnDraw( )函數(shù)中。按下述內(nèi)容對(duì)OnDraw函數(shù)進(jìn)行編輯:void CEx02View:OnDraw(CDC* pDC)CEx02Doc* pDoc = GetDocument( );ASSERT
17、_VALID(pDoc);/ TODO: add draw code for native data herepDC-TextOut(0, 0, pDoc-m_String); /輸入本行 這里使用了CDC類(lèi)的成員函數(shù)TextOut( )函數(shù),該函數(shù)用于在CDC設(shè)備類(lèi)中顯示字符串。它有三個(gè)參數(shù),前兩個(gè)參數(shù)用于指示字符串顯示的相對(duì)位置,第三個(gè)參數(shù)用于傳遞要顯示的字符串。 現(xiàn)在編譯運(yùn)行這個(gè)程序。在“文件”菜單中選擇Demo菜單項(xiàng),窗口中顯示“您選擇了Demo菜單項(xiàng)。”的信息,如圖10.8所示。 建立新菜單的方法與添加菜單項(xiàng)類(lèi)似,首先編輯菜單資源,然后為相應(yīng)的菜單項(xiàng)建立消息映射,編寫(xiě)消息處理函數(shù)。在
18、資源編輯器中建立新菜單的一般步驟如下:圖10.8 Ex02程序運(yùn)行的結(jié)果 (1) 打開(kāi)菜單編輯器,可以看到在菜單的最右邊有一個(gè)空白的菜單項(xiàng),如圖10.9所示。 (2) 編輯該空白菜單項(xiàng)(雙擊它,出現(xiàn)對(duì)話框),將其命名為NewMenu,如圖10.10所示??梢钥吹?,Pop-up復(fù)選框是被選中的,表示本菜單帶有彈出式子菜單,因此無(wú)須定義本菜單的ID。 (3) 關(guān)閉Menu Item Properties對(duì)話框,NewMenu菜單下方已經(jīng)自動(dòng)增加了一個(gè)空白的菜單項(xiàng),如圖10.11所示。用戶(hù)可以通過(guò)編輯該空白菜單項(xiàng),向NewMenu菜單添加菜單項(xiàng)。圖10.9 菜單編輯器 圖10.10 New Item
19、 Properties對(duì)話框圖10.11 為NewMenu添加菜單項(xiàng) (4) 向NewMenu菜單中添加兩個(gè)菜單項(xiàng)New1和New2,并 將 其 I D 分 別 命 名 為 I D _ N E W M E N U _ N E W 1 和ID_NEWMENU_NEW2,如圖10.12所示。 在Windows中常??梢钥吹?,點(diǎn)擊某個(gè)菜單項(xiàng)還可以顯示下一級(jí)子菜單。例如為NewMenu的New2添加子菜單Sub1和Sub2的步驟如下: (1) 在菜單編輯器中雙擊New2菜單項(xiàng),打開(kāi)Menu ItemProperties對(duì)話框,如圖10.13所示。 (2) 選中對(duì)話框中的Pop-up復(fù)選框,此時(shí)ID下拉
20、列表框中的ID_NEWMENU_ NEW2自動(dòng)消失。關(guān)閉該對(duì)話框后,在菜單項(xiàng)New2右邊出現(xiàn)一個(gè)黑色的三角和一個(gè)空的子菜單,如圖10.14所示。 圖10.12 新菜單建立完成圖10.13 Menu Item Properties對(duì)話框圖10.14 New2帶有下一級(jí)子菜單 (3) 編輯New2的空白子菜單,添加Sub1和Sub2兩個(gè)菜單項(xiàng) , 如 圖 1 0 . 1 5 所 示 。 并 將 它 們 的 I D 分 別 命 名 為ID_NEWMENU_NEW2_SUB1和ID_NEWMENU_ NEW2_SUB2。 無(wú)論菜單項(xiàng)在哪一級(jí)菜單中,建立它們的命令處理函數(shù)的方法都是一樣的。因?yàn)樗械牟藛?/p>
21、項(xiàng)都有一個(gè)唯一的ID標(biāo)識(shí),菜單項(xiàng)所處的位置不影響它們的處理函數(shù)的編寫(xiě)。 圖10.15 為NewMenu添加子菜單 10.1.3 快捷鍵和加速鍵快捷鍵和加速鍵 1. 快捷鍵快捷鍵 “文件”菜單中的“F”帶有下劃線,這表示用戶(hù)可以通過(guò)按下Alt+F打開(kāi)“文件”菜單,而無(wú)須用鼠標(biāo)選取。F稱(chēng)為“文件”菜單的快捷鍵。 增加快捷鍵非常簡(jiǎn)單,只要在給定菜單名或菜單項(xiàng)名中的某個(gè)位置多寫(xiě)一個(gè)“&”字符,就把該字符后面的那個(gè)字符定義成了快捷鍵。比如把NewMenu中的字母Mp定義為快捷鍵,只需將菜單名設(shè)置為New&Menu即可,如圖10.16所示。 圖10.16 增加快捷鍵 2加速鍵加速鍵 加速鍵
22、是用于某個(gè)菜單項(xiàng)的控制鍵,用戶(hù)可以通過(guò)按這些鍵直接打開(kāi)相應(yīng)的菜單選項(xiàng),而無(wú)須打開(kāi)菜單選取。例如,在Windows中,按Ctrl+V與“編輯”菜單中的“粘貼”選擇是相同的。 注意,只有菜單項(xiàng)才有加速鍵。 下面是向NewMenu菜單中的New1菜單項(xiàng)增加加速鍵Ctrl+F1的步驟: (1) 在項(xiàng)目工作區(qū)的資源視圖中雙擊Accelerator圖標(biāo)。 (2) 雙擊IDR_MAINFRAME圖標(biāo),打開(kāi)加速鍵編輯器,如圖10.17所示。 (3) 雙擊加速鍵編輯器中的最后一個(gè)空白項(xiàng),打開(kāi)Accel Properties對(duì)話框,如圖10.18所示。圖10.17 加速鍵編輯器圖10.18 Accel Prope
23、rties對(duì)話框 (4) 在ID下拉列表框中選擇New1菜單項(xiàng)的ID,即“ID_NEWMENU_NEW1”。 (5) 在Key下拉列表框中選擇VK_F1,關(guān)閉對(duì)話框,把Ctrl+F1加入到New1菜單項(xiàng)中。 (6) 最后還要將New1的標(biāo)題改為“New1 Ctrl+F1”。 10.1.4 工具欄和狀態(tài)欄工具欄和狀態(tài)欄 1工具欄工具欄 工具欄顯示一組按鈕,每個(gè)按鈕對(duì)應(yīng)一個(gè)菜單項(xiàng)。工具欄按鈕是方便直觀的用戶(hù)界面,用戶(hù)可以直接點(diǎn)擊某個(gè)按鈕,其作用和選取相應(yīng)菜單選項(xiàng)是相同的。 可以把任何菜單項(xiàng)連接到工具欄中的按鈕。以“文件”菜單中的Demo菜單項(xiàng)為例,將其添加到工具欄的步驟如下: (1) 在項(xiàng)目工作區(qū)
24、的資源視圖中,雙擊Toolbar圖標(biāo)。 (2) 雙擊IDR_MAINFRAME圖標(biāo),打開(kāi)工具欄編輯器,同時(shí)在它的右邊出現(xiàn)一組工具欄繪圖工具,如圖10.19所示。圖10.19 工具欄編輯器 (3) 選取工具欄編輯器中工具欄最右邊的空白按鈕,使用繪圖工具在新按鈕中畫(huà)出如圖10.19所示的圖形。 (4) 雙擊工具欄編輯器中編輯好的新按鈕,打開(kāi)Toolbar Button Properties對(duì)話框,如圖10.20所示。 (5) 在ID下拉列表框中選擇ID_FILE_DEMO,新的按鈕已經(jīng)連接到Demo菜單項(xiàng)上。運(yùn)行程序,單擊新按鈕,可以看到窗口中顯示出與選擇Demo菜單項(xiàng)相同的信息,如圖10.21所
25、示。 2狀態(tài)欄狀態(tài)欄 狀態(tài)欄用于顯示某些提示信息。當(dāng)用戶(hù)把鼠標(biāo)移到某個(gè)菜單項(xiàng)或工具欄按鈕上時(shí),狀態(tài)欄中通常會(huì)顯示一些簡(jiǎn)單的信息,提示用戶(hù)該選項(xiàng)可以做哪些操作。圖10.20 Toolbar Properties對(duì)話框圖10.21 添加了工具欄按鈕的應(yīng)用程序 增加工具欄按鈕的狀態(tài)欄提示,只需在圖10.20所示的Toolbar Properties對(duì)話框的Prompt文本框中放置相應(yīng)信息即可。其操作步驟如下: (1) 打開(kāi)需要增加提示的按鈕的Toolbar Properties對(duì)話框。這里為Demo按鈕增加提示信息,如圖10.22所示。 (2) 在Prompt文本框中輸入這個(gè)按鈕的說(shuō)明:“在窗口顯示
26、相關(guān)的信息n演示信息”,這意味著當(dāng)用戶(hù)將鼠標(biāo)移到Demo按鈕上時(shí),狀態(tài)欄中將顯示“在窗口顯示相關(guān)信息”,而在鼠標(biāo)旁邊將顯示“演示信息”。 再次運(yùn)行程序,看一看當(dāng)鼠標(biāo)移到Demo按鈕上時(shí),是否會(huì)出現(xiàn)如圖10.23所示的提示信息。圖10.22 為工具欄按鈕增加提示信息圖10.23 添加了提示信息的工具欄按鈕10.2 單文檔與多文檔程序單文檔與多文檔程序 10.2.1 文檔文檔視圖結(jié)構(gòu)視圖結(jié)構(gòu) 使用MFC AppWizard創(chuàng)建應(yīng)用程序,首先要求用戶(hù)確定應(yīng)用程序的基本結(jié)構(gòu):?jiǎn)挝臋n(SDI)、多文檔(MDI)或基于對(duì)話框的應(yīng)用程序界面。其中單文檔或多文檔創(chuàng)建的應(yīng)用程序是基于文檔的應(yīng)用程序。 創(chuàng)建基于文
27、檔的應(yīng)用程序一般需要經(jīng)過(guò)以下幾步: 為每一種類(lèi)型的文檔定義一個(gè)派生自CDocument類(lèi)的派生類(lèi); 添加用于存儲(chǔ)文檔數(shù)據(jù)的成員變量; 編寫(xiě)用于實(shí)現(xiàn)讀取和修改文檔數(shù)據(jù)的函數(shù)成員。 在MFC中,用文檔視圖結(jié)構(gòu)可將數(shù)據(jù)從用戶(hù)對(duì)數(shù)據(jù)的觀察中分離出來(lái)。文檔用來(lái)管理應(yīng)用程序的數(shù)據(jù),視圖用于顯示文檔并管理與用戶(hù)的交互過(guò)程。實(shí)際上,視圖在用戶(hù)與文檔之間起橋梁作用,如圖10.24所示。 MFC AppWizard創(chuàng)建的文檔是從CDocument類(lèi)派生的,視圖類(lèi)是從CView類(lèi)派生的。 CDocument類(lèi)為應(yīng)用程序定義的文檔類(lèi)提供基本功能,而CView類(lèi)為應(yīng)用程序定義的視圖類(lèi)提供基本功能。視圖和文檔連接在一起,
28、在文檔與用戶(hù)間起中介作用。視圖在屏幕上顯示文檔數(shù)據(jù)并把用戶(hù)輸入轉(zhuǎn)換成對(duì)文檔的操作。 圖10. 24 文檔視圖之間的關(guān)系 10.2.2 單文檔應(yīng)用程序的建立單文檔應(yīng)用程序的建立 上一節(jié)的例子通過(guò)菜單顯示了一行字符,是通過(guò)菜單完成的,本節(jié)直接在應(yīng)用程序的窗口中顯示一些信息,如“Visual C+的單文檔應(yīng)用程序很簡(jiǎn)單”,按如下步驟進(jìn)行操作: (1) 利用MFC AppWizard創(chuàng)建單文檔的應(yīng)用程序Ex03。 (2) 在項(xiàng)目工作區(qū)的類(lèi)視圖中單擊CEx03View類(lèi)前面“+”,展開(kāi)該類(lèi)。 (3) 雙擊OnDraw( )函數(shù)名,打開(kāi)Ex03View.cpp編輯窗口。 (4) 對(duì)OnDraw( )函數(shù)按
29、如下內(nèi)容編輯: void CEx03View:OnDraw(CDC* pDC)CEx03Doc* pDoc = GetDocument( );ASSERT_VALID(pDoc);CString m_Message= Visual C+的單文檔應(yīng)用程序很簡(jiǎn)單;pDC-TextOut(30, 30, m_Message); 現(xiàn)在編譯運(yùn)行程序?!癡isual C+的單文檔應(yīng)用程序很簡(jiǎn)單”顯示在程序窗口中,但是,一個(gè)好的程序必然少不了與用戶(hù)之間的交互。在Windows中,用戶(hù)最常用的輸入工具無(wú)非是鍵盤(pán)和鼠標(biāo),如果要顯示由鍵盤(pán)輸入的字符串,應(yīng)該如何處理呢? 下面演示如何處理鍵盤(pán)和鼠標(biāo)輸入以及存儲(chǔ)和讀取
30、文檔數(shù)據(jù)。 首先,建立鍵盤(pán)輸入存儲(chǔ)區(qū),用于存儲(chǔ)鍵盤(pán)輸入的字符串。程序中的文檔對(duì)象用于存儲(chǔ)在視圖中顯示的數(shù)據(jù),因此下面在文檔類(lèi)中創(chuàng)建鍵盤(pán)輸入存儲(chǔ)區(qū)。當(dāng)用戶(hù)擊鍵時(shí),把鍵入的數(shù)據(jù)加到一個(gè)字符串中,并在視圖中顯示這個(gè)字符串。下面修改CEx03Doc類(lèi),增加字符串?dāng)?shù)據(jù)成員m_Message: (1) 在類(lèi)視圖中雙擊CEx03Doc圖標(biāo), 在Ex03Doc.h編輯窗口修改CEx03Doc的類(lèi)聲明:class CEx03Doc : public CDocumentprotected: / create from serialization onlyCEx03Doc( );DECLARE_DYNCREATE(
31、CEx03Doc)CString m_Message;/在此加入變量聲明在此加入變量聲明 (2) 在文檔類(lèi)CEx03Doc的構(gòu)造函數(shù)中,把這個(gè)字符串變量初始化為空字符串。在類(lèi)視圖中單擊CEx03Doc圖標(biāo)前的“+”,展開(kāi)該類(lèi)。雙擊CEx03Doc( )函數(shù),在Ex03Doc.cpp編輯窗口修改CEx03Doc的構(gòu)造函數(shù):CEx03Doc:CEx03Doc( )/ TODO: add one-time construction code herem_Message= ;/對(duì)對(duì)m_Message變量初始化變量初始化 現(xiàn)在來(lái)處理鍵盤(pán)輸入。鍵盤(pán)輸入產(chǎn)生WM_CHAR消息,處理鍵盤(pán)輸入就必須編寫(xiě)相應(yīng)的消
32、息處理函數(shù)。首先按照下面的步驟使用Class Wizard來(lái)完成消息的映射: (1) 按下Ctrl+W打開(kāi)MFC ClassWizard對(duì)話框,并選擇Message Maps選項(xiàng)卡。由于需要添加的消息處理函數(shù)屬于CEx03View類(lèi),在Class name下拉列表框中選擇CEx03View,如圖10.25所示。 (2) 在Messages列表框中選擇WM_CHAR消息,并雙擊它(或單擊App Function按鈕),這時(shí)可以在Member functions列表框中看到添加了這一OnChar函數(shù)。 圖10.25 MFC ClassWizard對(duì)話框的Message Maps選項(xiàng)卡 現(xiàn)在可以通過(guò)
33、OnChar函數(shù)來(lái)讀取鍵盤(pán)輸入并將讀取的字符存入到m_Message變量中。在圖10.25中按下Edit Code按鈕,編輯OnChar函數(shù)如下:void CEx03View:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)CEx03Doc* pDoc=GetDocument( ); /獲取文檔對(duì)象指針ASSERT_VALID(pDoc); /確保一定能獲取該指針pDoc-m_Message += nChar; /將讀取的字符加到m_Message中Invalidate( ); /強(qiáng)行調(diào)用OnDraw函數(shù),重繪視圖CView:OnChar(nChar,
34、 nRepCnt, nFlags); 最后,對(duì)OnDraw函數(shù)進(jìn)行修改,去掉對(duì)m_Message的聲明(已經(jīng)在CEx03Doc類(lèi)中聲明過(guò)),使之成為:void CEx03View:OnDraw(CDC* pDC)CEx03Doc* pDoc = GetDocument( );ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-TextOut(30, 30, pDoc-m_Message); 編譯運(yùn)行該程序并鍵入某些字符,相應(yīng)的字符將在窗口中顯示出來(lái)。 視圖中顯示的文檔數(shù)據(jù)通過(guò)文檔的串行化方法來(lái)實(shí)現(xiàn)磁盤(pán)的存取。所謂文檔
35、的串行化,是指在文檔打開(kāi)時(shí),能夠自動(dòng)把文檔中的數(shù)據(jù)轉(zhuǎn)換為文檔類(lèi)所支持的對(duì)象;在保存文檔時(shí),能夠自動(dòng)將文檔類(lèi)對(duì)象轉(zhuǎn)換為文檔數(shù)據(jù)格式。 文檔串行化方法是由CEx03Doc類(lèi)中的Serialize函數(shù)完成的。在項(xiàng)目工作區(qū)的類(lèi)視圖中單擊CEx03Doc前面的“+”,展開(kāi)該類(lèi)。雙擊Serialize函數(shù),在代碼編輯窗口對(duì)其編輯如下:void CEx03Doc:Serialize(CArchive& ar)if (ar.IsStoring( )ar m_Message;/讀入文檔 現(xiàn)在運(yùn)行這個(gè)程序。在窗口中輸入“這是第一次的輸入”,再選擇“文件”菜單中的“保存”,在“文件名”編輯框中輸入“1”。再
36、運(yùn)行一次,輸入“這是第二次的輸入”,將其存為“2”,如圖10.26所示。圖10.26 在Ex03程序中存儲(chǔ)文件 現(xiàn)在可以使用“文件”菜單中的“打開(kāi)”菜單項(xiàng)分別打開(kāi)這兩個(gè)文件,可以看到程序窗口中顯示的字符串與存儲(chǔ)的字符串完全一致。 接下來(lái)看看如何處理鼠標(biāo)輸入。按照下面的步驟修改上面的程序,將允許用戶(hù)通過(guò)在客戶(hù)區(qū)的某個(gè)位置單擊鼠標(biāo)來(lái)確定新文本輸入的位置。當(dāng)用戶(hù)輸入文本時(shí),將會(huì)在單擊鼠標(biāo)的位置開(kāi)始輸入;當(dāng)用戶(hù)用鼠標(biāo)選擇新位置時(shí),清除字符串對(duì)象m_Message中的字符,以便接收新的字符串。 由于鼠標(biāo)左鍵被按下時(shí),文本顯示位置也隨之變化,必須首先建立一個(gè)新的存儲(chǔ)區(qū),用以記錄鼠標(biāo)單擊的位置。鼠標(biāo)位置可以
37、通過(guò)鼠標(biāo)消息處理函數(shù)傳遞的參數(shù)獲得。所有鼠標(biāo)消息處理函數(shù)都傳遞兩個(gè)參數(shù): UINT nFlags,CPoint point 其中,point參數(shù)是CPoint類(lèi)的一個(gè)對(duì)象,用于存入鼠標(biāo)當(dāng)前位置。可以在程序視圖類(lèi)的頭文件中創(chuàng)建一個(gè)CPoint類(lèi)的對(duì)象,命名為m_Point,用于記錄point參數(shù)。編輯Ex03View.h,修改CEx03View類(lèi)的聲明:class CEx03View : public CViewprotected: / create from serialization onlyCEx03View( );DECLARE_DYNCREATE(CEx03View)CPoint m_
38、Point;/用戶(hù)加入本行用戶(hù)加入本行 與m_Message對(duì)象一樣,需要對(duì)m_Point做初始化工作,這一工作在視圖類(lèi)的構(gòu)造函數(shù)CEx03View( )中完成:CEx03View:CEx03View( )/ TODO: add construction code herem_Point.x=0; /用戶(hù)加入以下兩行用戶(hù)加入以下兩行/m_Point.y=0; 現(xiàn)在使用ClassWizard創(chuàng)建WM_LBUTTONDOWN消息(被鼠標(biāo)左鍵單擊)的處理函數(shù),該函數(shù)記錄鼠標(biāo)新位置,并在該位置顯示新輸入的文本。步驟如下: (1) 按下Ctrl+W加速鍵,啟動(dòng)ClassWizard對(duì)話框,選擇Messa
39、ge Maps選項(xiàng)卡。 (2) 在Class name下拉列表框中選擇CEx03View,在Messages列表框中選擇WM_LBUTTONDOWN消息。 (3) 按下Add Function按鈕,這時(shí)可以在Member functions列表框中看到WM_LBUTTONDOWN的處理函數(shù)已被創(chuàng)建,函數(shù)名為OnLButtonDown。編輯OnLButtonDown函數(shù)如下: void CEx03View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call
40、defaultm_Point=point; /記錄鼠標(biāo)位置CEx03Doc* pDoc=GetDocument( );/定義pDoc使用其指向CEx03Doc對(duì)象ASSERT_VALID(pDoc);pDoc-m_Message.Empty();/清空字符串Invalidate(); /強(qiáng)迫重新繪圖CView:OnLButtonDown(nFlags, point); 新位置已經(jīng)記錄在m_Point中了。改寫(xiě)OnDraw函數(shù),在新位置顯示文本:void CEx03View:OnDraw(CDC* pDC)CEx03Doc* pDoc = GetDocument( );ASSERT_VALID(
41、pDoc);/ TODO: add draw code for native data herepDC-TextOut(m_Point.x, m_Point.y, pDoc-m_Message); 運(yùn)行程序。在客戶(hù)區(qū)的任何位置單擊鼠標(biāo)左鍵,然后輸入文本,新文本將會(huì)在該位置出現(xiàn)。程序中讀者可能發(fā)現(xiàn)一個(gè)問(wèn)題:輸入字符或單擊鼠標(biāo)的時(shí)候,無(wú)法確認(rèn)當(dāng)前字符的輸入位置。在Windows中,通常使用光標(biāo)指示用戶(hù)輸入字符時(shí)顯示的位置。下面介紹如何在程序中建立和使用光標(biāo)。 要建立一個(gè)新光標(biāo),必須確定光標(biāo)的大小。通常,光標(biāo)與當(dāng)前字符高度相同,寬度為平均字符寬度的1/8。文本字符串大小的相關(guān)信息由MFC提供的結(jié)構(gòu)類(lèi)
42、型TEXTMETRIC記錄,只要說(shuō)明該類(lèi)型的一個(gè)變量,然后使用CDC類(lèi)中的GetTextMetrics方法對(duì)其進(jìn)行填充即可。TEXTMETRIC類(lèi)型中包括的成員有:tmHeight(字符高度)、tmAveCharWidth(平均字符寬度)、thMaxCharWidth(最大字符寬度)、thWeight(磅數(shù))、tmItalic(斜體)等等。上面程序建立和使用光標(biāo)的步驟如下: (1) 在視圖類(lèi)中建立指示光標(biāo)是否已經(jīng)建立的布爾變量m_Created和光標(biāo)位置m_Pos:class CEx03View : public CViewprotected: / create from serializat
43、ion onlyCEx03View( );DECLARE_DYNCREATE(CEx03View)CPoint m_Point;BOOL m_Created;/光標(biāo)是否建立/CPoint m_Pos;/光標(biāo)位置/ (2) 在視圖構(gòu)造函數(shù)中將m_Created初始化為False,表示尚未創(chuàng)建;將m_Pos初始化為0:CEx03View:CEx03View( )/ TODO: add construction code herem_Point.x=0;m_Point.y=0;m_Created=FALSE;m_Pos=m_Point; (3) 使用GetTextMetrics方法獲取當(dāng)前字符的大小
44、,并用CreateSolidCaret方法實(shí)際建立光標(biāo),編輯OnDraw函數(shù):void CEx03View:OnDraw(CDC* pDC)CEx03Doc* pDoc = GetDocument( );ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-TextOut(m_Point.x, m_Point.y, pDoc-m_Message);if(!m_Created)TEXTMETRIC metric;pDC-GetTextMetrics(&metric);CreateSolidCaret(metric
45、.tmAveCharWidth/8, metric.tmHeight); 創(chuàng)建光標(biāo)后,使用SetCarePos設(shè)置光標(biāo)位置,并使用ShowCaret在視圖中顯示光標(biāo),還需要將m_Created設(shè)置為T(mén)RUE, 表示光標(biāo)已被創(chuàng)建。重新修改OnDraw函數(shù):void CEx03View:OnDraw(CDC* pDC)CEx03Doc* pDoc = GetDocument( );ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-TextOut(m_Point.x, m_Point.y, pDoc-m_Message)
46、;if(!m_Created)TEXTMETRIC metric;pDC-GetTextMetrics(&metric);CreateSolidCaret(metric.tmAveCharWidth/8,metric.tmHeight);SetCaretPos(m_Pos);ShowCaret( );m_Created=TRUE; 現(xiàn)在編譯并運(yùn)行程序??梢钥吹焦鈽?biāo)在窗口的左上角閃動(dòng)。但在新位置點(diǎn)下鼠標(biāo)左鍵時(shí),光標(biāo)并沒(méi)有跟著移動(dòng)。 光標(biāo)需要指示下一個(gè)字符的輸入位置。因此,當(dāng)用戶(hù)輸入字符時(shí),光標(biāo)應(yīng)該隨之移動(dòng)而出現(xiàn)在字符串的尾部??砂聪旅娴姆椒ㄌ幚恚?(1) 首先計(jì)算字符串結(jié)尾的位置。通過(guò)使
47、用GetTextExtent函數(shù)可以獲得字符串的高度和長(zhǎng)度。需要注意,這里的長(zhǎng)度不是指字符串中字符的個(gè)數(shù),而是字符串在視圖中以像素為單位計(jì)算的長(zhǎng)度。 (2) 隱藏光標(biāo),將光標(biāo)移動(dòng)到字符串的尾部并再次顯示它。修改OnDraw函數(shù)如下:void CEx03View:OnDraw(CDC* pDC)CEx03Doc* pDoc = GetDocument( );ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-TextOut(m_Point.x, m_Point.y, pDoc-m_Message);if(!m_Crea
48、ted)TEXTMETRIC metric;pDC-GetTextMetrics(&metric);CreateSolidCaret(metric.tmAveCharWidth/8,metric.tmHeight);SetCaretPos(m_Pos);ShowCaret( );m_Created=TRUE;CSize StringSize=pDC-GetTextExtent(pDoc-m_Message);/字符串長(zhǎng)度m_Pos.x=m_Point.x+StringSize.cx; /計(jì)算光標(biāo)位置m_Pos.y=m_Point.y;HideCaret( ); /隱藏光標(biāo)SetCare
49、tPos(m_Pos); /移動(dòng)光標(biāo)到新位置ShowCaret( ); /顯示光標(biāo) (3) 最后還應(yīng)該考慮到,在程序窗口失去輸入焦點(diǎn)時(shí),需要隱藏光標(biāo),當(dāng)窗口重新獲得焦點(diǎn)時(shí)再次顯示光標(biāo)。程序窗口失去焦點(diǎn)和獲得焦點(diǎn)的消息分別是WM_KILLFOCUS和WM_SETFOCUS。使用ClassWizard分別創(chuàng)建這兩個(gè)消息的處理函數(shù),并編輯它們?nèi)缦拢?void CEx03View:OnKillFocus(CWnd* pNewWnd) CView:OnKillFocus(pNewWnd);HideCaret( );void CEx03View:OnSetFocus(CWnd* pOldWnd) CVie
50、w:OnSetFocus(pOldWnd);ShowCaret( ); 再次編譯運(yùn)行這個(gè)程序,可以看到閃動(dòng)的光標(biāo)指示下一個(gè)字符的輸入位置。當(dāng)用戶(hù)用鼠標(biāo)在其它位置點(diǎn)擊時(shí),所輸入的字符串消失,光標(biāo)又在新位置閃動(dòng)。 10.2.3 多文檔應(yīng)用程序的建立多文檔應(yīng)用程序的建立 單文檔應(yīng)用程序與多文檔應(yīng)用程序在外觀上是有區(qū)別的??梢栽俅芜\(yùn)行Ex01程序,將它與單文檔應(yīng)用程序相比較(如Ex02、Ex03)。多文檔應(yīng)用程序多出一個(gè)“窗口”菜單,并且在主窗口中可以同時(shí)打開(kāi)多個(gè)子窗口。這些子窗口中的內(nèi)容可以是不同的。 利用MFC AppWizard生成單文檔(SDI)應(yīng)用程序時(shí),只派生文檔類(lèi)、視圖類(lèi)、主窗口類(lèi)和應(yīng)用
51、程序類(lèi)。而生成多文檔(MDI)應(yīng)用程序時(shí),它有一個(gè)主窗口和嵌在該窗口中的子窗口,所以具有CChildFrame類(lèi),而且每個(gè)窗口可以使用不同的文檔模板。 單文檔應(yīng)用程序的主窗口類(lèi)派生自CFrameWnd類(lèi),而多文檔應(yīng)用程序的主窗口類(lèi)則是CMDIFrameWnd類(lèi)的派生類(lèi)。 在文檔模板方面,單文檔應(yīng)用程序的文檔模板是CSingleDocTemplate類(lèi),多文檔應(yīng)用程序的文檔模板則是CMultiDocTemplate類(lèi)。CSingleDocTemplate類(lèi)構(gòu)造函數(shù)的用法與CMultiDocTemplate類(lèi)相同,但從建立文檔模板所給定的參數(shù)不難發(fā)現(xiàn),單文檔應(yīng)用程序文檔模板的框架窗口與其主框架窗口
52、使用相同的類(lèi)(CMainFrame),而多文檔應(yīng)用程序文檔模板的文件框架窗口使用的是子窗口類(lèi)(CChildFrame)。多文檔應(yīng)用程序中可以有多個(gè)子窗口,因此多文檔應(yīng)用程序中可以有多個(gè)文檔模板。 通過(guò)觀察單文檔和多文檔應(yīng)用程序的InitInstance( )函數(shù),可以明顯看出它們之間的差別: /單文檔應(yīng)用程序的InitInstance( )函數(shù)BOOL CEx02App:InitInstance( )/建立文檔模板CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIM
53、E_CLASS(CEx02Doc),RUNTIME_CLASS(CMainFrame), / main SDI frame windowRUNTIME_CLASS(CEx02View);AddDocTemplate(pDocTemplate);/ 只有一個(gè)窗口m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow( );return TRUE;/多文檔應(yīng)用程序的InitInstance( )函數(shù)BOOL CEx01App:InitInstance( )/建立文檔模板CMultiDocTemplate* pDocTemplate;pDocTe
54、mplate = new CMultiDocTemplate(IDR_EX01TYPE,RUNTIME_CLASS(CEx01Doc),RUNTIME_CLASS(CChildFrame), / custom MDI child frameRUNTIME_CLASS(CEx01View);AddDocTemplate(pDocTemplate);/ 建立MDI主窗口框架CMainFrame* pMainFrame = new CMainFrame;if (!pMainFrame-LoadFrame(IDR_MAINFRAME)return FALSE;m_pMainWnd = pMainFra
55、me;/ 顯示主窗口pMainFrame-ShowWindow(m_nCmdShow);pMainFrame-UpdateWindow( ); return TRUE; 下面是建立一個(gè)多文檔應(yīng)用程序的例子。操作如下: (1) 利用MFC Appwizard創(chuàng)建多文檔的應(yīng)用程序Ex04。 (2) 在項(xiàng)目工作區(qū)的類(lèi)視圖中雙擊CEx04Doc圖標(biāo),出現(xiàn)類(lèi)編輯器。在CEx04Doc的類(lèi)聲明中加入對(duì)m_Message的聲明:class CEx04Doc : public CDocumentprotected: / create from serialization onlyCEx04Doc( );DEC
56、LARE_DYNCREATE(CEx04Doc)CString m_Message;(3) 修改CEx04Doc( )構(gòu)造函數(shù),對(duì)m_Message變量初始化:CEx04Doc:CEx04Doc( )/ TODO: add one-time construction code herem_Message=; (4) 按下Ctrl+W,打開(kāi)ClassWizard的Message Maps選項(xiàng)卡,對(duì)CEx04View類(lèi)的WM_CHAR消息添加消息處理函數(shù)OnChar,對(duì)其編輯如下:void CEx04View:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags
57、) / TODO: Add your message handler code here and/or call defaultCEx04Doc* pDoc=GetDocument( );ASSERT_VALID(pDoc);pDoc-m_Message += nChar;Invalidate( );CView:OnChar(nChar, nRepCnt, nFlags);(5) 對(duì)OnDraw函數(shù)進(jìn)行修改:void CEx04View:OnDraw(CDC* pDC)CEx04Doc* pDoc = GetDocument( );ASSERT_VALID(pDoc);/ TODO: add
58、draw code for native data herepDC-TextOut(0, 0, pDoc-m_Message); 編譯并運(yùn)行該程序,選擇“文件”菜單中的“新建”,或直接在工具欄中按下“新建”按鈕,創(chuàng)建多個(gè)文檔窗口,在不同的窗口中可以輸入并顯示不同的字符串。10.3 對(duì)話框與常用組件對(duì)話框與常用組件 10.3.1 對(duì)話框?qū)υ捒?1有模式對(duì)話框和無(wú)模式對(duì)話框有模式對(duì)話框和無(wú)模式對(duì)話框 在Windows應(yīng)用程序中,對(duì)話框無(wú)處不在。在打開(kāi)文件、查詢(xún)以及其它數(shù)據(jù)交互時(shí),都會(huì)用到對(duì)話框。從最簡(jiǎn)單的消息框,到復(fù)雜的數(shù)據(jù)處理框,都可以用對(duì)話框來(lái)完成。其實(shí)對(duì)話框是一個(gè)真正的窗口,它不但可以接受消
59、息,而且還可以被移動(dòng)和關(guān)閉,甚至可以在它的客戶(hù)區(qū)中進(jìn)行繪圖操作。更為便利的是,在設(shè)計(jì)時(shí)可以把控件直接粘到對(duì)話框上去,以實(shí)現(xiàn)各種操作。 對(duì)話框按其動(dòng)作模式分為“有模式”和“無(wú)模式”兩大類(lèi)。有模式對(duì)話框在被關(guān)閉之前,用戶(hù)無(wú)法再進(jìn)行其它工作;無(wú)模式對(duì)話框被關(guān)閉之前,用戶(hù)可以在應(yīng)用程序的其它窗口中進(jìn)行工作。當(dāng)有模式對(duì)話框被打開(kāi)之后,它就接管了父窗口的輸入控制權(quán),只有當(dāng)用戶(hù)關(guān)閉了該對(duì)話框之后,控制權(quán)才交給父窗口。而無(wú)模式對(duì)話框則與父窗口共享控制權(quán),用戶(hù)可以在主窗口和對(duì)話框之間來(lái)回切換。 根據(jù)有模式對(duì)話框的特點(diǎn),它通常被用作輸入數(shù)據(jù),如常見(jiàn)的打開(kāi)文件對(duì)話框、保存文件對(duì)話框、顯示程序信息對(duì)話框等等。而無(wú)模式
60、對(duì)話框常用來(lái)提供更多的選擇功能,如工具箱和調(diào)色板等。 2在在Visual C+程序中使用有模式對(duì)話框程序中使用有模式對(duì)話框 在Visual C+中,對(duì)話框同樣也是程序的一項(xiàng)資源。下面以一個(gè)簡(jiǎn)單的例子,來(lái)介紹如何在應(yīng)用程序中使用有模式對(duì)話框,在對(duì)話框中加入控件以及訪問(wèn)對(duì)話框中的數(shù)據(jù)。 首先建立一個(gè)SDI界面的應(yīng)用程序Ex06,然后編輯對(duì)話框資源,步驟如下: (1) 在Insert菜單中選擇Resource菜單項(xiàng)或直接按下Ctrl+R加速鍵,打開(kāi)Insert Resource對(duì)話框,如圖10.27所示。 (2) 在對(duì)話框中選取Dialog圖標(biāo),然后單擊New按鈕,這時(shí)將建立一個(gè)新的對(duì)話框,并打開(kāi)對(duì)話框編輯器,如圖10.28所示。圖10.27
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年廣西公務(wù)員申論考試真題及答案-A卷
- 2025年滬教版高二數(shù)學(xué)上冊(cè)月考試卷
- 2025年人教新起點(diǎn)選修1歷史上冊(cè)月考試卷含答案
- 2025年粵教新版九年級(jí)地理上冊(cè)月考試卷
- 2025年人教五四新版七年級(jí)生物上冊(cè)階段測(cè)試試卷
- 2025年蘇人新版七年級(jí)生物上冊(cè)月考試卷含答案
- 2025年粵人版選擇性必修1語(yǔ)文上冊(cè)階段測(cè)試試卷
- 2025年北師大版八年級(jí)生物下冊(cè)月考試卷含答案
- 二零二五年度木門(mén)及木飾面定制化生產(chǎn)與安裝服務(wù)合同4篇
- 二零二五版親子閱讀活動(dòng)組織服務(wù)合同4篇
- 江蘇省蘇州市2024-2025學(xué)年高三上學(xué)期1月期末生物試題(有答案)
- 銷(xiāo)售與銷(xiāo)售目標(biāo)管理制度
- 人教版(2025新版)七年級(jí)下冊(cè)英語(yǔ):寒假課內(nèi)預(yù)習(xí)重點(diǎn)知識(shí)默寫(xiě)練習(xí)
- 2024年食品行業(yè)員工勞動(dòng)合同標(biāo)準(zhǔn)文本
- 2025年第一次工地開(kāi)工會(huì)議主要議程開(kāi)工大吉模板
- 全屋整裝售后保修合同模板
- 高中生物學(xué)科學(xué)推理能力測(cè)試
- GB/T 44423-2024近紅外腦功能康復(fù)評(píng)估設(shè)備通用要求
- 2024-2030年中國(guó)減肥行業(yè)市場(chǎng)發(fā)展分析及發(fā)展趨勢(shì)與投資研究報(bào)告
- 運(yùn)動(dòng)技能學(xué)習(xí)
- 2024年中考英語(yǔ)專(zhuān)項(xiàng)復(fù)習(xí):傳統(tǒng)文化的魅力(閱讀理解+完型填空+書(shū)面表達(dá))(含答案)
評(píng)論
0/150
提交評(píng)論