版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
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ì)話框使用情況的一般過程,即依次如下: (1) 添加對(duì)話框資源; (2) 設(shè)置對(duì)話框的屬性; (3) 添加和布局控件; (4) 創(chuàng)建對(duì)話框類; (5) 添加對(duì)話框代碼; (6) 在程序中調(diào)用對(duì)話框。 顯然,對(duì)于第一種對(duì)話框使用情況來說,其過程通常是從(2)到(5)。 3.1.1 添
2、加對(duì)話框資源 在對(duì)話框資源添加之前,先來創(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)簽頁面中,選擇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)開始創(chuàng)建,并又回到了Visual C+ 6.0的主界面。若無特別說明,以后凡遇到“創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_XXXX”就是指上述的步驟,本書作此約定。其中,Ex_XXXX為創(chuàng)建的應(yīng)用程序名。 這樣就可在單文檔應(yīng)用程序Ex_SDI中添加一個(gè)對(duì)話框資源,通常按下列步驟進(jìn)行: (1)選擇“插入”“資源”菜單,或按快捷鍵Ctrl+R打開“插入資源”對(duì)話框,在對(duì)話框中可以看到資源列表中存在Dialog項(xiàng),若單擊Dialog項(xiàng)左邊的“+”號(hào),將展開對(duì)話框資源的不同類型選項(xiàng),如圖3.1所示,表3.1列出各種類型的對(duì)話框資源
4、的不同用途。 圖3.1 “插入資源”對(duì)話框 其中,新建按鈕是用來創(chuàng)建一個(gè)由“資源類型”列表中指定類型的新資源,自定義按鈕是用來創(chuàng)建“資源類型”列表中沒有的新類型的資源,引入按鈕是用于將外部已有的位圖、圖標(biāo)、光標(biāo)或其他定制的資源添加到當(dāng)前應(yīng)用程序中。3.1對(duì)話框的使用表3.1 對(duì)話框資源類型類 型說 明IDD_DIALOGBAR對(duì)話條,往往和工具條停放一起IDD_FORMVIEW一個(gè)表單(一種樣式的對(duì)話框),用于表單視圖類的資源模板IDD_OLE_PROPPAGE_LARGE一個(gè)大的OLE屬性頁IDD_OLE_PROPPAGE_SMALL一個(gè)小的OLE屬性頁IDD_ PROPPAGE_LARGE
5、一個(gè)大屬性頁,用于屬性對(duì)話框IDD_ PROPPAGE_MEDIUM一個(gè)中等大小的屬性頁,用于屬性對(duì)話框IDD_ PROPPAGE_SMALL一個(gè)小的屬性頁,用于屬性對(duì)話框3.1對(duì)話框的使用 (3)對(duì)展開的不同類型的對(duì)話框資源不作任何選擇,選中“Dialog”,單擊新建按鈕,系統(tǒng)就會(huì)自動(dòng)為當(dāng)前應(yīng)用程序添加了一個(gè)對(duì)話框資源,并出現(xiàn)如圖3.2所示的界面。 對(duì)話框模板控件工具欄布局工具欄默認(rèn)標(biāo)識(shí)符圖3.2 添加對(duì)話框資源后的開發(fā)環(huán)境3.1對(duì)話框的使用 系統(tǒng)為對(duì)話框資源自動(dòng)賦給它一個(gè)默認(rèn)的標(biāo)識(shí)符名稱(第一次為IDD_DIALOG1,以后依次為IDD_DIALOG2、IDD_DIALOG3、.)。 使用
6、了通用的對(duì)話框模板創(chuàng)建新的對(duì)話框資源。對(duì)話框的默認(rèn)標(biāo)題為“對(duì)話” (Dialog),有確定和取消兩個(gè)按鈕,這兩個(gè)按鈕的標(biāo)識(shí)符分別為IDOK和IDCANCEL。 自動(dòng)出現(xiàn)“對(duì)話框資源編輯器”窗口,在這里可以通過“控件工具欄”和“布局工具欄”向?qū)υ捒蛱砑雍筒季挚丶⒖稍O(shè)置對(duì)話框的屬性。 需要說明的是,第一次使用Visual C+6.0的對(duì)話框編輯器時(shí),“控件工具欄”和“布局工具欄”可能是浮動(dòng),可以將其拖放到指定位置(參看圖3.2),以便讓開發(fā)環(huán)境更易于操作。 3.1.2 設(shè)置對(duì)話框?qū)傩?在對(duì)話框模板的空白處右擊鼠標(biāo),從彈出的快捷菜單中選擇“屬性”菜單項(xiàng),出現(xiàn)如圖3.3所示的對(duì)話框?qū)傩源翱凇?可以
7、看出,對(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ū)傩源翱诒?.2 對(duì)話框的常規(guī)(General)屬性項(xiàng) 目說 明ID框修改或選擇對(duì)話框的標(biāo)識(shí)符名稱標(biāo)題框輸入對(duì)話框的標(biāo)題名稱,中英文均可,如“我的對(duì)話框”字體按鈕單擊此按鈕可選擇字體的種類(如宋體)及尺寸(如9號(hào))位置X/位置Y對(duì)話框左上角在父窗口中的X、Y坐標(biāo),都為0時(shí)表示居
8、中菜單框默認(rèn)值為無,當(dāng)對(duì)話框需要菜單時(shí)輸入或選擇指定的菜單資源類名稱框默認(rèn)值為無,它提供C/C+語言編程時(shí)所需要的對(duì)話框類名,對(duì)MFC類庫的資源文件來說,該項(xiàng)不被激活。3.1對(duì)話框的使用圖3.3中,有一個(gè) 圖標(biāo),當(dāng)單擊此圖標(biāo)后,圖標(biāo)變成,表示該對(duì)話框?qū)⒁恢憋@示直到用戶關(guān)閉它。在 狀態(tài)下,當(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ì)話框”; 單擊字體按鈕,通過彈出的字體對(duì)話框?qū)?duì)話框內(nèi)的文本設(shè)置成“宋
9、體,9” ,以使自己的對(duì)話框和Windows中的對(duì)話框保持外觀上的一致(這是界面設(shè)計(jì)的“一致性”原則)。3.1對(duì)話框的使用圖3.4 對(duì)話框?qū)傩孕薷暮蟮慕缑?.1對(duì)話框的使用 3.1.3 添加和布局控件 一旦對(duì)話框資源被打開或被創(chuàng)建,就會(huì)出現(xiàn)對(duì)話框編輯器,通過它可以在對(duì)話框中進(jìn)行控件的添加和布局等操作。1. 控件的添加對(duì)話框編輯器一旦打開,“控件”工具欄一般都會(huì)隨之出現(xiàn)。若不出現(xiàn),則可在開發(fā)環(huán)境的 工具欄區(qū)的空白處右擊鼠標(biāo),從彈出的快捷菜單中選擇“控件”。 利用“控件”工具欄中的各個(gè)按鈕可以順利完成控件的添加。圖3.5說明了各個(gè)按鈕所對(duì)應(yīng)的控件類型。控件的選擇靜態(tài)文本組框復(fù)選框組合框水平滾動(dòng)條旋
10、轉(zhuǎn)按鈕滑動(dòng)條列表視圖標(biāo)簽復(fù)合編輯月歷用戶定制控件靜態(tài)圖片編輯框按鈕單選框列表框垂直滾動(dòng)條進(jìn)展條熱鍵樹形視圖動(dòng)畫日期選擇IP地址擴(kuò)展組合框圖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)變成“十”字形狀;在指定位置處單擊鼠標(biāo)左鍵不放,拖動(dòng)鼠標(biāo)至滿意位置,釋放鼠標(biāo)鍵。 用鼠標(biāo)左鍵點(diǎn)中控件工具欄中的某控件,并按住鼠標(biāo)左鍵不放;在移動(dòng)鼠
11、標(biāo)到對(duì)話框的指定位置的過程中,用戶會(huì)看到一個(gè)虛線框,下面帶有該控件的標(biāo)記;釋放鼠標(biāo)左鍵,新添加的控件立即出現(xiàn)在對(duì)話框中。 2. 控件的選取 控件的刪除、復(fù)制和布局操作一般都要先選取控件,若選取單個(gè)控件,則可以下列方法: 用鼠標(biāo)直接選取。首先保證在控件工具欄中的選擇按鈕()是被選中的,然后移動(dòng)鼠標(biāo)指針至指定的控件上,單擊鼠標(biāo)左鍵即可。 用助記符來選取。如果控件的標(biāo)題中帶有下劃線的字符,這個(gè)字符就是助記符,選擇時(shí)直接按下該助記符鍵或“Alt+助記符”組合鍵即可。 3.1對(duì)話框的使用 用Tab鍵選取。在對(duì)話框編輯器中,系統(tǒng)會(huì)根據(jù)控件的添加次序自動(dòng)設(shè)置相應(yīng)的Tab鍵次序。利用Tab鍵,用戶可在對(duì)話框內(nèi)
12、的控件中進(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è)控件被選取后,其四周由選擇框包圍著,選擇框上還有幾個(gè)(通常是八個(gè))藍(lán)色實(shí)心小方塊,拖動(dòng)它可改變控件的大小,如圖3.6(a)所示。 (2)多個(gè)控件被選取后,其中只有
13、一個(gè)控件的選擇框有幾個(gè)藍(lán)色實(shí)心小方塊,這個(gè)控件稱為主要控件,而其他控件的選擇框的小方塊是空心的。如圖3.6(b)所示。圖3.6 單個(gè)控件和多個(gè)控件的選擇框(a)(b)3.1對(duì)話框的使用3. 控件的刪除、復(fù)制和布局 當(dāng)單個(gè)控件或多個(gè)控件被選取后,按方向鍵或用鼠標(biāo)拖動(dòng)控件的選擇框可移動(dòng)控件。若在鼠標(biāo)拖動(dòng)過程中還按住Ctrl鍵則復(fù)制控件。若按Del鍵可將選取的控件刪除。當(dāng)然還有其他一些編輯操作,但這些操作方法和一般的文檔編輯器基本相同,這里不再重復(fù)。 對(duì)于控件的布局,對(duì)話框編輯器中提供了控件布局工具欄,如圖3.7所示,它可以自動(dòng)地排列對(duì)話框內(nèi)的控件,并能改變控件的大小。 靠齊上邊 左右間隔相等 大小
14、相同靠齊左邊上下居中寬度相同 顯示標(biāo)尺 靠齊右邊 左右居中 高度相同測(cè)試對(duì)話框 靠齊下邊 上下間隔相等顯示網(wǎng)格圖3.7 控件布局工具欄 3.1對(duì)話框的使用 需要說明的是: (1) 隨著對(duì)話框編輯器的打開,Visual C+ 6.0開發(fā)環(huán)境的菜單欄還出現(xiàn)“布局”菜單,它的命令與布局工具相對(duì)應(yīng),而且大部分命令名后面還顯示出相應(yīng)的快捷鍵,由于它們都是中文的(漢化過),故這里不再列出。 (2) 大多數(shù)布置控件的命令使用前,都需要用戶選取多個(gè)控件,且“主要控件”起到了關(guān)鍵作用。例如用戶選取多個(gè)控件后,使用“大小相同”命令只改變其它控件的大小,并與“主 要控件”的尺寸一致。因此,在多個(gè)控件的布置過程中,常
15、需要重新設(shè)置“主要控件”。設(shè)置的方法是按住Ctrl或Shift鍵,然后用鼠標(biāo)單擊所要指定的控件即可。 (3) 為了便于用戶在對(duì)話框內(nèi)精確定位各個(gè)控件,系統(tǒng)還提供了網(wǎng)格、標(biāo)尺等輔助工具。在圖3.7的控件布局工具欄的最后兩個(gè)按鈕分別用來網(wǎng)格和標(biāo)尺的切換。一旦網(wǎng)格顯示,添加或移動(dòng)控件時(shí)都將自動(dòng)定位在網(wǎng)格線上。3.1對(duì)話框的使用4. 測(cè)試對(duì)話框 “布局”菜單下的“測(cè)試”命令或布局工具欄上的測(cè)試按鈕是用來模擬所編輯的對(duì)話框的運(yùn)行情況,幫助用戶檢驗(yàn)對(duì)話框是否符合用戶的設(shè)計(jì)要求以及控件功能是否有效等。 5. 操作示例 (1) 下面來向?qū)υ捒蛱砑尤齻€(gè)靜態(tài)文本控件(一個(gè)靜態(tài)文本控件就是一個(gè)文本標(biāo)簽): (2)
16、在控件工具欄上,單擊 按鈕,然后在對(duì)話框模板左上角單擊鼠標(biāo)左鍵不放,拖動(dòng) 鼠標(biāo)至滿意位置,釋放鼠標(biāo)鍵。這樣,第一個(gè)靜態(tài)文本控件添加到對(duì)話框中了。 (3) 單擊布局工具欄上的 按鈕,打開對(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 布局前的靜
17、態(tài)文本控件 圖3.9 布局后的靜態(tài)文本控件3.1.4 創(chuàng)建對(duì)話框類在對(duì)話框資源模板的空白區(qū)域(沒有其他元素或控件)內(nèi)雙擊鼠標(biāo)或按Ctrl+W快捷鍵,將彈出一個(gè)對(duì)話框,詢問是否為對(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è)置的,一般無需修改。從Base class框的內(nèi)容可以看出,用戶對(duì)話框類是從基類CDialog派生而來的。3.1對(duì)話框的使用 單擊OK按鈕,一個(gè)基于對(duì)話框資源模板的對(duì)話框類CFirstDlg就創(chuàng)
18、建好了。此時(shí),出現(xiàn)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ì)話
19、框3.1對(duì)話框的使用 需要說明的是,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 initializati
20、on herethis-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ù),用來設(shè)置窗口的文本內(nèi)容。對(duì)于對(duì)話框來說,它設(shè)置的是對(duì)話框標(biāo)題。3.1對(duì)話框的使用 3.1.6 在程序中調(diào)用對(duì)話框 在程序中調(diào)用對(duì)話框,一般是通過映射事件的消息(如命令消息、鼠標(biāo)消息、鍵盤消息等),在映射函數(shù)中進(jìn)行調(diào)用。這樣,相應(yīng)事件產(chǎn)生后,就
21、會(huì)調(diào)用其消息映射函數(shù),從而調(diào)用對(duì)話框的代碼初執(zhí)行。例如,下面的步驟用來實(shí)現(xiàn)在單文檔應(yīng)用程序 Ex_SDI的客戶區(qū)中單擊鼠標(biāo)左鍵,顯示前面添加的對(duì)話框。 (1) 按Ctrl+W鍵,彈出MFC ClassWizard對(duì)話框。 (2) 在Message Maps頁面中,從Class name列表中選擇CEx_SDIView,在IDs列表中選擇CEx_SDIView,然后在Messages框中找到并選中WM_LBUTTONDOWN消息。 (3) 單擊Add Function按鈕或雙擊WM_LBUTTONDOWN消息,則該消息的映射函數(shù)OnLButtonDown自動(dòng)添加到Member Functions
22、列表框中。 (4) 選中剛才添加的OnLButtonDown函數(shù),單擊Edit Code按鈕(或直接雙擊函數(shù)名),在打開的文檔窗口中的此成員函數(shù)中添加下列代碼: void CEx_SDIView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCFirstDlg dlg;dlg.DoModal();CView:OnLButtonDown(nFlags, point); 3.1對(duì)話框的使用 代碼中,DoModal是CDialog基類成員函數(shù)
23、,用來將對(duì)話框按模式方式來顯示。 (5) 在CEx_SDIView 類的實(shí)現(xiàn)文件Ex_SDIView.cpp的前面添加CFirstDlg類的包含語句,即: #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ì)話框和無模式對(duì)話框 上述通過DoModal成員函數(shù)來顯示的對(duì)話框稱為模式對(duì)話框,所謂“模式對(duì)
24、話框”是指當(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ì)話框中的選擇或輸入無效,對(duì)話框退出,程序恢復(fù)原有狀態(tài)。 事實(shí)上,對(duì)話框還可以用“無模式”方式來顯示,稱為無模式對(duì)話框,所謂“無模式對(duì)話框”是指當(dāng)對(duì)話框被彈出后,一直保留在屏幕上,用戶可繼續(xù)在對(duì)話框所在的應(yīng)用程序中進(jìn)行其它操作;當(dāng)需要使用對(duì)話框時(shí),只需象激活一般窗口一樣單擊對(duì)話框所在的區(qū)域即可激活。由于“
25、無模式”方式還要涉及到其它一些編程工作,限于篇幅,這里不作討論。3.2控件的創(chuàng)建和使用方法 3.2.1 控件的創(chuàng)建方法 控件的創(chuàng)建方式有以下兩種:一種是在對(duì)話框模板資源中用編輯器來指定控件,這就是說,將控件的父窗口指定為對(duì)話框,這樣做的好處是明顯的,因?yàn)楫?dāng)應(yīng)用程序啟動(dòng)該對(duì)話框時(shí),框架系統(tǒng)就會(huì)為對(duì)話框創(chuàng)建控件;而當(dāng)對(duì)話框消失時(shí),控件也隨之清除。另一種方式是將控件看作是任一窗口的子窗口,并通過調(diào)用相應(yīng)的Create函數(shù)來創(chuàng)建。 例Ex_Edit 使用編程方式來創(chuàng)建一個(gè)編輯框 (1) 啟動(dòng)Visual C+ 6.0,選擇“文件”“新建”菜單,在彈出的“新建”對(duì)話框的工程標(biāo)簽頁面中,選擇MFC App
26、Wizard(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)開始創(chuàng)建,并又回到了Visual C+ 6.0的主界面。若無特別說明,以后凡遇到“創(chuàng)建一個(gè)默認(rèn)的基于對(duì)話框應(yīng)用程序Ex_XXXX”就是指上述的步驟,本書作此約定。其中,Ex_XXXX為創(chuàng)建的應(yīng)用程序名。3.2控件的創(chuàng)建和使用方
27、法 (4) 將項(xiàng)目工作區(qū)切換到ClassView頁面,展開Ex_Edit所有的類結(jié)點(diǎn),右擊CEx_EditDlg類名,從快捷菜單中選擇Add Member Variable(添加成員變量),在出現(xiàn)的對(duì)話框中定義一個(gè)CEdit類對(duì)象m_wndEdit,通常以“m_”來作為變量的開頭,表示“成員”(member)的意思。如圖3.13所示,單擊確定按鈕。在MFC中,每一個(gè)類型的控件都用相應(yīng)的類來封裝。如編輯框控件,它的類是CEdit,通過該類對(duì)象來訪問其成員,從而實(shí)現(xiàn)編輯框的操作。圖3.13 添加成員變量3.2控件的創(chuàng)建和使用方法 (5) 在項(xiàng)目工作區(qū)窗口的ClassView頁面中,將CEx_Edi
28、tDlg結(jié)點(diǎn)展開,雙擊OnInitDialog函數(shù)名,在該函數(shù)中添加下列代碼(return true;語句之前添加): 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)建 CFont *font =
29、this-GetFont(); / 獲取對(duì)話框的字體 m_wndEdit.SetFont(font);/ 設(shè)置控件字體 return TRUE; / return TRUE unless you set the focus to a control 3.2控件的創(chuàng)建和使用方法 分析和說明: 前面曾說過,由于OnInitDialog函數(shù)在對(duì)話框初始化時(shí)被調(diào)用,因此將對(duì)話框中的一些初始化代碼都添加在此函數(shù)中。 由于Windows操作系統(tǒng)使用的是圖形界面,因此在MFC中,對(duì)于每種界面元素的幾何大小和位置常使用CPoint類(點(diǎn))、CSize類(大小)和CRect類(矩形)來描述(以后還會(huì)討論)。代碼
30、中,GetClientRect 是對(duì)話框基類CWnd的成員函數(shù),用來獲取其客戶區(qū)的位置和大小。對(duì)于對(duì)話框來說,其客戶區(qū)是指除標(biāo)題欄(如果有的話)和邊框之外的那部分區(qū)域。為了使創(chuàng)建的編輯框占用對(duì)話框整個(gè)客戶區(qū),且又不能覆蓋對(duì)話框右側(cè)的確定和取消按鈕,故將右邊的位置在原來的位置上減去100。 代碼中,CEdit類成員函數(shù)Create用來創(chuàng)建編輯框控件,該函數(shù)第一個(gè)參數(shù)用來指定指定控件的樣式(樣式),其中ES_MULTILINE(以ES_開頭的)是編輯框類封裝的預(yù)定義樣式,表示創(chuàng)建的編輯框可以輸入多行文本,WS_CHILD(子窗口)、WS_VISIBLE(可見)、WS_TABSTOP(可用Tab鍵選
31、擇)、WS_BORDER(帶有邊框)等都是CWnd類封裝的預(yù)定義窗口樣式,它們都可以直接引用,當(dāng)多個(gè)樣式指定時(shí),需要使用按位或運(yùn)算符“|”來連接。第二個(gè)參數(shù)用來指定它在父窗口中的位置和大小,第三個(gè)參數(shù)用來指定父窗口指針,最后一個(gè)參數(shù)是指定該控件的標(biāo)識(shí)值。3.2控件的創(chuàng)建和使用方法 由于編輯框是作為對(duì)話框的一個(gè)子窗口來創(chuàng)建的,因此WS_CHILD樣式是必不可少的,且還要使用WS_VISIBLE使控件在創(chuàng)建后顯示出來。 (6) 編譯并運(yùn)行,這樣就可以在創(chuàng)建的編輯框中輸入文本了,結(jié)果如圖3.14所示。圖3.14 Ex_Edit運(yùn)行結(jié)果3.2控件的創(chuàng)建和使用方法 3.2.2 控件的消息及消息映射1.
32、控件的消息 當(dāng)控件的狀態(tài)發(fā)生改變時(shí),控件就會(huì)向其父窗口發(fā)送消息,這個(gè)消息稱為通知消息。對(duì)于一般控件來說,其通知消息通常是一條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è)或多個(gè)按鈕控件的映射 (1) 創(chuàng)建一個(gè)
33、默認(rèn)的基于對(duì)話框應(yīng)用程序Ex_Btns。 (2) 在打開的對(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,打開MFC ClassWizard對(duì)話框,查看“Class name”列表中是否選擇了CEx_BtnsDlg,在IDs列表中選擇 IDC_BUTTON1
34、,這是添加第一個(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)建和使用方法 需要說明的是: 不同資源對(duì)象(控件、菜單命令等)所產(chǎn)生的消息是不相同的。例如,按鈕控件IDC_BUTTON1的消息有兩個(gè):BN_CLICKED和BN_DOUBLE
35、CLICKED,分別表示當(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)),開發(fā)環(huán)境的文檔窗口中將自動(dòng)打開該函數(shù)所在的源代碼文件,并定位到該函數(shù)的實(shí)現(xiàn)代碼處。在此成員函數(shù)中 添加下列代碼: void CEx_BtnsDlg:
36、OnButton1() MessageBox(你按下了Button1按鈕!); 3.2控件的創(chuàng)建和使用方法 (7) 編譯并運(yùn)行,當(dāng)單擊Button1按鈕時(shí),就會(huì)執(zhí)行OnButton1函數(shù),彈出一個(gè)消息對(duì)話框,顯示“你按下了Button1按鈕”。這就是按鈕BN_CLICKED消息的映射過程,其他控件的消息也可以類似映射。 3. 映射控件通用消息 上述過程是映射一個(gè)控件的某一個(gè)消息,事實(shí)上也可通過WM_COMMAND消息的映射來處理一個(gè)或多個(gè)控件的通用消息,如下面的步驟: (1) 打開MFC ClassWizard對(duì)話框,在“Class name”列表中是否選擇了CEx_BtnsDlg,在IDs列
37、表中選擇CEx_BtnsDlg,在Messages框中找到并雙擊OnCommand,這樣OnCommand消息函數(shù)就添加好了,如圖3.17所示。由于OnCommand函數(shù)是一個(gè)用來處理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ù)中添加下列代碼: BOOL CEx_BtnsDlg:OnCom
38、mand(WPARAM wParam, LPARAM lParam) WORD nCode = HIWORD(wParam);/ 控件的通知消息WORD nID= LOWORD(wParam);/ 控件的ID值if (nID = IDC_BUTTON1)&(nCode = BN_CLICKED) MessageBox(這是在OnCommand處理Button1的結(jié)果!);if (nID = IDC_BUTTON2)&(nCode = BN_CLICKED) MessageBox(這是在OnCommand處理Button2的結(jié)果!);if (nID = IDC_BUTTON3)&(nCode =
39、 BN_CLICKED) MessageBox(這是在OnCommand處理Button3的結(jié)果!);return CDialog:OnCommand(wParam, lParam); 3.2控件的創(chuàng)建和使用方法 (3) 編譯運(yùn)行并測(cè)試。 需要說明的是:由于Button1按鈕的BN_CLICKED消息處理同時(shí)存在兩種函數(shù),即OnButton1和OnCommand,因此若單擊Button1按鈕,系統(tǒng)會(huì)先執(zhí)行哪一個(gè)函數(shù)呢?測(cè)試的結(jié)果表明,系統(tǒng)先執(zhí)行OnCommand函數(shù)代碼,然后執(zhí)行OnButton1函數(shù)代碼。之所 以還能執(zhí)行OnButton1函數(shù)代碼,是因?yàn)镺nCommand函數(shù)的最后一句代碼“
40、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) 例Ex_DDX 控件的DDX和DDV 1. 控件及控件變量的添加 (1) 創(chuàng)建一個(gè)默認(rèn)的基于對(duì)話框應(yīng)用程序Ex_DDX。 (2) 在
41、打開的對(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,打開MFC ClassWizard對(duì)話框,并切換到Member Variables頁面,查看“Class name”列表中是否選擇了CEx_DDXDlg,此時(shí)可以在Control
42、 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”頁面3.2控件的創(chuàng)建和使用方法 圖3.20 為按鈕控件添加控件變量 圖3.21 為編輯框控件添加控件變量3.2控件的創(chuàng)建和使用方法 (6) 在Member variable name框中填好與控件相關(guān)聯(lián)的成員變量m_RelBtn,單擊OK按鈕,又回到M
43、FC ClassWizard對(duì)話框的Member Variables頁面中,在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,在Variable type(變量值類型)中選擇該變量的數(shù)據(jù)類型為CString(字符串類),結(jié)果如圖3.21所示。 (8) 單擊OK按鈕,又回到MFC
44、 ClassWizard對(duì)話框的Member Variables頁面。從圖3.20和3.21的不同可以看出: 對(duì)于大多數(shù)控件而言,Category框內(nèi)可選擇Value或Control兩種類型。Control所對(duì)應(yīng)的變量類型就是MFC為該控件封裝的控件類,Value所對(duì)應(yīng)的是數(shù)值類型。但按鈕控件變量沒有Value類型。 不同的控件所提供的關(guān)聯(lián)的數(shù)值類型各不相同。例如,對(duì)于編輯框來說,Variables type中的數(shù)值類型可以有CString(字符串類)、int、UINT、long、DWORD、float、double、BYTE、short、BOOL等。3.2控件的創(chuàng)建和使用方法 但要注意:DD
45、V/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頁面下方還要求用戶輸入變量的范圍,這就是控件的數(shù)據(jù)校驗(yàn)設(shè)置。 在Control IDs列表中,選定編輯框控件標(biāo)識(shí)符IDC_EDIT1,此時(shí)就會(huì)下方位置處出現(xiàn)Maximum Characters(最大字符個(gè)數(shù))框,用來設(shè)定該控件變量允許的最大字符個(gè)數(shù)。輸入20,結(jié)
46、果如圖3.22所示,單擊確定按鈕。圖3.22 編輯框控件值變量的DDV設(shè)置 3.2控件的創(chuàng)建和使用方法 需要說明的是,若控件值變量的數(shù)據(jù)類型是整型或浮點(diǎn)型,則DDV框就變成設(shè)置最大和最小的兩個(gè)數(shù)值框了。 2. 理解DDX/DDV 打開CEx_DDXDlg類源文件,可以發(fā)現(xiàn)MFC ClassWizard對(duì)上述操作作了以下三方面的修改: (1) 在Ex_DDXDlg.h文件中,添加了控件變量的聲明,代碼如下面的加粗斜體部分: / Dialog Data /AFX_DATA(CEx_DDXDlg) enum IDD = IDD_EX_DDX_DIALOG ; / 用枚舉定義一個(gè)符號(hào)常量IDD,使其值
47、等于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, pParent) /AFX_DATA_INIT(CEx_DDXDlg)m_strEdit = _T();/AFX_DATA_INIT/ Note that LoadIc
48、on does not require a subsequent DestroyIcon in Win32 在Ex_DDXDlg.cpp文件中的DoDataExchange函數(shù)體內(nèi),添加了控件的DDX/DDV代碼(加粗斜體部分),它們都是一些以DDV_或DDX_開頭的函數(shù)調(diào)用。 void CEx_DDXDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CEx_DDXDlg)DDX_Control(pDX, IDC_BUTTON1, m_RelBtn);DDX_Text(pDX, ID
49、C_EDIT1, m_strEdit);DDV_MaxChars(pDX, m_strEdit, 20);/AFX_DATA_MAP 3.2控件的創(chuàng)建和使用方法 需要說明的是,上述代碼中以“/AFX_DATA”或“/AFX_DATA_XXXX”開頭,而以“/AFX_DATA”或“/AFX_DATA_XXXX”結(jié)尾的標(biāo)記是ClassWizard定義的專門用作DDX/DDV的標(biāo)記,表示該部分的代碼是由ClassWizard自動(dòng)管理,一般不需要更改。 3. 使用UpdateData 當(dāng)為一個(gè)控件定義一個(gè)關(guān)聯(lián)的數(shù)據(jù)變量后,即對(duì)控件值變量來說,就可使用CWnd類的成員函數(shù)UpdateData使數(shù)值在控件
50、顯示和控件值變量之間進(jìn)行切換。 UpdateData函數(shù)只有一個(gè)為TRUE或FALSE的參數(shù)。當(dāng)調(diào)用UpdateData(FALSE)時(shí),數(shù)據(jù)由控件相關(guān)聯(lián)的成員變量向控件傳輸,即將控件值變量的值在控件中顯示出來;當(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(TRUE)或不帶參數(shù)的UpdateData。例如: (1) 按快捷鍵Ctrl+W,打開MFC ClassWizard對(duì)話框,為按鈕IDC_BUTTON1在CEx_DDXDl
51、g類添加BN_CLICKED消息的映射函數(shù)OnButton1。3.2控件的創(chuàng)建和使用方法 在映射函數(shù)OnButton1中添加下面代碼: void CEx_DDXDlg:OnButton1() UpdateData();/ 默認(rèn)參數(shù)值是TRUEm_strEdit.TrimLeft();m_strEdit.TrimRight();if ( m_strEdit.IsEmpty() ) m_RelBtn.SetWindowText( Button1 );else m_RelBtn.SetWindowText( m_strEdit ); 代碼中,由于m_strEdit 是CString類對(duì)象,因而可以調(diào)
52、用CString類的公有成員函數(shù)。其中,TrimLeft和TrimRight函數(shù)不帶參數(shù)時(shí)分別用來去除字符串最左邊或最邊一些空格符、換行符、Tab字符等白字符,IsEmpty是用來判斷字符串是否為空。3.2控件的創(chuàng)建和使用方法 這樣,當(dāng)編輯框內(nèi)容有除白字符之外的實(shí)際字符的字符串時(shí),SetWindowText用將其內(nèi)容設(shè)定為按鈕控件的標(biāo)題。否則,按鈕控件的標(biāo)題為“Button1”。 (3) 編譯并運(yùn)行。當(dāng)在編輯框中輸入“Hello”后,單擊Button1按鈕,按鈕的名稱就變成了編輯框控件中的內(nèi)容“Hello”,其結(jié)果如圖3.23所示。圖3.23 Ex_DDX運(yùn)行結(jié)果3.3常用控件 根據(jù)控件的特性
53、和功能,一般可將其分為三類:Windows公共控件、ActiveX控件以及MFC新增的一些控件等。表3.3列出了本書所用到的常用控件類。 表3.3 常用控件類控件名稱MFC類功能描述靜態(tài)控件CStatic用來顯示一些幾乎固定不變的文字或圖形按鈕CButton用來產(chǎn)生某些命令或改變某些選項(xiàng),包括單選按鈕、復(fù)選框和組框編輯框CEdit用于完成文本和數(shù)字的輸入和編輯列表框CListBox顯示一個(gè)列表,讓用戶從中選取一個(gè)或多個(gè)項(xiàng)組合框CComboBox是一個(gè)列表框和編輯框組合的控件滾動(dòng)條CScrollBar通過滾動(dòng)塊在滾動(dòng)條上的移動(dòng)和滾動(dòng)按鈕來改變某些量進(jìn)展條CProgressCtrl用來表示一個(gè)操作
54、的進(jìn)度滑動(dòng)條CSliderCtrl通過滑動(dòng)塊的移動(dòng)來改變某些量,并帶有刻度指示旋轉(zhuǎn)按鈕控件CSpinButtonCtrl帶有一對(duì)反向箭頭的按鈕,單擊這對(duì)按鈕可增加或減少某個(gè)值日期時(shí)間控件CDateTimeCtrl用于選擇指定的日期和時(shí)間圖像列表CImageList一個(gè)具有相同大小的圖標(biāo)或位圖的集合列表控件CListCtrl可以用 “大圖標(biāo)”、“小圖標(biāo)”、“列表”或“報(bào)表”等四種不同的方式來顯示一組信息樹控件CTreeCtrl用樹結(jié)構(gòu)的形式顯示一組信息,并能反映這些信息的層次關(guān)系3.3常用控件 3.3.1 靜態(tài)控件和按鈕靜態(tài)控件和按鈕是Windows最基本的控件之一。 1. 靜態(tài)控件 一個(gè)靜態(tài)控
55、件是用來顯示一個(gè)字符串、框、矩形、圖標(biāo)、位圖或增強(qiáng)的圖元文件。它可以被用來作為標(biāo)簽、框或用來分隔其它的控件。一個(gè)靜態(tài)控件一般不接收用戶輸入,也不產(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è)置其樣式來改變
56、控件的外觀以及圖像在控件的位置等。例如,在任一個(gè)對(duì)話框中添加一個(gè)靜態(tài)圖片控件,在其常規(guī)屬性對(duì)話框中,將其“類型”選擇為“圖標(biāo)(Icon)”,再將其“圖像”選擇為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) 在打開的對(duì)話框資源模板中,刪除“TODO: 在這里設(shè)置對(duì)話控制。”靜態(tài)文本控件,將確定和取消按鈕向?qū)υ捒蜃筮呉苿?dòng)一段位置,然后將鼠標(biāo)移至對(duì)話框資源模板右下角的實(shí)心藍(lán)色方塊處,拖動(dòng)鼠標(biāo),將對(duì)話框資源模板的大小縮小一些。3.3常
57、用控件 (3)在對(duì)話框資源模板中的靠左中間位置添加一個(gè)靜態(tài)圖片控件,右擊該控件,從彈出的快捷菜單中選擇“屬性”,彈出其屬性對(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所示。水平蝕刻線圖3.25 水平蝕刻線凡以后在對(duì)話框中有這樣的水平蝕刻線或垂直蝕刻線,都是指的這種制作方法,書中不再講述其制作過程。本書作此約定。3.3常用控件2. 按鈕
58、在Windows中所用的按鈕是用來實(shí)現(xiàn)一種開與關(guān)的輸入,常見的按鈕有3種類型:按鍵按鈕、單選按鈕、復(fù)選框按鈕,如圖3.26所示。圖3.26 按鈕的不同類型 (1)按鍵按鈕。按鍵按鈕通常可以立即產(chǎn)生某個(gè)動(dòng)作,執(zhí)行某個(gè)命令,因此也常被稱為命令按鈕。按鍵按鈕有兩種樣式:標(biāo)準(zhǔn)按鍵按鈕和默認(rèn)(缺?。┌存I按鈕。從外觀上來說,默認(rèn)按鍵按鈕是在標(biāo)準(zhǔn)按鍵按鈕的周圍加上一個(gè)黑色邊框(參見圖3.26),這個(gè)黑色邊框表示該按鈕已接受到鍵盤的輸入焦點(diǎn),這樣一來,用戶只須按回車鍵就能按下該按鈕。一般來說,只把最常用的按鍵按鈕設(shè)定為默認(rèn)按鍵按鈕,具體設(shè)定的方法是在按鍵按鈕屬性對(duì)話框的樣式(Style)頁面中選中“缺省按鈕(
59、Default button)”項(xiàng)。3.3常用控件 (2)單選按鈕。單選按鈕的外形是在文本前有一個(gè)圓圈,當(dāng)它被選中時(shí),單選按鈕中就標(biāo)上一個(gè)黑點(diǎn),它可分為一般和自動(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ì)話框的樣式(S
60、tyle)頁面中選中“三次狀態(tài)(Tri-state)”項(xiàng)。 3. 按鈕的消息 在按鈕映射的消息中,常見的只有兩個(gè):BN_CLICKED(單擊按鈕)和BN_DOUBLE CLICKED(雙擊按鈕)。 4. 按鈕選中操作 最常用的按鈕操作是設(shè)置或獲取一個(gè)按鈕或多個(gè)按鈕的選中狀態(tài)。CButton類的成員函數(shù)SetCheck和GetCheck分別用來設(shè)置或獲取指定按鈕的選中狀態(tài),其原型如下: void SetCheck( int nCheck ); int GetCheck( ) const;3.3常用控件 其中,nCheck和GetCheck函數(shù)返回的值可以是:0表示不選中,1表示選中,2表示不確定
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度競(jìng)業(yè)禁止機(jī)械租賃與配件供應(yīng)合同3篇
- 2025年度農(nóng)村自建房屋不含材料包工合同書
- 二零二五年度全新碼頭租賃合同及船舶維修與保養(yǎng)服務(wù)協(xié)議3篇
- 二零二五年度公益性崗位勞動(dòng)合同(老年人日間照料中心)3篇
- 2025年度窗簾店窗簾產(chǎn)品市場(chǎng)調(diào)研合同3篇
- 二零二五年度能源公司合并節(jié)能減排合同3篇
- 2025年度農(nóng)村土地征收與城鄉(xiāng)融合發(fā)展合同2篇
- 二零二五年度環(huán)保型衛(wèi)浴設(shè)施采購專項(xiàng)合同3篇
- 2025年度年度農(nóng)機(jī)租賃與農(nóng)業(yè)廢棄物資源化利用及環(huán)境治理合同3篇
- 2024年河北省婦幼保健中心高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- 2023-2024學(xué)年九年級(jí)上學(xué)期期末試卷及答案
- 2023年江蘇省普通高中信息技術(shù)學(xué)業(yè)水平考試題庫試題
- (浙教2024版)科學(xué)七年級(jí)上冊(cè)全冊(cè)知識(shí)點(diǎn)(新教材)
- 善讀無字之書(2023年廣東中考語文試卷議論文閱讀題及答案)
- 《心系國防 強(qiáng)國有我》 課件-2024-2025學(xué)年高一上學(xué)期開學(xué)第一課國防教育主題班會(huì)
- 港區(qū)船塢工程施工組織設(shè)計(jì)
- 2024年北京平谷區(qū)初三九年級(jí)上學(xué)期期末數(shù)學(xué)試題
- 2024年新人教版道德與法治七年級(jí)上冊(cè)全冊(cè)教案(新版教材)
- 初中物理期末復(fù)習(xí)+專題5+綜合能力題+課件++人教版物理九年級(jí)全一冊(cè)
- 2024年國開電大 統(tǒng)計(jì)學(xué)原理 形成性考核冊(cè)答案
- 幼兒園大班語言課件:不怕冷的大衣
評(píng)論
0/150
提交評(píng)論