第3章對(duì)話框和常用控件.ppt_第1頁(yè)
第3章對(duì)話框和常用控件.ppt_第2頁(yè)
第3章對(duì)話框和常用控件.ppt_第3頁(yè)
第3章對(duì)話框和常用控件.ppt_第4頁(yè)
第3章對(duì)話框和常用控件.ppt_第5頁(yè)
已閱讀5頁(yè),還剩134頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第三章對(duì)話框和常用控件,3.1 對(duì)話框的使用,3.2 控件的創(chuàng)建和使用方法,3.3 常用控件,3.4 通用對(duì)話框和消息對(duì)話框,3.5 綜合應(yīng)用,3.1對(duì)話框的使用,在Visual C+ 6.0應(yīng)用程序中,使用一個(gè)對(duì)話框通常有兩種情形:一是直接創(chuàng)建一個(gè)對(duì)話框應(yīng)用程序,二是在一個(gè)應(yīng)用程序中進(jìn)行調(diào)用。為不失一般性,這里介紹第二種對(duì)話框使用情況的一般過(guò)程,即依次如下: (1) 添加對(duì)話框資源; (2) 設(shè)置對(duì)話框的屬性; (3) 添加和布局控件; (4) 創(chuàng)建對(duì)話框類; (5) 添加對(duì)話框代碼; (6) 在程序中調(diào)用對(duì)話框。 顯然,對(duì)于第一種對(duì)話框使用情況來(lái)說(shuō),其過(guò)程通常是從(2)到(5)。 3.1.

2、1 添加對(duì)話框資源 在對(duì)話框資源添加之前,先來(lái)創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_SDI: (1)在“D:Visual C+應(yīng)用”文件夾中,創(chuàng)建本章應(yīng)用程序工作文件夾“第3章”。 (2)啟動(dòng)Visual C+ 6.0,選擇“文件”“新建”菜單,在彈出的“新建”對(duì)話框的工程標(biāo)簽頁(yè)面中,選擇MFC AppWizard(exe)的項(xiàng)目類型。單擊位置框右側(cè)的按鈕,在彈出的對(duì)話框中,將該應(yīng)用程序的文件夾定位在“D:Visual C+應(yīng)用第3章”,并在工程編輯框中輸入單文檔應(yīng)用程序名Ex_SDI。,3.1對(duì)話框的使用,(3)單擊確定按鈕,在出現(xiàn)的“步驟1”對(duì)話框中,選擇“單個(gè)文檔”應(yīng)用程序類型。 (4)單擊

3、完成按鈕出現(xiàn)一個(gè)信息對(duì)話框,顯示出用戶在前面幾個(gè)步驟中作出的選擇內(nèi)容,單擊確定按鈕系統(tǒng)開(kāi)始創(chuàng)建,并又回到了Visual C+ 6.0的主界面。,若無(wú)特別說(shuō)明,以后凡遇到“創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_XXXX”就是指上述的步驟,本書(shū)作此約定。其中,Ex_XXXX為創(chuàng)建的應(yīng)用程序名。,這樣就可在單文檔應(yīng)用程序Ex_SDI中添加一個(gè)對(duì)話框資源,通常按下列步驟進(jìn)行: (1)選擇“插入”“資源”菜單,或按快捷鍵Ctrl+R打開(kāi)“插入資源”對(duì)話框,在對(duì)話框中可以看到資源列表中存在Dialog項(xiàng),若單擊Dialog項(xiàng)左邊的“+”號(hào),將展開(kāi)對(duì)話框資源的不同類型選項(xiàng),如圖3.1所示,表3.1列出各種類型的

4、對(duì)話框資源的不同用途。,圖3.1 “插入資源”對(duì)話框,其中,新建按鈕是用來(lái)創(chuàng)建一個(gè)由“資源類型”列表中指定類型的新資源,自定義按鈕是用來(lái)創(chuàng)建“資源類型”列表中沒(méi)有的新類型的資源,引入按鈕是用于將外部已有的位圖、圖標(biāo)、光標(biāo)或其他定制的資源添加到當(dāng)前應(yīng)用程序中。,3.1對(duì)話框的使用,表3.1 對(duì)話框資源類型,3.1對(duì)話框的使用,(3)對(duì)展開(kāi)的不同類型的對(duì)話框資源不作任何選擇,選中“Dialog”,單擊新建按鈕,系統(tǒng)就會(huì)自動(dòng)為當(dāng)前應(yīng)用程序添加了一個(gè)對(duì)話框資源,并出現(xiàn)如圖3.2所示的界面。,圖3.2 添加對(duì)話框資源后的開(kāi)發(fā)環(huán)境,3.1對(duì)話框的使用, 系統(tǒng)為對(duì)話框資源自動(dòng)賦給它一個(gè)默認(rèn)的標(biāo)識(shí)符名稱(第一

5、次為IDD_DIALOG1,以后依次為IDD_DIALOG2、IDD_DIALOG3、.)。 使用了通用的對(duì)話框模板創(chuàng)建新的對(duì)話框資源。對(duì)話框的默認(rèn)標(biāo)題為“對(duì)話” (Dialog),有確定和取消兩個(gè)按鈕,這兩個(gè)按鈕的標(biāo)識(shí)符分別為IDOK和IDCANCEL。 自動(dòng)出現(xiàn)“對(duì)話框資源編輯器”窗口,在這里可以通過(guò)“控件工具欄”和“布局工具欄”向?qū)υ捒蛱砑雍筒季挚丶?,并可設(shè)置對(duì)話框的屬性。 需要說(shuō)明的是,第一次使用Visual C+6.0的對(duì)話框編輯器時(shí),“控件工具欄”和“布局工具欄”可能是浮動(dòng),可以將其拖放到指定位置(參看圖3.2),以便讓開(kāi)發(fā)環(huán)境更易于操作。 3.1.2 設(shè)置對(duì)話框?qū)傩?在對(duì)話框模板

6、的空白處右擊鼠標(biāo),從彈出的快捷菜單中選擇“屬性”菜單項(xiàng),出現(xiàn)如圖3.3所示的對(duì)話框?qū)傩源翱凇?可以看出,對(duì)話框具有這幾類屬性:常規(guī)(General)、樣式(Styles)、更多樣式(More Styles)、擴(kuò)展樣式(Extended Styles)、更多擴(kuò)展More Extended Styles(更多擴(kuò)展樣式)等部分,這里僅介紹最常用的常規(guī)(General)屬性,如表4.2所示。,3.1對(duì)話框的使用,圖3.3 對(duì)話框?qū)傩源翱?表3.2 對(duì)話框的常規(guī)(General)屬性,3.1對(duì)話框的使用,圖3.3中,有一個(gè) 圖標(biāo),當(dāng)單擊此圖標(biāo)后,圖標(biāo)變成,表示該對(duì)話框?qū)⒁恢憋@示直到用戶關(guān)閉它。在 狀態(tài)下

7、,當(dāng)該對(duì)話框一旦失去活動(dòng)狀態(tài)后就會(huì)自動(dòng)消失!,將添加的對(duì)話框的屬性進(jìn)行以下3點(diǎn)修改,結(jié)果如圖3.4所示: 在ID框中,將對(duì)話框標(biāo)識(shí)符IDD_DIALOG1改成IDD_DIALOG_FIRST; 在標(biāo)題框中,將對(duì)話框標(biāo)題“對(duì)話”改為“我的第一個(gè)對(duì)話框”; 單擊字體按鈕,通過(guò)彈出的字體對(duì)話框?qū)?duì)話框內(nèi)的文本設(shè)置成“宋體,9” ,以使自己的對(duì)話框和Windows中的對(duì)話框保持外觀上的一致(這是界面設(shè)計(jì)的“一致性”原則)。,3.1對(duì)話框的使用,圖3.4 對(duì)話框?qū)傩孕薷暮蟮慕缑?3.1對(duì)話框的使用,3.1.3 添加和布局控件 一旦對(duì)話框資源被打開(kāi)或被創(chuàng)建,就會(huì)出現(xiàn)對(duì)話框編輯器,通過(guò)它可以在對(duì)話框中進(jìn)行控

8、件的添加和布局等操作。 1. 控件的添加 對(duì)話框編輯器一旦打開(kāi),“控件”工具欄一般都會(huì)隨之出現(xiàn)。若不出現(xiàn),則可在開(kāi)發(fā)環(huán)境的 工具欄區(qū)的空白處右擊鼠標(biāo),從彈出的快捷菜單中選擇“控件”。 利用“控件”工具欄中的各個(gè)按鈕可以順利完成控件的添加。圖3.5說(shuō)明了各個(gè)按鈕所對(duì)應(yīng)的控件類型。,圖3.5 控件工具欄和各按鈕含義,3.1對(duì)話框的使用,向?qū)υ捒蛱砑右粋€(gè)控件的方法有下列幾種: 在控件工具欄中單擊某控件,此時(shí)的鼠標(biāo)箭頭在對(duì)話框內(nèi)變成“十”字形狀;在對(duì)話框指定位置單擊鼠標(biāo)左鍵,則此控件被添加到對(duì)話框的相應(yīng)位置,再拖動(dòng)剛添加控件的選擇框可改變其大小和位置。 在控件工具欄中單擊某控件,此時(shí)的鼠標(biāo)箭頭對(duì)話框內(nèi)

9、變成“十”字形狀;在指定位置處單擊鼠標(biāo)左鍵不放,拖動(dòng)鼠標(biāo)至滿意位置,釋放鼠標(biāo)鍵。 用鼠標(biāo)左鍵點(diǎn)中控件工具欄中的某控件,并按住鼠標(biāo)左鍵不放;在移動(dòng)鼠標(biāo)到對(duì)話框的指定位置的過(guò)程中,用戶會(huì)看到一個(gè)虛線框,下面帶有該控件的標(biāo)記;釋放鼠標(biāo)左鍵,新添加的控件立即出現(xiàn)在對(duì)話框中。 2. 控件的選取 控件的刪除、復(fù)制和布局操作一般都要先選取控件,若選取單個(gè)控件,則可以下列方法: 用鼠標(biāo)直接選取。首先保證在控件工具欄中的選擇按鈕()是被選中的,然后移動(dòng)鼠標(biāo)指針至指定的控件上,單擊鼠標(biāo)左鍵即可。 用助記符來(lái)選取。如果控件的標(biāo)題中帶有下劃線的字符,這個(gè)字符就是助記符,選擇時(shí)直接按下該助記符鍵或“Alt+助記符”組合

10、鍵即可。,3.1對(duì)話框的使用, 用Tab鍵選取。在對(duì)話框編輯器中,系統(tǒng)會(huì)根據(jù)控件的添加次序自動(dòng)設(shè)置相應(yīng)的Tab鍵次序。利用Tab鍵,用戶可在對(duì)話框內(nèi)的控件中進(jìn)行選擇。每按一次Tab鍵依次 選取對(duì)話框中的下一個(gè)控件,若按住Shift鍵,再單擊Tab鍵則選取上一個(gè)控件。 對(duì)于多個(gè)控件的選取,可采用下列方法: 先在對(duì)話框內(nèi)按住鼠標(biāo)左鍵不放,拖出一個(gè)大的虛框,然后釋放鼠標(biāo),則被該虛框所包圍的控件都將被選取。 先按住Shift鍵不放,然后用鼠標(biāo)選取控件,直到所需要的多個(gè)控件選取之后再釋放Shift鍵。若在選取時(shí),對(duì)已選取的控件再選取一下,則取消該控件選取。 需要注意的是: (1) 一旦單個(gè)控件被選取后,

11、其四周由選擇框包圍著,選擇框上還有幾個(gè)(通常是八個(gè))藍(lán)色實(shí)心小方塊,拖動(dòng)它可改變控件的大小,如圖3.6(a)所示。 (2)多個(gè)控件被選取后,其中只有一個(gè)控件的選擇框有幾個(gè)藍(lán)色實(shí)心小方塊,這個(gè)控件稱為主要控件,而其他控件的選擇框的小方塊是空心的。如圖3.6(b)所示。,3.1對(duì)話框的使用,3. 控件的刪除、復(fù)制和布局 當(dāng)單個(gè)控件或多個(gè)控件被選取后,按方向鍵或用鼠標(biāo)拖動(dòng)控件的選擇框可移動(dòng)控件。若在鼠標(biāo)拖動(dòng)過(guò)程中還按住Ctrl鍵則復(fù)制控件。若按Del鍵可將選取的控件刪除。當(dāng)然還有其他一些編輯操作,但這些操作方法和一般的文檔編輯器基本相同,這里不再重復(fù)。 對(duì)于控件的布局,對(duì)話框編輯器中提供了控件布局工

12、具欄,如圖3.7所示,它可以自動(dòng)地排列對(duì)話框內(nèi)的控件,并能改變控件的大小。,圖3.7 控件布局工具欄,3.1對(duì)話框的使用,需要說(shuō)明的是: (1) 隨著對(duì)話框編輯器的打開(kāi),Visual C+ 6.0開(kāi)發(fā)環(huán)境的菜單欄還出現(xiàn)“布局”菜單,它的命令與布局工具相對(duì)應(yīng),而且大部分命令名后面還顯示出相應(yīng)的快捷鍵,由于它們都是中文的(漢化過(guò)),故這里不再列出。 (2) 大多數(shù)布置控件的命令使用前,都需要用戶選取多個(gè)控件,且“主要控件”起到了關(guān)鍵作用。例如用戶選取多個(gè)控件后,使用“大小相同”命令只改變其它控件的大小,并與“主 要控件”的尺寸一致。因此,在多個(gè)控件的布置過(guò)程中,常需要重新設(shè)置“主要控件”。設(shè)置的方

13、法是按住Ctrl或Shift鍵,然后用鼠標(biāo)單擊所要指定的控件即可。 (3) 為了便于用戶在對(duì)話框內(nèi)精確定位各個(gè)控件,系統(tǒng)還提供了網(wǎng)格、標(biāo)尺等輔助工具。在圖3.7的控件布局工具欄的最后兩個(gè)按鈕分別用來(lái)網(wǎng)格和標(biāo)尺的切換。一旦網(wǎng)格顯示,添加或移動(dòng)控件時(shí)都將自動(dòng)定位在網(wǎng)格線上。,3.1對(duì)話框的使用,4. 測(cè)試對(duì)話框 “布局”菜單下的“測(cè)試”命令或布局工具欄上的測(cè)試按鈕是用來(lái)模擬所編輯的對(duì)話框的運(yùn)行情況,幫助用戶檢驗(yàn)對(duì)話框是否符合用戶的設(shè)計(jì)要求以及控件功能是否有效等。 5. 操作示例 (1) 下面來(lái)向?qū)υ捒蛱砑尤齻€(gè)靜態(tài)文本控件(一個(gè)靜態(tài)文本控件就是一個(gè)文本標(biāo)簽): (2) 在控件工具欄上,單擊 按鈕,然

14、后在對(duì)話框模板左上角單擊鼠標(biāo)左鍵不放,拖動(dòng) 鼠標(biāo)至滿意位置,釋放鼠標(biāo)鍵。這樣,第一個(gè)靜態(tài)文本控件添加到對(duì)話框中了。 (3) 單擊布局工具欄上的 按鈕,打開(kāi)對(duì)話框模板的網(wǎng)格。 (4) 在控件工具欄上,將 按鈕拖放到對(duì)話框模板中的左中部。這樣,第二個(gè)靜態(tài)文本控件添加到對(duì)話框中了。同樣的操作,將第三個(gè)靜態(tài)文本控件拖放到對(duì)話框模板中的左下部。 (5) 按住Shift鍵不放,依次單擊剛才添加的三個(gè)靜態(tài)文本控件,結(jié)果如圖3.8所示。 在布局工具欄上,依次單擊“大小相同”按鈕 、“靠左對(duì)齊”按鈕 、“上下間隔相等”按鈕 ,結(jié)果如圖3.9所示。,3.1對(duì)話框的使用,圖3.8 布局前的靜態(tài)文本控件 圖3.9 布

15、局后的靜態(tài)文本控件,3.1.4 創(chuàng)建對(duì)話框類 在對(duì)話框資源模板的空白區(qū)域(沒(méi)有其他元素或控件)內(nèi)雙擊鼠標(biāo)或按Ctrl+W快捷鍵,將彈出一個(gè)對(duì)話框,詢問(wèn)是否為對(duì)話框資源創(chuàng)建一個(gè)新類。 單擊OK按鈕,將彈出如圖3.10所示的New Class(新類)對(duì)話框。在Name(名稱)框中輸入類名CFirstDlg。Base class(基類)和Dialog ID(對(duì)話框標(biāo)識(shí)符)內(nèi)容是由系統(tǒng)自動(dòng)設(shè)置的,一般無(wú)需修改。從Base class框的內(nèi)容可以看出,用戶對(duì)話框類是從基類CDialog派生而來(lái)的。,3.1對(duì)話框的使用,單擊OK按鈕,一個(gè)基于對(duì)話框資源模板的對(duì)話框類CFirstDlg就創(chuàng)建好了。此時(shí),出現(xiàn)

16、MFC ClassWizard(MFC類向?qū)?對(duì)話框。,圖3.10 “New Class”對(duì)話框,3.1對(duì)話框的使用,3.1.5 添加對(duì)話框代碼 在MFC ClassWizard對(duì)話框,查看“Class name”列表中是否選擇了CFirstDlg,若不是,則在IDs列表中選擇CFirstDlg。在Messages框中找到并選定WM_INITDIALOG消息,如圖3.11。單擊Add Function按鈕或雙擊WM_INITDIALOG消息,MFC ClassWizard自動(dòng)為CFirstDlg類添加OnInitDialog函數(shù)。,圖3.11 “MFC ClassWizard”對(duì)話框,3.1對(duì)

17、話框的使用,需要說(shuō)明的是,WM_INITDIALOG是在對(duì)話框顯示之前向父窗口發(fā)送的消息,由于建立了此消息和OnInitDialog函數(shù)的關(guān)聯(lián),系統(tǒng)在對(duì)話框顯示之前就會(huì)調(diào)用此函數(shù),因此常將對(duì)話框一些初始化代碼添加到這個(gè)函數(shù)中。 在Member functions列表框中選擇剛添加的OnInitDialog函數(shù),單擊Edit Code按鈕(或直接在函數(shù)名雙擊鼠標(biāo)),將自動(dòng)出現(xiàn)該函數(shù)代碼編輯窗口,在此函數(shù)中添加下列代碼: BOOL CFirstDlg:OnInitDialog() CDialog:OnInitDialog(); / TODO: Add extra initialization he

18、re this-SetWindowText(修改標(biāo)題); return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE 代碼中,SetWindowText是CWnd的一個(gè)成員函數(shù),用來(lái)設(shè)置窗口的文本內(nèi)容。對(duì)于對(duì)話框來(lái)說(shuō),它設(shè)置的是對(duì)話框標(biāo)題。,3.1對(duì)話框的使用,3.1.6 在程序中調(diào)用對(duì)話框 在程序中調(diào)用對(duì)話框,一般是通過(guò)映射事件的消息(如命令消息、鼠標(biāo)消息、鍵盤(pán)消息等),在映射函數(shù)中進(jìn)行調(diào)用。這樣,相應(yīng)事件產(chǎn)生后,就會(huì)調(diào)

19、用其消息映射函數(shù),從而調(diào)用對(duì)話框的代碼初執(zhí)行。例如,下面的步驟用來(lái)實(shí)現(xiàn)在單文檔應(yīng)用程序 Ex_SDI的客戶區(qū)中單擊鼠標(biāo)左鍵,顯示前面添加的對(duì)話框。 (1) 按Ctrl+W鍵,彈出MFC ClassWizard對(duì)話框。 (2) 在Message Maps頁(yè)面中,從Class name列表中選擇CEx_SDIView,在IDs列表中選擇CEx_SDIView,然后在Messages框中找到并選中WM_LBUTTONDOWN消息。 (3) 單擊Add Function按鈕或雙擊WM_LBUTTONDOWN消息,則該消息的映射函數(shù)OnLButtonDown自動(dòng)添加到Member Functions列表

20、框中。 (4) 選中剛才添加的OnLButtonDown函數(shù),單擊Edit Code按鈕(或直接雙擊函數(shù)名),在打開(kāi)的文檔窗口中的此成員函數(shù)中添加下列代碼: void CEx_SDIView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default CFirstDlg dlg; dlg.DoModal(); CView:OnLButtonDown(nFlags, point); ,3.1對(duì)話框的使用,代碼中,DoModal是CDialog基類成員

21、函數(shù),用來(lái)將對(duì)話框按模式方式來(lái)顯示。 (5) 在CEx_SDIView 類的實(shí)現(xiàn)文件Ex_SDIView.cpp的前面添加CFirstDlg類的包含語(yǔ)句,即: #include Ex_SDIDoc.h #include Ex_SDIView.h #include FirstDlg.h (6) 編譯并運(yùn)行。在應(yīng)用程序文檔窗口的客戶區(qū)中單擊鼠標(biāo),就會(huì)出現(xiàn)如圖3.12的對(duì)話框,這個(gè)對(duì)話框就是剛才添加的對(duì)話框,對(duì)話框的標(biāo)題是程序代碼所指定的結(jié)果。,圖3.12 Ex_SDI運(yùn)行的結(jié)果,3.1對(duì)話框的使用,3.1.7 模式對(duì)話框和無(wú)模式對(duì)話框 上述通過(guò)DoModal成員函數(shù)來(lái)顯示的對(duì)話框稱為模式對(duì)話框,所

22、謂“模式對(duì)話框”是指當(dāng)對(duì)話框被彈出,用戶必須在對(duì)話框中作出相應(yīng)的操作,在退出對(duì)話框之前,對(duì)話框所在應(yīng)用程序的其它操作不能繼續(xù)執(zhí)行。 模式對(duì)話框的應(yīng)用范圍較廣,一般情況下,模式對(duì)話框會(huì)有確定(OK)和取消(Cancel)按鈕。單出確定按鈕,系統(tǒng)認(rèn)定用戶在對(duì)話框中的選擇或輸入有效,對(duì)話框退出;單擊取消按鈕,對(duì)話框中的選擇或輸入無(wú)效,對(duì)話框退出,程序恢復(fù)原有狀態(tài)。 事實(shí)上,對(duì)話框還可以用“無(wú)模式”方式來(lái)顯示,稱為無(wú)模式對(duì)話框,所謂“無(wú)模式對(duì)話框”是指當(dāng)對(duì)話框被彈出后,一直保留在屏幕上,用戶可繼續(xù)在對(duì)話框所在的應(yīng)用程序中進(jìn)行其它操作;當(dāng)需要使用對(duì)話框時(shí),只需象激活一般窗口一樣單擊對(duì)話框所在的區(qū)域即可激

23、活。由于“無(wú)模式”方式還要涉及到其它一些編程工作,限于篇幅,這里不作討論。,3.2控件的創(chuàng)建和使用方法,3.2.1 控件的創(chuàng)建方法 控件的創(chuàng)建方式有以下兩種:一種是在對(duì)話框模板資源中用編輯器來(lái)指定控件,這就是說(shuō),將控件的父窗口指定為對(duì)話框,這樣做的好處是明顯的,因?yàn)楫?dāng)應(yīng)用程序啟動(dòng)該對(duì)話框時(shí),框架系統(tǒng)就會(huì)為對(duì)話框創(chuàng)建控件;而當(dāng)對(duì)話框消失時(shí),控件也隨之清除。另一種方式是將控件看作是任一窗口的子窗口,并通過(guò)調(diào)用相應(yīng)的Create函數(shù)來(lái)創(chuàng)建。 例Ex_Edit 使用編程方式來(lái)創(chuàng)建一個(gè)編輯框 (1) 啟動(dòng)Visual C+ 6.0,選擇“文件”“新建”菜單,在彈出的“新建”對(duì)話框的工程標(biāo)簽頁(yè)面中,選擇M

24、FC AppWizard(exe)的項(xiàng)目類型。單擊位置框右側(cè)的按鈕,在彈出的對(duì)話框中,將該應(yīng)用程序的文件夾定位在“D:Visual C+應(yīng)用第3章”,并在工程編輯框中輸入單文檔應(yīng)用程序名Ex_Edit。 (2) 單擊確定按鈕,在出現(xiàn)的“步驟1”對(duì)話框中,選擇“基本對(duì)話框”應(yīng)用程序類型。 (3) 單擊完成按鈕出現(xiàn)一個(gè)信息對(duì)話框,顯示出用戶在前面幾個(gè)步驟中作出的選擇內(nèi)容,單擊確定按鈕系統(tǒng)開(kāi)始創(chuàng)建,并又回到了Visual C+ 6.0的主界面。,若無(wú)特別說(shuō)明,以后凡遇到“創(chuàng)建一個(gè)默認(rèn)的基于對(duì)話框應(yīng)用程序Ex_XXXX”就是指上述的步驟,本書(shū)作此約定。其中,Ex_XXXX為創(chuàng)建的應(yīng)用程序名。,3.2控

25、件的創(chuàng)建和使用方法,(4) 將項(xiàng)目工作區(qū)切換到ClassView頁(yè)面,展開(kāi)Ex_Edit所有的類結(jié)點(diǎn),右擊CEx_EditDlg類名,從快捷菜單中選擇Add Member Variable(添加成員變量),在出現(xiàn)的對(duì)話框中定義一個(gè)CEdit類對(duì)象m_wndEdit,通常以“m_”來(lái)作為變量的開(kāi)頭,表示“成員”(member)的意思。如圖3.13所示,單擊確定按鈕。,在MFC中,每一個(gè)類型的控件都用相應(yīng)的類來(lái)封裝。如編輯框控件,它的類是CEdit,通過(guò)該類對(duì)象來(lái)訪問(wèn)其成員,從而實(shí)現(xiàn)編輯框的操作。,圖3.13 添加成員變量,3.2控件的創(chuàng)建和使用方法,(5) 在項(xiàng)目工作區(qū)窗口的ClassView頁(yè)

26、面中,將CEx_EditDlg結(jié)點(diǎn)展開(kāi),雙擊OnInitDialog函數(shù)名,在該函數(shù)中添加下列代碼(return true;語(yǔ)句之前添加): BOOL CEx_EditDlg:OnInitDialog() CDialog:OnInitDialog(); CRect rcClient; this-GetClientRect( rcClient ); rcClient.right-= 100; m_wndEdit.Create(ES_MULTILINE|WS_CHILD|WS_VISIBLE|WS_TABSTOP| WS_BORDER, rcClient, this, 201 );/ 創(chuàng)建 CFo

27、nt *font = this-GetFont(); / 獲取對(duì)話框的字體 m_wndEdit.SetFont(font);/ 設(shè)置控件字體 return TRUE; / return TRUE unless you set the focus to a control ,3.2控件的創(chuàng)建和使用方法,分析和說(shuō)明: 前面曾說(shuō)過(guò),由于OnInitDialog函數(shù)在對(duì)話框初始化時(shí)被調(diào)用,因此將對(duì)話框中的一些初始化代碼都添加在此函數(shù)中。 由于Windows操作系統(tǒng)使用的是圖形界面,因此在MFC中,對(duì)于每種界面元素的幾何大小和位置常使用CPoint類(點(diǎn))、CSize類(大小)和CRect類(矩形)來(lái)描

28、述(以后還會(huì)討論)。代碼中,GetClientRect 是對(duì)話框基類CWnd的成員函數(shù),用來(lái)獲取其客戶區(qū)的位置和大小。對(duì)于對(duì)話框來(lái)說(shuō),其客戶區(qū)是指除標(biāo)題欄(如果有的話)和邊框之外的那部分區(qū)域。為了使創(chuàng)建的編輯框占用對(duì)話框整個(gè)客戶區(qū),且又不能覆蓋對(duì)話框右側(cè)的確定和取消按鈕,故將右邊的位置在原來(lái)的位置上減去100。 代碼中,CEdit類成員函數(shù)Create用來(lái)創(chuàng)建編輯框控件,該函數(shù)第一個(gè)參數(shù)用來(lái)指定指定控件的樣式(樣式),其中ES_MULTILINE(以ES_開(kāi)頭的)是編輯框類封裝的預(yù)定義樣式,表示創(chuàng)建的編輯框可以輸入多行文本,WS_CHILD(子窗口)、WS_VISIBLE(可見(jiàn))、WS_TAB

29、STOP(可用Tab鍵選擇)、WS_BORDER(帶有邊框)等都是CWnd類封裝的預(yù)定義窗口樣式,它們都可以直接引用,當(dāng)多個(gè)樣式指定時(shí),需要使用按位或運(yùn)算符“|”來(lái)連接。第二個(gè)參數(shù)用來(lái)指定它在父窗口中的位置和大小,第三個(gè)參數(shù)用來(lái)指定父窗口指針,最后一個(gè)參數(shù)是指定該控件的標(biāo)識(shí)值。,3.2控件的創(chuàng)建和使用方法, 由于編輯框是作為對(duì)話框的一個(gè)子窗口來(lái)創(chuàng)建的,因此WS_CHILD樣式是必不可少的,且還要使用WS_VISIBLE使控件在創(chuàng)建后顯示出來(lái)。 (6) 編譯并運(yùn)行,這樣就可以在創(chuàng)建的編輯框中輸入文本了,結(jié)果如圖3.14所示。,圖3.14 Ex_Edit運(yùn)行結(jié)果,3.2控件的創(chuàng)建和使用方法,3.2

30、.2 控件的消息及消息映射 1. 控件的消息 當(dāng)控件的狀態(tài)發(fā)生改變時(shí),控件就會(huì)向其父窗口發(fā)送消息,這個(gè)消息稱為通知消息。對(duì)于一般控件來(lái)說(shuō),其通知消息通常是一條WM_COMMAND消息,這條消息的wParam參數(shù)的低位字中含有控件標(biāo)識(shí)符,wParam參數(shù)的高位字則為通知代碼,lParam參數(shù)則是指向控件的句柄。 而對(duì)于有些控件,其通知消息通常是一條WM_NOTIFY消息,這條消息的wParam參數(shù)是發(fā)送通知消息的控件的標(biāo)識(shí)符,而lParam參數(shù)則是指向一個(gè)結(jié)構(gòu)指針。 2. 映射控件消息 不管是什么控件消息,一般都可以用MFC ClassWizard對(duì)它們加以映射。例如: 例Ex_Btns 一個(gè)或

31、多個(gè)按鈕控件的映射 (1) 創(chuàng)建一個(gè)默認(rèn)的基于對(duì)話框應(yīng)用程序Ex_Btns。 (2) 在打開(kāi)的對(duì)話框資源模板中,刪除“TODO: 在這里設(shè)置對(duì)話控制。”靜態(tài)文本控件,將確定和取消按鈕向?qū)υ捒蜃筮呉苿?dòng)一段位置,然后將鼠標(biāo)移至對(duì)話框資源模板右下角的實(shí)心藍(lán)色方塊處,拖動(dòng)鼠標(biāo),將對(duì)話框資源模板的大小縮小一些。,3.2控件的創(chuàng)建和使用方法,(3) 在對(duì)話框資源模板的左邊依次添加三個(gè)按鈕控件,保留其默認(rèn)屬性,并將其布局得整齊一些,且上下間隔相同。如圖3.15所示。 (4)按快捷鍵Ctrl+W,打開(kāi)MFC ClassWizard對(duì)話框,查看“Class name”列表中是否選擇了CEx_BtnsDlg,在I

32、Ds列表中選擇 IDC_BUTTON1,這是添加第一個(gè)按鈕后,系統(tǒng)自動(dòng)為此按鈕設(shè)置的默認(rèn)標(biāo)識(shí)符,然后在Messages框中選擇BN_CLICKED消息。,圖3.15 添加三個(gè)按鈕,(5) 單擊Add Function按鈕或雙擊BN_CLICKED消息,出現(xiàn)“Add Member Function”對(duì)話框,在這里可以輸入成員函數(shù)的名稱,系統(tǒng)默認(rèn)的函數(shù)名為OnButton1。如圖3.16所示。,3.2控件的創(chuàng)建和使用方法,圖3.16 添加按鈕消息映射函數(shù),3.2控件的創(chuàng)建和使用方法,需要說(shuō)明的是: 不同資源對(duì)象(控件、菜單命令等)所產(chǎn)生的消息是不相同的。例如,按鈕控件IDC_BUTTON1的消息有

33、兩個(gè):BN_CLICKED和BN_DOUBLECLICKED,分別表示當(dāng)用戶單擊或雙擊該按鈕時(shí)產(chǎn)生的通知消息。 一般不需要對(duì)對(duì)話框中的確定(OK)與取消(Cancel)按鈕進(jìn)行消息映射,因?yàn)橄到y(tǒng)已自動(dòng)設(shè)置了這兩個(gè)按鈕的動(dòng)作,當(dāng)用戶單擊這兩個(gè)按鈕都將自動(dòng)關(guān)閉對(duì)話框,且確定(OK)按鈕動(dòng)作還使得對(duì)話框數(shù)據(jù)有效。 (6) 單擊OK按鈕,在MFC ClassWizard的“Member functions”列表中將列出新增加的成員函數(shù)。選擇此函數(shù),單擊Edit Code按鈕(或直接在函數(shù)名雙擊鼠標(biāo)),開(kāi)發(fā)環(huán)境的文檔窗口中將自動(dòng)打開(kāi)該函數(shù)所在的源代碼文件,并定位到該函數(shù)的實(shí)現(xiàn)代碼處。在此成員函數(shù)中 添加

34、下列代碼: void CEx_BtnsDlg:OnButton1() MessageBox(你按下了Button1按鈕!); ,3.2控件的創(chuàng)建和使用方法,(7) 編譯并運(yùn)行,當(dāng)單擊Button1按鈕時(shí),就會(huì)執(zhí)行OnButton1函數(shù),彈出一個(gè)消息對(duì)話框,顯示“你按下了Button1按鈕”。 這就是按鈕BN_CLICKED消息的映射過(guò)程,其他控件的消息也可以類似映射。 3. 映射控件通用消息 上述過(guò)程是映射一個(gè)控件的某一個(gè)消息,事實(shí)上也可通過(guò)WM_COMMAND消息的映射來(lái)處理一個(gè)或多個(gè)控件的通用消息,如下面的步驟: (1) 打開(kāi)MFC ClassWizard對(duì)話框,在“Class name”

35、列表中是否選擇了CEx_BtnsDlg,在IDs列表中選擇CEx_BtnsDlg,在Messages框中找到并雙擊OnCommand,這樣OnCommand消息函數(shù)就添加好了,如圖3.17所示。由于OnCommand函數(shù)是一個(gè)用來(lái)處理WM_COMMAND消息的虛函數(shù),而這里添加的OnCommand函數(shù)事實(shí)上是一個(gè)在類中實(shí)際調(diào)用的函數(shù),可稱為實(shí)例函數(shù)。這樣的映射操作,可以稱之為對(duì)虛函數(shù)OnCommand的重載。,3.2控件的創(chuàng)建和使用方法,圖3.17 添加OnCommand函數(shù)重載,3.2控件的創(chuàng)建和使用方法,(2) 單擊Edit Code按鈕(或直接雙擊函數(shù)名),在OnCommand函數(shù)中添加

36、下列代碼: BOOL CEx_BtnsDlg:OnCommand(WPARAM wParam, LPARAM lParam) WORD nCode = HIWORD(wParam);/ 控件的通知消息 WORD nID= LOWORD(wParam);/ 控件的ID值 if (nID = IDC_BUTTON1) ,3.2控件的創(chuàng)建和使用方法,(3) 編譯運(yùn)行并測(cè)試。 需要說(shuō)明的是:由于Button1按鈕的BN_CLICKED消息處理同時(shí)存在兩種函數(shù),即OnButton1和OnCommand,因此若單擊Button1按鈕,系統(tǒng)會(huì)先執(zhí)行哪一個(gè)函數(shù)呢?測(cè)試的結(jié)果表明,系統(tǒng)先執(zhí)行OnCommand函

37、數(shù)代碼,然后執(zhí)行OnButton1函數(shù)代碼。之所 以還能執(zhí)行OnButton1函數(shù)代碼,是因?yàn)镺nCommand函數(shù)的最后一句代碼“return CDialog:OnCommand(wParam, lParam);”,它將控件的消息交由對(duì)話框其他函數(shù)處理。 3.2.3 控件的數(shù)據(jù)交換(DDX)和數(shù)據(jù)校驗(yàn)(DDV) 使用MFC ClassWizard可以很方便地為一個(gè)控件設(shè)置相關(guān)聯(lián)變量并可設(shè)置其數(shù)據(jù)范圍。例如,設(shè)一對(duì)話框中有一個(gè)編輯框和一個(gè)按鈕控件,單擊按鈕控件,則按鈕控件的標(biāo)題就是編輯框中輸入的內(nèi)容。(這個(gè)示例為3部分闡述:控件及控件變量的添加、理解DDX/DDV、使用UpdateData),

38、例Ex_DDX 控件的DDX和DDV 1. 控件及控件變量的添加 (1) 創(chuàng)建一個(gè)默認(rèn)的基于對(duì)話框應(yīng)用程序Ex_DDX。 (2) 在打開(kāi)的對(duì)話框資源模板中,刪除“TODO: 在這里設(shè)置對(duì)話控制?!膘o態(tài)文本控件,將確定和取消按鈕向?qū)υ捒蜃筮呉苿?dòng)一段位置,然后將鼠標(biāo)移至對(duì)話框資源模板右下角的實(shí)心藍(lán)色方塊處,拖動(dòng)鼠標(biāo),將對(duì)話框資源模板的大小縮小一些。,圖3.18 添加編輯框和按鈕,3.2控件的創(chuàng)建和使用方法,(3) 在對(duì)話框資源模板的左邊添加一個(gè)編輯框控件和一個(gè)按鈕控件,保留其默認(rèn)屬性,并將其布局得整齊一些。如圖3.18所示。 (4) 按快捷鍵Ctrl+W,打開(kāi)MFC ClassWizard對(duì)話框,

39、并切換到Member Variables頁(yè)面,查看“Class name”列表中是否選擇了CEx_DDXDlg,此時(shí)可以在Control IDs列表中看到剛才添加的控鈕和編輯框的標(biāo)識(shí)符IDC_BUTTON1和IDC_EDIT1,如圖3.19所示。 在Control IDs列表中,選定按鈕控件標(biāo)識(shí)符IDC_BUTTON1,雙擊鼠標(biāo)左鍵或單擊Add Variable按鈕,彈出Add Member Variable對(duì)話框,如圖3.20所示。,圖3.19 “Member Variables”頁(yè)面,3.2控件的創(chuàng)建和使用方法,圖3.20 為按鈕控件添加控件變量 圖3.21 為編輯框控件添加控件變量,3.

40、2控件的創(chuàng)建和使用方法,(6) 在Member variable name框中填好與控件相關(guān)聯(lián)的成員變量m_RelBtn,單擊OK按鈕,又回到MFC ClassWizard對(duì)話框的Member Variables頁(yè)面中,在Control IDs列表中出現(xiàn)剛才添加的控件變量m_RelBtn。 (7) 在Control IDs列表中,選定編輯框控件標(biāo)識(shí)符IDC_EDIT1,雙擊鼠標(biāo)左鍵或單擊Add Variable按鈕,彈出Add Member Variable對(duì)話框。在Member variable name框中輸入控件變量名m_strEdit,保留Category的默認(rèn)選項(xiàng)Value,在Var

41、iable type(變量值類型)中選擇該變量的數(shù)據(jù)類型為CString(字符串類),結(jié)果如圖3.21所示。 (8) 單擊OK按鈕,又回到MFC ClassWizard對(duì)話框的Member Variables頁(yè)面。 從圖3.20和3.21的不同可以看出: 對(duì)于大多數(shù)控件而言,Category框內(nèi)可選擇Value或Control兩種類型。Control所對(duì)應(yīng)的變量類型就是MFC為該控件封裝的控件類,Value所對(duì)應(yīng)的是數(shù)值類型。但按鈕控件變量沒(méi)有Value類型。 不同的控件所提供的關(guān)聯(lián)的數(shù)值類型各不相同。例如,對(duì)于編輯框來(lái)說(shuō),Variables type中的數(shù)值類型可以有CString(字符串類

42、)、int、UINT、long、DWORD、float、double、BYTE、short、BOOL等。,3.2控件的創(chuàng)建和使用方法, 但要注意:DDV/DDX技術(shù)中,允許為同一個(gè)控件關(guān)聯(lián)多個(gè)變量,但必須保證這些變量名是互不相同的,且這些變量在同一個(gè)類型不能有多個(gè)變量,即在Value和Control類型中各自只能有一個(gè)關(guān)聯(lián)變量。另外,通常將Value型控件變量稱為控件值變量。 如果添加的關(guān)聯(lián)變量是一個(gè)數(shù)值類型,則在MFC ClassWizard對(duì)話框的Member Variables頁(yè)面下方還要求用戶輸入變量的范圍,這就是控件的數(shù)據(jù)校驗(yàn)設(shè)置。 在Control IDs列表中,選定編輯框控件標(biāo)識(shí)

43、符IDC_EDIT1,此時(shí)就會(huì)下方位置處出現(xiàn)Maximum Characters(最大字符個(gè)數(shù))框,用來(lái)設(shè)定該控件變量允許的最大字符個(gè)數(shù)。輸入20,結(jié)果如圖3.22所示,單擊確定按鈕。,圖3.22 編輯框控件值變量的DDV設(shè)置,3.2控件的創(chuàng)建和使用方法,需要說(shuō)明的是,若控件值變量的數(shù)據(jù)類型是整型或浮點(diǎn)型,則DDV框就變成設(shè)置最大和最小的兩個(gè)數(shù)值框了。 2. 理解DDX/DDV 打開(kāi)CEx_DDXDlg類源文件,可以發(fā)現(xiàn)MFC ClassWizard對(duì)上述操作作了以下三方面的修改: (1) 在Ex_DDXDlg.h文件中,添加了控件變量的聲明,代碼如下面的加粗斜體部分: / Dialog Da

44、ta /AFX_DATA(CEx_DDXDlg) enum IDD = IDD_EX_DDX_DIALOG ; / 用枚舉定義一個(gè)符號(hào)常量IDD,使其值等于IDD_EX_DDX_DIALOG CButtonm_RelBtn; CStringm_strEdit; /AFX_DATA (2) 在Ex_DDXDlg.cpp文件中的CEx_DDXDlg構(gòu)造函數(shù)實(shí)現(xiàn)代碼處,添加了控件變量的一些初始代碼(加粗斜體部分):,3.2控件的創(chuàng)建和使用方法,CEx_DDXDlg:CEx_DDXDlg(CWnd* pParent /*=NULL*/) : CDialog(CEx_DDXDlg:IDD, pParen

45、t) /AFX_DATA_INIT(CEx_DDXDlg) m_strEdit = _T(); /AFX_DATA_INIT / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 在Ex_DDXDlg.cpp文件中的DoDataExchange函數(shù)體內(nèi),添加了控件的DDX/DDV代碼(加粗斜體部分),它們都是一些以DDV_或DDX_開(kāi)頭的函數(shù)調(diào)用。 void CEx_DDXDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX);

46、 /AFX_DATA_MAP(CEx_DDXDlg) DDX_Control(pDX, IDC_BUTTON1, m_RelBtn); DDX_Text(pDX, IDC_EDIT1, m_strEdit); DDV_MaxChars(pDX, m_strEdit, 20); /AFX_DATA_MAP ,3.2控件的創(chuàng)建和使用方法,需要說(shuō)明的是,上述代碼中以“/AFX_DATA”或“/AFX_DATA_XXXX”開(kāi)頭,而以“/AFX_DATA”或“/AFX_DATA_XXXX”結(jié)尾的標(biāo)記是ClassWizard定義的專門(mén)用作DDX/DDV的標(biāo)記,表示該部分的代碼是由ClassWizard自動(dòng)

47、管理,一般不需要更改。 3. 使用UpdateData 當(dāng)為一個(gè)控件定義一個(gè)關(guān)聯(lián)的數(shù)據(jù)變量后,即對(duì)控件值變量來(lái)說(shuō),就可使用CWnd類的成員函數(shù)UpdateData使數(shù)值在控件顯示和控件值變量之間進(jìn)行切換。 UpdateData函數(shù)只有一個(gè)為T(mén)RUE或FALSE的參數(shù)。當(dāng)調(diào)用UpdateData(FALSE)時(shí),數(shù)據(jù)由控件相關(guān)聯(lián)的成員變量向控件傳輸,即將控件值變量的值在控件中顯示出來(lái);當(dāng)調(diào)用UpdateData(TRUE)或不帶參數(shù)的UpdateData時(shí),數(shù)據(jù)從控件向相關(guān)聯(lián)的 成員變量復(fù)制,即將當(dāng)前控件顯示的值存儲(chǔ)到控件值變量中。故,當(dāng)需要獲取當(dāng)前控 件的值之前,一定要調(diào)用UpdateData

48、(TRUE)或不帶參數(shù)的UpdateData。例如: (1) 按快捷鍵Ctrl+W,打開(kāi)MFC ClassWizard對(duì)話框,為按鈕IDC_BUTTON1在CEx_DDXDlg類添加BN_CLICKED消息的映射函數(shù)OnButton1。,3.2控件的創(chuàng)建和使用方法,在映射函數(shù)OnButton1中添加下面代碼: void CEx_DDXDlg:OnButton1() UpdateData();/ 默認(rèn)參數(shù)值是TRUE m_strEdit.TrimLeft(); m_strEdit.TrimRight(); if ( m_strEdit.IsEmpty() ) m_RelBtn.SetWindow

49、Text( Button1 ); else m_RelBtn.SetWindowText( m_strEdit ); 代碼中,由于m_strEdit 是CString類對(duì)象,因而可以調(diào)用CString類的公有成員函數(shù)。其中,TrimLeft和TrimRight函數(shù)不帶參數(shù)時(shí)分別用來(lái)去除字符串最左邊或最右邊一些空格符、換行符、Tab字符等白字符,IsEmpty是用來(lái)判斷字符串是否為空。,3.2控件的創(chuàng)建和使用方法,這樣,當(dāng)編輯框內(nèi)容有除白字符之外的實(shí)際字符的字符串時(shí),SetWindowText用將其內(nèi)容設(shè)定為按鈕控件的標(biāo)題。否則,按鈕控件的標(biāo)題為“Button1”。 (3) 編譯并運(yùn)行。當(dāng)在編輯

50、框中輸入“Hello”后,單擊Button1按鈕,按鈕的名稱就變成了編輯框控件中的內(nèi)容“Hello”,其結(jié)果如圖3.23所示。,圖3.23 Ex_DDX運(yùn)行結(jié)果,3.3常用控件,根據(jù)控件的特性和功能,一般可將其分為三類:Windows公共控件、ActiveX控件以及MFC新增的一些控件等。表3.3列出了本書(shū)所用到的常用控件類。,表3.3 常用控件類,3.3常用控件,3.3.1 靜態(tài)控件和按鈕 靜態(tài)控件和按鈕是Windows最基本的控件之一。 1. 靜態(tài)控件 一個(gè)靜態(tài)控件是用來(lái)顯示一個(gè)字符串、框、矩形、圖標(biāo)、位圖或增強(qiáng)的圖元文件。它可以被用來(lái)作為標(biāo)簽、框或用來(lái)分隔其它的控件。一個(gè)靜態(tài)控件一般不接

51、收用戶輸入,也不產(chǎn)生通知消息。 在對(duì)話框編輯器的控件工具欄中,屬于靜態(tài)控件的有:靜態(tài)文本( )、組框( )和靜態(tài)圖片( )三種。其中,靜態(tài)圖片控件的常規(guī)(General)屬性對(duì)話框(右擊添加的控件,從彈出的快捷菜單中選擇“屬性”菜單,即可彈出該控件的屬性對(duì)話框),如圖3.24所示。 在靜態(tài)圖片控件的常規(guī)屬性對(duì)話框中,用戶可以選擇圖片“類型”、“圖像”兩個(gè)組合框中的有關(guān)選項(xiàng)內(nèi)容,并可將應(yīng)用程序資源中的圖標(biāo)、位圖等內(nèi)容顯示在該靜態(tài)圖片控件中。另外,用戶還可設(shè)置其樣式來(lái)改變控件的外觀以及圖像在控件的位置等。例如,在任一個(gè)對(duì)話框中添加一個(gè)靜態(tài)圖片控件,在其常規(guī)屬性對(duì)話框中,將其“類型”選擇為“圖標(biāo)(I

52、con)”,再將其“圖像”選擇為IDR_MAINFRAME,則靜態(tài)圖片控件顯示的圖標(biāo)是 。,3.3常用控件,圖3.24 靜態(tài)圖片控件的常規(guī)屬性對(duì)話框,例Ex_Etched 制作水平蝕刻線 (1)創(chuàng)建一個(gè)默認(rèn)的對(duì)話框應(yīng)用程序Ex_Etched。 (2) 在打開(kāi)的對(duì)話框資源模板中,刪除“TODO: 在這里設(shè)置對(duì)話控制?!膘o態(tài)文本控件,將確定和取消按鈕向?qū)υ捒蜃筮呉苿?dòng)一段位置,然后將鼠標(biāo)移至對(duì)話框資源模板右下角的實(shí)心藍(lán)色方塊處,拖動(dòng)鼠標(biāo),將對(duì)話框資源模板的大小縮小一些。,3.3常用控件,(3)在對(duì)話框資源模板中的靠左中間位置添加一個(gè)靜態(tài)圖片控件,右擊該控件,從彈出的快捷菜單中選擇“屬性”,彈出其屬性

53、對(duì)話框。 (4)將“類型”選擇為默認(rèn)的“框架(Frame)”類型,將“顏色”類型選為“蝕刻(Etched)”,然后關(guān)閉屬性對(duì)話框。此時(shí),靜態(tài)圖片控件變成一個(gè)蝕刻的矩形框。 將鼠標(biāo)移動(dòng)到添加的靜態(tài)圖片控件的右下角位置,使鼠標(biāo)指針變成,拖動(dòng)鼠標(biāo)使控件的大小變成一條水平線,單擊對(duì)話框測(cè)試按鈕,則結(jié)果如圖3.25所示。,凡以后在對(duì)話框中有這樣的水平蝕刻線或垂直蝕刻線,都是指的這種制作方法,書(shū)中不再講述其制作過(guò)程。本書(shū)作此約定。,3.3常用控件,2. 按鈕 在Windows中所用的按鈕是用來(lái)實(shí)現(xiàn)一種開(kāi)與關(guān)的輸入,常見(jiàn)的按鈕有3種類型:按鍵按鈕、單選按鈕、復(fù)選框按鈕,如圖3.26所示。,圖3.26 按鈕的

54、不同類型,(1)按鍵按鈕。按鍵按鈕通??梢粤⒓串a(chǎn)生某個(gè)動(dòng)作,執(zhí)行某個(gè)命令,因此也常被稱為命令按鈕。按鍵按鈕有兩種樣式:標(biāo)準(zhǔn)按鍵按鈕和默認(rèn)(缺?。┌存I按鈕。從外觀上來(lái)說(shuō),默認(rèn)按鍵按鈕是在標(biāo)準(zhǔn)按鍵按鈕的周圍加上一個(gè)黑色邊框(參見(jiàn)圖3.26),這個(gè)黑色邊框表示該按鈕已接受到鍵盤(pán)的輸入焦點(diǎn),這樣一來(lái),用戶只須按回車鍵就能按下該按鈕。一般來(lái)說(shuō),只把最常用的按鍵按鈕設(shè)定為默認(rèn)按鍵按鈕,具體設(shè)定的方法是在按鍵按鈕屬性對(duì)話框的樣式(Style)頁(yè)面中選中“缺省按鈕(Default button)”項(xiàng)。,3.3常用控件,(2)單選按鈕。單選按鈕的外形是在文本前有一個(gè)圓圈,當(dāng)它被選中時(shí),單選按鈕中就標(biāo)上一個(gè)黑點(diǎn),

55、它可分為一般和自動(dòng)兩種類型。在自動(dòng)類型中,用戶若選中同組按鈕中的某個(gè)單選按鈕,則其余的單選按鈕的選中狀態(tài)就會(huì)清除,保證了多個(gè)選項(xiàng)始終只有一個(gè)被選中。 (3)復(fù)選框。復(fù)選框的外形是在文本前有一個(gè)空心方框,當(dāng)它被選中時(shí),復(fù)選框 中就加上一個(gè)“”標(biāo)記,通常復(fù)選框只有選中和未選中兩種狀態(tài),若復(fù)選框前面有一個(gè)灰色是“”,則這樣的復(fù)選框是三態(tài)復(fù)選框,如圖3.26的Check2,它表示復(fù)選框的選擇狀態(tài)是“不確定”。設(shè)定成三態(tài)復(fù)選框的方法是在復(fù)選框?qū)傩詫?duì)話框的樣式(Style)頁(yè)面中選中“三次狀態(tài)(Tri-state)”項(xiàng)。 3. 按鈕的消息 在按鈕映射的消息中,常見(jiàn)的只有兩個(gè):BN_CLICKED(單擊按鈕

56、)和BN_DOUBLE CLICKED(雙擊按鈕)。 4. 按鈕選中操作 最常用的按鈕操作是設(shè)置或獲取一個(gè)按鈕或多個(gè)按鈕的選中狀態(tài)。CButton類的成員函數(shù)SetCheck和GetCheck分別用來(lái)設(shè)置或獲取指定按鈕的選中狀態(tài),其原型如下: void SetCheck( int nCheck ); int GetCheck( ) const;,3.3常用控件,其中,nCheck和GetCheck函數(shù)返回的值可以是:0表示不選中,1表示選中,2表示不確定(僅用于三態(tài)按鈕)。 而對(duì)于同組多個(gè)單選按鈕的選中狀態(tài)的設(shè)置或獲取,需要使用通用窗口類CWnd的成員函數(shù)CheckRadioButton和Ge

57、tCheckedRadioButton,它們的原型如下: void CheckRadioButton( int nIDFirstButton, int nIDLastButton, int nIDCheckButton ); int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton ); 其中,nIDFirstButton和nIDLastButton分別指定同組單選按鈕的第一個(gè)和最后一個(gè)按鈕ID值,nIDCheckButton用來(lái)指定要設(shè)置選中狀態(tài)的按鈕ID值, 函數(shù)GetCheckedRadioButton返回被選中的按

58、鈕ID值。,5. 示例:制作問(wèn)卷調(diào)查 問(wèn)卷調(diào)查是日常生活中經(jīng)常遇到的調(diào)查方式。例如,圖3.27就是一個(gè)問(wèn)卷調(diào)查對(duì)話框,它針對(duì)“上網(wǎng)”話題提出了三個(gè)問(wèn)題,每個(gè)問(wèn)題都有四個(gè)選項(xiàng),除最后一個(gè)問(wèn)題外,其余都是單項(xiàng)選擇。創(chuàng)建的過(guò)程如下(分創(chuàng)建并設(shè)計(jì)對(duì)話框、完善代碼兩部分來(lái)闡述):,圖3.27 上網(wǎng)問(wèn)卷調(diào)查對(duì)話框,3.3常用控件,例Ex_Research 制作問(wèn)卷調(diào)查 1. 創(chuàng)建并設(shè)計(jì)對(duì)話框 (1)創(chuàng)建一個(gè)默認(rèn)的對(duì)話框應(yīng)用程序Ex_Research。 (2)Visual C+會(huì)自動(dòng)打開(kāi)對(duì)話框編輯器并顯示對(duì)話框資源模板。單擊對(duì)話框編輯器工具欄上的切換網(wǎng)格按鈕 ,顯示對(duì)話框網(wǎng)格,將對(duì)話框標(biāo)題改為“上網(wǎng)問(wèn)卷調(diào)查”。 (3)調(diào)整對(duì)話框的大小,刪除對(duì)話框中間的“TODO: 在這里設(shè)置對(duì)話控制。”靜態(tài)文本控件,將確定和取消按鈕移至對(duì)話框的下方,并向?qū)υ捒蛑刑砑咏M框(Group)控件,然后參看圖3.28調(diào)整其大小和位置。圖3.28 添加的組框和單選按鈕 (4)右擊添加的組框控件,從彈出的快捷菜單中選擇“屬性”菜單,出現(xiàn)該控件的屬性對(duì)話框,在屬性對(duì)話框“常規(guī)(General)”頁(yè)面中可以看到它的ID為默認(rèn)的IDC_STATIC。將其標(biāo)題(Caption)屬性內(nèi)容由“Sta

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論