版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、第三章對話框和常用控件3.1 對話框的使用3.2 控件的創(chuàng)建和使用方法 3.3 常用控件 3.4 通用對話框和消息對話框 3.5 綜合應用3.1對話框的使用 在Visual C+ 6.0應用程序中,使用一個對話框通常有兩種情形:一是直接創(chuàng)建一個對話框應用程序,二是在一個應用程序中進行調(diào)用。為不失一般性,這里介紹第二種對話框使用情況的一般過程,即依次如下: (1) 添加對話框資源; (2) 設置對話框的屬性; (3) 添加和布局控件; (4) 創(chuàng)建對話框類; (5) 添加對話框代碼; (6) 在程序中調(diào)用對話框。 顯然,對于第一種對話框使用情況來說,其過程通常是從(2)到(5)。 3.1.1 添
2、加對話框資源 在對話框資源添加之前,先來創(chuàng)建一個默認的單文檔應用程序Ex_SDI: (1)在“D:Visual C+應用”文件夾中,創(chuàng)建本章應用程序工作文件夾“第3章”。 (2)啟動Visual C+ 6.0,選擇“文件”“新建”菜單,在彈出的“新建”對話框的工程標簽頁面中,選擇MFC AppWizard(exe)的項目類型。單擊位置框右側(cè)的按鈕,在彈出的對話框中,將該應用程序的文件夾定位在“D:Visual C+應用第3章”,并在工程編輯框中輸入單文檔應用程序名Ex_SDI。3.1對話框的使用 (3)單擊確定按鈕,在出現(xiàn)的“步驟1”對話框中,選擇“單個文檔”應用程序類型。 (4)單擊完成按鈕
3、出現(xiàn)一個信息對話框,顯示出用戶在前面幾個步驟中作出的選擇內(nèi)容,單擊確定按鈕系統(tǒng)開始創(chuàng)建,并又回到了Visual C+ 6.0的主界面。若無特別說明,以后凡遇到“創(chuàng)建一個默認的單文檔應用程序Ex_XXXX”就是指上述的步驟,本書作此約定。其中,Ex_XXXX為創(chuàng)建的應用程序名。 這樣就可在單文檔應用程序Ex_SDI中添加一個對話框資源,通常按下列步驟進行: (1)選擇“插入”“資源”菜單,或按快捷鍵Ctrl+R打開“插入資源”對話框,在對話框中可以看到資源列表中存在Dialog項,若單擊Dialog項左邊的“+”號,將展開對話框資源的不同類型選項,如圖3.1所示,表3.1列出各種類型的對話框資源
4、的不同用途。 圖3.1 “插入資源”對話框 其中,新建按鈕是用來創(chuàng)建一個由“資源類型”列表中指定類型的新資源,自定義按鈕是用來創(chuàng)建“資源類型”列表中沒有的新類型的資源,引入按鈕是用于將外部已有的位圖、圖標、光標或其他定制的資源添加到當前應用程序中。3.1對話框的使用表3.1 對話框資源類型類 型說 明IDD_DIALOGBAR對話條,往往和工具條停放一起IDD_FORMVIEW一個表單(一種樣式的對話框),用于表單視圖類的資源模板IDD_OLE_PROPPAGE_LARGE一個大的OLE屬性頁IDD_OLE_PROPPAGE_SMALL一個小的OLE屬性頁IDD_ PROPPAGE_LARGE
5、一個大屬性頁,用于屬性對話框IDD_ PROPPAGE_MEDIUM一個中等大小的屬性頁,用于屬性對話框IDD_ PROPPAGE_SMALL一個小的屬性頁,用于屬性對話框3.1對話框的使用 (3)對展開的不同類型的對話框資源不作任何選擇,選中“Dialog”,單擊新建按鈕,系統(tǒng)就會自動為當前應用程序添加了一個對話框資源,并出現(xiàn)如圖3.2所示的界面。 對話框模板控件工具欄布局工具欄默認標識符圖3.2 添加對話框資源后的開發(fā)環(huán)境3.1對話框的使用 系統(tǒng)為對話框資源自動賦給它一個默認的標識符名稱(第一次為IDD_DIALOG1,以后依次為IDD_DIALOG2、IDD_DIALOG3、.)。 使用
6、了通用的對話框模板創(chuàng)建新的對話框資源。對話框的默認標題為“對話” (Dialog),有確定和取消兩個按鈕,這兩個按鈕的標識符分別為IDOK和IDCANCEL。 自動出現(xiàn)“對話框資源編輯器”窗口,在這里可以通過“控件工具欄”和“布局工具欄”向?qū)υ捒蛱砑雍筒季挚丶⒖稍O置對話框的屬性。 需要說明的是,第一次使用Visual C+6.0的對話框編輯器時,“控件工具欄”和“布局工具欄”可能是浮動,可以將其拖放到指定位置(參看圖3.2),以便讓開發(fā)環(huán)境更易于操作。 3.1.2 設置對話框?qū)傩?在對話框模板的空白處右擊鼠標,從彈出的快捷菜單中選擇“屬性”菜單項,出現(xiàn)如圖3.3所示的對話框?qū)傩源翱凇?可以
7、看出,對話框具有這幾類屬性:常規(guī)(General)、樣式(Styles)、更多樣式(More Styles)、擴展樣式(Extended Styles)、更多擴展More Extended Styles(更多擴展樣式)等部分,這里僅介紹最常用的常規(guī)(General)屬性,如表4.2所示。3.1對話框的使用圖3.3 對話框?qū)傩源翱诒?.2 對話框的常規(guī)(General)屬性項 目說 明ID框修改或選擇對話框的標識符名稱標題框輸入對話框的標題名稱,中英文均可,如“我的對話框”字體按鈕單擊此按鈕可選擇字體的種類(如宋體)及尺寸(如9號)位置X/位置Y對話框左上角在父窗口中的X、Y坐標,都為0時表示居
8、中菜單框默認值為無,當對話框需要菜單時輸入或選擇指定的菜單資源類名稱框默認值為無,它提供C/C+語言編程時所需要的對話框類名,對MFC類庫的資源文件來說,該項不被激活。3.1對話框的使用圖3.3中,有一個 圖標,當單擊此圖標后,圖標變成,表示該對話框?qū)⒁恢憋@示直到用戶關閉它。在 狀態(tài)下,當該對話框一旦失去活動狀態(tài)后就會自動消失! 將添加的對話框的屬性進行以下3點修改,結(jié)果如圖3.4所示: 在ID框中,將對話框標識符IDD_DIALOG1改成IDD_DIALOG_FIRST; 在標題框中,將對話框標題“對話”改為“我的第一個對話框”; 單擊字體按鈕,通過彈出的字體對話框?qū)υ捒騼?nèi)的文本設置成“宋
9、體,9” ,以使自己的對話框和Windows中的對話框保持外觀上的一致(這是界面設計的“一致性”原則)。3.1對話框的使用圖3.4 對話框?qū)傩孕薷暮蟮慕缑?.1對話框的使用 3.1.3 添加和布局控件 一旦對話框資源被打開或被創(chuàng)建,就會出現(xiàn)對話框編輯器,通過它可以在對話框中進行控件的添加和布局等操作。1. 控件的添加對話框編輯器一旦打開,“控件”工具欄一般都會隨之出現(xiàn)。若不出現(xiàn),則可在開發(fā)環(huán)境的 工具欄區(qū)的空白處右擊鼠標,從彈出的快捷菜單中選擇“控件”。 利用“控件”工具欄中的各個按鈕可以順利完成控件的添加。圖3.5說明了各個按鈕所對應的控件類型。控件的選擇靜態(tài)文本組框復選框組合框水平滾動條旋
10、轉(zhuǎn)按鈕滑動條列表視圖標簽復合編輯月歷用戶定制控件靜態(tài)圖片編輯框按鈕單選框列表框垂直滾動條進展條熱鍵樹形視圖動畫日期選擇IP地址擴展組合框圖3.5 控件工具欄和各按鈕含義3.1對話框的使用 向?qū)υ捒蛱砑右粋€控件的方法有下列幾種: 在控件工具欄中單擊某控件,此時的鼠標箭頭在對話框內(nèi)變成“十”字形狀;在對話框指定位置單擊鼠標左鍵,則此控件被添加到對話框的相應位置,再拖動剛添加控件的選擇框可改變其大小和位置。 在控件工具欄中單擊某控件,此時的鼠標箭頭對話框內(nèi)變成“十”字形狀;在指定位置處單擊鼠標左鍵不放,拖動鼠標至滿意位置,釋放鼠標鍵。 用鼠標左鍵點中控件工具欄中的某控件,并按住鼠標左鍵不放;在移動鼠
11、標到對話框的指定位置的過程中,用戶會看到一個虛線框,下面帶有該控件的標記;釋放鼠標左鍵,新添加的控件立即出現(xiàn)在對話框中。 2. 控件的選取 控件的刪除、復制和布局操作一般都要先選取控件,若選取單個控件,則可以下列方法: 用鼠標直接選取。首先保證在控件工具欄中的選擇按鈕()是被選中的,然后移動鼠標指針至指定的控件上,單擊鼠標左鍵即可。 用助記符來選取。如果控件的標題中帶有下劃線的字符,這個字符就是助記符,選擇時直接按下該助記符鍵或“Alt+助記符”組合鍵即可。 3.1對話框的使用 用Tab鍵選取。在對話框編輯器中,系統(tǒng)會根據(jù)控件的添加次序自動設置相應的Tab鍵次序。利用Tab鍵,用戶可在對話框內(nèi)
12、的控件中進行選擇。每按一次Tab鍵依次 選取對話框中的下一個控件,若按住Shift鍵,再單擊Tab鍵則選取上一個控件。 對于多個控件的選取,可采用下列方法: 先在對話框內(nèi)按住鼠標左鍵不放,拖出一個大的虛框,然后釋放鼠標,則被該虛框所包圍的控件都將被選取。 先按住Shift鍵不放,然后用鼠標選取控件,直到所需要的多個控件選取之后再釋放Shift鍵。若在選取時,對已選取的控件再選取一下,則取消該控件選取。 需要注意的是: (1) 一旦單個控件被選取后,其四周由選擇框包圍著,選擇框上還有幾個(通常是八個)藍色實心小方塊,拖動它可改變控件的大小,如圖3.6(a)所示。 (2)多個控件被選取后,其中只有
13、一個控件的選擇框有幾個藍色實心小方塊,這個控件稱為主要控件,而其他控件的選擇框的小方塊是空心的。如圖3.6(b)所示。圖3.6 單個控件和多個控件的選擇框(a)(b)3.1對話框的使用3. 控件的刪除、復制和布局 當單個控件或多個控件被選取后,按方向鍵或用鼠標拖動控件的選擇框可移動控件。若在鼠標拖動過程中還按住Ctrl鍵則復制控件。若按Del鍵可將選取的控件刪除。當然還有其他一些編輯操作,但這些操作方法和一般的文檔編輯器基本相同,這里不再重復。 對于控件的布局,對話框編輯器中提供了控件布局工具欄,如圖3.7所示,它可以自動地排列對話框內(nèi)的控件,并能改變控件的大小。 靠齊上邊 左右間隔相等 大小
14、相同靠齊左邊上下居中寬度相同 顯示標尺 靠齊右邊 左右居中 高度相同測試對話框 靠齊下邊 上下間隔相等顯示網(wǎng)格圖3.7 控件布局工具欄 3.1對話框的使用 需要說明的是: (1) 隨著對話框編輯器的打開,Visual C+ 6.0開發(fā)環(huán)境的菜單欄還出現(xiàn)“布局”菜單,它的命令與布局工具相對應,而且大部分命令名后面還顯示出相應的快捷鍵,由于它們都是中文的(漢化過),故這里不再列出。 (2) 大多數(shù)布置控件的命令使用前,都需要用戶選取多個控件,且“主要控件”起到了關鍵作用。例如用戶選取多個控件后,使用“大小相同”命令只改變其它控件的大小,并與“主 要控件”的尺寸一致。因此,在多個控件的布置過程中,常
15、需要重新設置“主要控件”。設置的方法是按住Ctrl或Shift鍵,然后用鼠標單擊所要指定的控件即可。 (3) 為了便于用戶在對話框內(nèi)精確定位各個控件,系統(tǒng)還提供了網(wǎng)格、標尺等輔助工具。在圖3.7的控件布局工具欄的最后兩個按鈕分別用來網(wǎng)格和標尺的切換。一旦網(wǎng)格顯示,添加或移動控件時都將自動定位在網(wǎng)格線上。3.1對話框的使用4. 測試對話框 “布局”菜單下的“測試”命令或布局工具欄上的測試按鈕是用來模擬所編輯的對話框的運行情況,幫助用戶檢驗對話框是否符合用戶的設計要求以及控件功能是否有效等。 5. 操作示例 (1) 下面來向?qū)υ捒蛱砑尤齻€靜態(tài)文本控件(一個靜態(tài)文本控件就是一個文本標簽): (2)
16、在控件工具欄上,單擊 按鈕,然后在對話框模板左上角單擊鼠標左鍵不放,拖動 鼠標至滿意位置,釋放鼠標鍵。這樣,第一個靜態(tài)文本控件添加到對話框中了。 (3) 單擊布局工具欄上的 按鈕,打開對話框模板的網(wǎng)格。 (4) 在控件工具欄上,將 按鈕拖放到對話框模板中的左中部。這樣,第二個靜態(tài)文本控件添加到對話框中了。同樣的操作,將第三個靜態(tài)文本控件拖放到對話框模板中的左下部。 (5) 按住Shift鍵不放,依次單擊剛才添加的三個靜態(tài)文本控件,結(jié)果如圖3.8所示。在布局工具欄上,依次單擊“大小相同”按鈕 、“靠左對齊”按鈕 、“上下間隔相等”按鈕 ,結(jié)果如圖3.9所示。3.1對話框的使用圖3.8 布局前的靜
17、態(tài)文本控件 圖3.9 布局后的靜態(tài)文本控件3.1.4 創(chuàng)建對話框類在對話框資源模板的空白區(qū)域(沒有其他元素或控件)內(nèi)雙擊鼠標或按Ctrl+W快捷鍵,將彈出一個對話框,詢問是否為對話框資源創(chuàng)建一個新類。 單擊OK按鈕,將彈出如圖3.10所示的New Class(新類)對話框。在Name(名稱)框中輸入類名CFirstDlg。Base class(基類)和Dialog ID(對話框標識符)內(nèi)容是由系統(tǒng)自動設置的,一般無需修改。從Base class框的內(nèi)容可以看出,用戶對話框類是從基類CDialog派生而來的。3.1對話框的使用 單擊OK按鈕,一個基于對話框資源模板的對話框類CFirstDlg就創(chuàng)
18、建好了。此時,出現(xiàn)MFC ClassWizard(MFC類向?qū)?對話框。圖3.10 “New Class”對話框3.1對話框的使用 3.1.5 添加對話框代碼 在MFC ClassWizard對話框,查看“Class name”列表中是否選擇了CFirstDlg,若不是,則在IDs列表中選擇CFirstDlg。在Messages框中找到并選定WM_INITDIALOG消息,如圖3.11。單擊Add Function按鈕或雙擊WM_INITDIALOG消息,MFC ClassWizard自動為CFirstDlg類添加OnInitDialog函數(shù)。圖3.11 “MFC ClassWizard”對話
19、框3.1對話框的使用 需要說明的是,WM_INITDIALOG是在對話框顯示之前向父窗口發(fā)送的消息,由于建立了此消息和OnInitDialog函數(shù)的關聯(lián),系統(tǒng)在對話框顯示之前就會調(diào)用此函數(shù),因此常將對話框一些初始化代碼添加到這個函數(shù)中。 在Member functions列表框中選擇剛添加的OnInitDialog函數(shù),單擊Edit Code按鈕(或直接在函數(shù)名雙擊鼠標),將自動出現(xiàn)該函數(shù)代碼編輯窗口,在此函數(shù)中添加下列代碼: BOOL CFirstDlg:OnInitDialog() CDialog:OnInitDialog(); / TODO: Add extra initializati
20、on herethis-SetWindowText(修改標題);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE 代碼中,SetWindowText是CWnd的一個成員函數(shù),用來設置窗口的文本內(nèi)容。對于對話框來說,它設置的是對話框標題。3.1對話框的使用 3.1.6 在程序中調(diào)用對話框 在程序中調(diào)用對話框,一般是通過映射事件的消息(如命令消息、鼠標消息、鍵盤消息等),在映射函數(shù)中進行調(diào)用。這樣,相應事件產(chǎn)生后,就
21、會調(diào)用其消息映射函數(shù),從而調(diào)用對話框的代碼初執(zhí)行。例如,下面的步驟用來實現(xiàn)在單文檔應用程序 Ex_SDI的客戶區(qū)中單擊鼠標左鍵,顯示前面添加的對話框。 (1) 按Ctrl+W鍵,彈出MFC ClassWizard對話框。 (2) 在Message Maps頁面中,從Class name列表中選擇CEx_SDIView,在IDs列表中選擇CEx_SDIView,然后在Messages框中找到并選中WM_LBUTTONDOWN消息。 (3) 單擊Add Function按鈕或雙擊WM_LBUTTONDOWN消息,則該消息的映射函數(shù)OnLButtonDown自動添加到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對話框的使用 代碼中,DoModal是CDialog基類成員函數(shù)
23、,用來將對話框按模式方式來顯示。 (5) 在CEx_SDIView 類的實現(xiàn)文件Ex_SDIView.cpp的前面添加CFirstDlg類的包含語句,即: #include Ex_SDIDoc.h #include Ex_SDIView.h #include FirstDlg.h (6) 編譯并運行。在應用程序文檔窗口的客戶區(qū)中單擊鼠標,就會出現(xiàn)如圖3.12的對話框,這個對話框就是剛才添加的對話框,對話框的標題是程序代碼所指定的結(jié)果。圖3.12 Ex_SDI運行的結(jié)果3.1對話框的使用3.1.7 模式對話框和無模式對話框 上述通過DoModal成員函數(shù)來顯示的對話框稱為模式對話框,所謂“模式對
24、話框”是指當對話框被彈出,用戶必須在對話框中作出相應的操作,在退出對話框之前,對話框所在應用程序的其它操作不能繼續(xù)執(zhí)行。 模式對話框的應用范圍較廣,一般情況下,模式對話框會有確定(OK)和取消(Cancel)按鈕。單出確定按鈕,系統(tǒng)認定用戶在對話框中的選擇或輸入有效,對話框退出;單擊取消按鈕,對話框中的選擇或輸入無效,對話框退出,程序恢復原有狀態(tài)。 事實上,對話框還可以用“無模式”方式來顯示,稱為無模式對話框,所謂“無模式對話框”是指當對話框被彈出后,一直保留在屏幕上,用戶可繼續(xù)在對話框所在的應用程序中進行其它操作;當需要使用對話框時,只需象激活一般窗口一樣單擊對話框所在的區(qū)域即可激活。由于“
25、無模式”方式還要涉及到其它一些編程工作,限于篇幅,這里不作討論。3.2控件的創(chuàng)建和使用方法 3.2.1 控件的創(chuàng)建方法 控件的創(chuàng)建方式有以下兩種:一種是在對話框模板資源中用編輯器來指定控件,這就是說,將控件的父窗口指定為對話框,這樣做的好處是明顯的,因為當應用程序啟動該對話框時,框架系統(tǒng)就會為對話框創(chuàng)建控件;而當對話框消失時,控件也隨之清除。另一種方式是將控件看作是任一窗口的子窗口,并通過調(diào)用相應的Create函數(shù)來創(chuàng)建。 例Ex_Edit 使用編程方式來創(chuàng)建一個編輯框 (1) 啟動Visual C+ 6.0,選擇“文件”“新建”菜單,在彈出的“新建”對話框的工程標簽頁面中,選擇MFC App
26、Wizard(exe)的項目類型。單擊位置框右側(cè)的按鈕,在彈出的對話框中,將該應用程序的文件夾定位在“D:Visual C+應用第3章”,并在工程編輯框中輸入單文檔應用程序名Ex_Edit。 (2) 單擊確定按鈕,在出現(xiàn)的“步驟1”對話框中,選擇“基本對話框”應用程序類型。 (3) 單擊完成按鈕出現(xiàn)一個信息對話框,顯示出用戶在前面幾個步驟中作出的選擇內(nèi)容,單擊確定按鈕系統(tǒng)開始創(chuàng)建,并又回到了Visual C+ 6.0的主界面。若無特別說明,以后凡遇到“創(chuàng)建一個默認的基于對話框應用程序Ex_XXXX”就是指上述的步驟,本書作此約定。其中,Ex_XXXX為創(chuàng)建的應用程序名。3.2控件的創(chuàng)建和使用方
27、法 (4) 將項目工作區(qū)切換到ClassView頁面,展開Ex_Edit所有的類結(jié)點,右擊CEx_EditDlg類名,從快捷菜單中選擇Add Member Variable(添加成員變量),在出現(xiàn)的對話框中定義一個CEdit類對象m_wndEdit,通常以“m_”來作為變量的開頭,表示“成員”(member)的意思。如圖3.13所示,單擊確定按鈕。在MFC中,每一個類型的控件都用相應的類來封裝。如編輯框控件,它的類是CEdit,通過該類對象來訪問其成員,從而實現(xiàn)編輯框的操作。圖3.13 添加成員變量3.2控件的創(chuàng)建和使用方法 (5) 在項目工作區(qū)窗口的ClassView頁面中,將CEx_Edi
28、tDlg結(jié)點展開,雙擊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(); / 獲取對話框的字體 m_wndEdit.SetFont(font);/ 設置控件字體 return TRUE; / return TRUE unless you set the focus to a control 3.2控件的創(chuàng)建和使用方法 分析和說明: 前面曾說過,由于OnInitDialog函數(shù)在對話框初始化時被調(diào)用,因此將對話框中的一些初始化代碼都添加在此函數(shù)中。 由于Windows操作系統(tǒng)使用的是圖形界面,因此在MFC中,對于每種界面元素的幾何大小和位置常使用CPoint類(點)、CSize類(大?。┖虲Rect類(矩形)來描述(以后還會討論)。代碼
30、中,GetClientRect 是對話框基類CWnd的成員函數(shù),用來獲取其客戶區(qū)的位置和大小。對于對話框來說,其客戶區(qū)是指除標題欄(如果有的話)和邊框之外的那部分區(qū)域。為了使創(chuàng)建的編輯框占用對話框整個客戶區(qū),且又不能覆蓋對話框右側(cè)的確定和取消按鈕,故將右邊的位置在原來的位置上減去100。 代碼中,CEdit類成員函數(shù)Create用來創(chuàng)建編輯框控件,該函數(shù)第一個參數(shù)用來指定指定控件的樣式(樣式),其中ES_MULTILINE(以ES_開頭的)是編輯框類封裝的預定義樣式,表示創(chuàng)建的編輯框可以輸入多行文本,WS_CHILD(子窗口)、WS_VISIBLE(可見)、WS_TABSTOP(可用Tab鍵選
31、擇)、WS_BORDER(帶有邊框)等都是CWnd類封裝的預定義窗口樣式,它們都可以直接引用,當多個樣式指定時,需要使用按位或運算符“|”來連接。第二個參數(shù)用來指定它在父窗口中的位置和大小,第三個參數(shù)用來指定父窗口指針,最后一個參數(shù)是指定該控件的標識值。3.2控件的創(chuàng)建和使用方法 由于編輯框是作為對話框的一個子窗口來創(chuàng)建的,因此WS_CHILD樣式是必不可少的,且還要使用WS_VISIBLE使控件在創(chuàng)建后顯示出來。 (6) 編譯并運行,這樣就可以在創(chuàng)建的編輯框中輸入文本了,結(jié)果如圖3.14所示。圖3.14 Ex_Edit運行結(jié)果3.2控件的創(chuàng)建和使用方法 3.2.2 控件的消息及消息映射1.
32、控件的消息 當控件的狀態(tài)發(fā)生改變時,控件就會向其父窗口發(fā)送消息,這個消息稱為通知消息。對于一般控件來說,其通知消息通常是一條WM_COMMAND消息,這條消息的wParam參數(shù)的低位字中含有控件標識符,wParam參數(shù)的高位字則為通知代碼,lParam參數(shù)則是指向控件的句柄。 而對于有些控件,其通知消息通常是一條WM_NOTIFY消息,這條消息的wParam參數(shù)是發(fā)送通知消息的控件的標識符,而lParam參數(shù)則是指向一個結(jié)構(gòu)指針。 2. 映射控件消息不管是什么控件消息,一般都可以用MFC ClassWizard對它們加以映射。例如: 例Ex_Btns 一個或多個按鈕控件的映射 (1) 創(chuàng)建一個
33、默認的基于對話框應用程序Ex_Btns。 (2) 在打開的對話框資源模板中,刪除“TODO: 在這里設置對話控制?!膘o態(tài)文本控件,將確定和取消按鈕向?qū)υ捒蜃筮呉苿右欢挝恢茫缓髮⑹髽艘浦翆υ捒蛸Y源模板右下角的實心藍色方塊處,拖動鼠標,將對話框資源模板的大小縮小一些。3.2控件的創(chuàng)建和使用方法 (3) 在對話框資源模板的左邊依次添加三個按鈕控件,保留其默認屬性,并將其布局得整齊一些,且上下間隔相同。如圖3.15所示。 (4)按快捷鍵Ctrl+W,打開MFC ClassWizard對話框,查看“Class name”列表中是否選擇了CEx_BtnsDlg,在IDs列表中選擇 IDC_BUTTON1
34、,這是添加第一個按鈕后,系統(tǒng)自動為此按鈕設置的默認標識符,然后在Messages框中選擇BN_CLICKED消息。圖3.15 添加三個按鈕 (5) 單擊Add Function按鈕或雙擊BN_CLICKED消息,出現(xiàn)“Add Member Function”對話框,在這里可以輸入成員函數(shù)的名稱,系統(tǒng)默認的函數(shù)名為OnButton1。如圖3.16所示。3.2控件的創(chuàng)建和使用方法圖3.16 添加按鈕消息映射函數(shù)3.2控件的創(chuàng)建和使用方法 需要說明的是: 不同資源對象(控件、菜單命令等)所產(chǎn)生的消息是不相同的。例如,按鈕控件IDC_BUTTON1的消息有兩個:BN_CLICKED和BN_DOUBLE
35、CLICKED,分別表示當用戶單擊或雙擊該按鈕時產(chǎn)生的通知消息。 一般不需要對對話框中的確定(OK)與取消(Cancel)按鈕進行消息映射,因為系統(tǒng)已自動設置了這兩個按鈕的動作,當用戶單擊這兩個按鈕都將自動關閉對話框,且確定(OK)按鈕動作還使得對話框數(shù)據(jù)有效。 (6) 單擊OK按鈕,在MFC ClassWizard的“Member functions”列表中將列出新增加的成員函數(shù)。選擇此函數(shù),單擊Edit Code按鈕(或直接在函數(shù)名雙擊鼠標),開發(fā)環(huán)境的文檔窗口中將自動打開該函數(shù)所在的源代碼文件,并定位到該函數(shù)的實現(xiàn)代碼處。在此成員函數(shù)中 添加下列代碼: void CEx_BtnsDlg:
36、OnButton1() MessageBox(你按下了Button1按鈕!); 3.2控件的創(chuàng)建和使用方法 (7) 編譯并運行,當單擊Button1按鈕時,就會執(zhí)行OnButton1函數(shù),彈出一個消息對話框,顯示“你按下了Button1按鈕”。這就是按鈕BN_CLICKED消息的映射過程,其他控件的消息也可以類似映射。 3. 映射控件通用消息 上述過程是映射一個控件的某一個消息,事實上也可通過WM_COMMAND消息的映射來處理一個或多個控件的通用消息,如下面的步驟: (1) 打開MFC ClassWizard對話框,在“Class name”列表中是否選擇了CEx_BtnsDlg,在IDs列
37、表中選擇CEx_BtnsDlg,在Messages框中找到并雙擊OnCommand,這樣OnCommand消息函數(shù)就添加好了,如圖3.17所示。由于OnCommand函數(shù)是一個用來處理WM_COMMAND消息的虛函數(shù),而這里添加的OnCommand函數(shù)事實上是一個在類中實際調(diào)用的函數(shù),可稱為實例函數(shù)。這樣的映射操作,可以稱之為對虛函數(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) 編譯運行并測試。 需要說明的是:由于Button1按鈕的BN_CLICKED消息處理同時存在兩種函數(shù),即OnButton1和OnCommand,因此若單擊Button1按鈕,系統(tǒng)會先執(zhí)行哪一個函數(shù)呢?測試的結(jié)果表明,系統(tǒng)先執(zhí)行OnCommand函數(shù)代碼,然后執(zhí)行OnButton1函數(shù)代碼。之所 以還能執(zhí)行OnButton1函數(shù)代碼,是因為OnCommand函數(shù)的最后一句代碼“
40、return CDialog:OnCommand(wParam, lParam);”,它將控件的消息交由對話框其他函數(shù)處理。 3.2.3 控件的數(shù)據(jù)交換(DDX)和數(shù)據(jù)校驗(DDV) 使用MFC ClassWizard可以很方便地為一個控件設置相關聯(lián)變量并可設置其數(shù)據(jù)范圍。例如,設一對話框中有一個編輯框和一個按鈕控件,單擊按鈕控件,則按鈕控件的標題就是編輯框中輸入的內(nèi)容。(這個示例為3部分闡述:控件及控件變量的添加、理解DDX/DDV、使用UpdateData) 例Ex_DDX 控件的DDX和DDV 1. 控件及控件變量的添加 (1) 創(chuàng)建一個默認的基于對話框應用程序Ex_DDX。 (2) 在
41、打開的對話框資源模板中,刪除“TODO: 在這里設置對話控制。”靜態(tài)文本控件,將確定和取消按鈕向?qū)υ捒蜃筮呉苿右欢挝恢茫缓髮⑹髽艘浦翆υ捒蛸Y源模板右下角的實心藍色方塊處,拖動鼠標,將對話框資源模板的大小縮小一些。圖3.18 添加編輯框和按鈕3.2控件的創(chuàng)建和使用方法 (3) 在對話框資源模板的左邊添加一個編輯框控件和一個按鈕控件,保留其默認屬性,并將其布局得整齊一些。如圖3.18所示。 (4) 按快捷鍵Ctrl+W,打開MFC ClassWizard對話框,并切換到Member Variables頁面,查看“Class name”列表中是否選擇了CEx_DDXDlg,此時可以在Control
42、 IDs列表中看到剛才添加的控鈕和編輯框的標識符IDC_BUTTON1和IDC_EDIT1,如圖3.19所示。在Control IDs列表中,選定按鈕控件標識符IDC_BUTTON1,雙擊鼠標左鍵或單擊Add Variable按鈕,彈出Add Member Variable對話框,如圖3.20所示。圖3.19 “Member Variables”頁面3.2控件的創(chuàng)建和使用方法 圖3.20 為按鈕控件添加控件變量 圖3.21 為編輯框控件添加控件變量3.2控件的創(chuàng)建和使用方法 (6) 在Member variable name框中填好與控件相關聯(lián)的成員變量m_RelBtn,單擊OK按鈕,又回到M
43、FC ClassWizard對話框的Member Variables頁面中,在Control IDs列表中出現(xiàn)剛才添加的控件變量m_RelBtn。 (7) 在Control IDs列表中,選定編輯框控件標識符IDC_EDIT1,雙擊鼠標左鍵或單擊Add Variable按鈕,彈出Add Member Variable對話框。在Member variable name框中輸入控件變量名m_strEdit,保留Category的默認選項Value,在Variable type(變量值類型)中選擇該變量的數(shù)據(jù)類型為CString(字符串類),結(jié)果如圖3.21所示。 (8) 單擊OK按鈕,又回到MFC
44、 ClassWizard對話框的Member Variables頁面。從圖3.20和3.21的不同可以看出: 對于大多數(shù)控件而言,Category框內(nèi)可選擇Value或Control兩種類型。Control所對應的變量類型就是MFC為該控件封裝的控件類,Value所對應的是數(shù)值類型。但按鈕控件變量沒有Value類型。 不同的控件所提供的關聯(lián)的數(shù)值類型各不相同。例如,對于編輯框來說,Variables type中的數(shù)值類型可以有CString(字符串類)、int、UINT、long、DWORD、float、double、BYTE、short、BOOL等。3.2控件的創(chuàng)建和使用方法 但要注意:DD
45、V/DDX技術中,允許為同一個控件關聯(lián)多個變量,但必須保證這些變量名是互不相同的,且這些變量在同一個類型不能有多個變量,即在Value和Control類型中各自只能有一個關聯(lián)變量。另外,通常將Value型控件變量稱為控件值變量。 如果添加的關聯(lián)變量是一個數(shù)值類型,則在MFC ClassWizard對話框的Member Variables頁面下方還要求用戶輸入變量的范圍,這就是控件的數(shù)據(jù)校驗設置。 在Control IDs列表中,選定編輯框控件標識符IDC_EDIT1,此時就會下方位置處出現(xiàn)Maximum Characters(最大字符個數(shù))框,用來設定該控件變量允許的最大字符個數(shù)。輸入20,結(jié)
46、果如圖3.22所示,單擊確定按鈕。圖3.22 編輯框控件值變量的DDV設置 3.2控件的創(chuàng)建和使用方法 需要說明的是,若控件值變量的數(shù)據(jù)類型是整型或浮點型,則DDV框就變成設置最大和最小的兩個數(shù)值框了。 2. 理解DDX/DDV 打開CEx_DDXDlg類源文件,可以發(fā)現(xiàn)MFC ClassWizard對上述操作作了以下三方面的修改: (1) 在Ex_DDXDlg.h文件中,添加了控件變量的聲明,代碼如下面的加粗斜體部分: / Dialog Data /AFX_DATA(CEx_DDXDlg) enum IDD = IDD_EX_DDX_DIALOG ; / 用枚舉定義一個符號常量IDD,使其值
47、等于IDD_EX_DDX_DIALOG CButtonm_RelBtn; CStringm_strEdit; /AFX_DATA (2) 在Ex_DDXDlg.cpp文件中的CEx_DDXDlg構(gòu)造函數(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é)尾的標記是ClassWizard定義的專門用作DDX/DDV的標記,表示該部分的代碼是由ClassWizard自動管理,一般不需要更改。 3. 使用UpdateData 當為一個控件定義一個關聯(lián)的數(shù)據(jù)變量后,即對控件值變量來說,就可使用CWnd類的成員函數(shù)UpdateData使數(shù)值在控件
50、顯示和控件值變量之間進行切換。 UpdateData函數(shù)只有一個為TRUE或FALSE的參數(shù)。當調(diào)用UpdateData(FALSE)時,數(shù)據(jù)由控件相關聯(lián)的成員變量向控件傳輸,即將控件值變量的值在控件中顯示出來;當調(diào)用UpdateData(TRUE)或不帶參數(shù)的UpdateData時,數(shù)據(jù)從控件向相關聯(lián)的 成員變量復制,即將當前控件顯示的值存儲到控件值變量中。故,當需要獲取當前控 件的值之前,一定要調(diào)用UpdateData(TRUE)或不帶參數(shù)的UpdateData。例如: (1) 按快捷鍵Ctrl+W,打開MFC ClassWizard對話框,為按鈕IDC_BUTTON1在CEx_DDXDl
51、g類添加BN_CLICKED消息的映射函數(shù)OnButton1。3.2控件的創(chuàng)建和使用方法 在映射函數(shù)OnButton1中添加下面代碼: void CEx_DDXDlg:OnButton1() UpdateData();/ 默認參數(shù)值是TRUEm_strEdit.TrimLeft();m_strEdit.TrimRight();if ( m_strEdit.IsEmpty() ) m_RelBtn.SetWindowText( Button1 );else m_RelBtn.SetWindowText( m_strEdit ); 代碼中,由于m_strEdit 是CString類對象,因而可以調(diào)
52、用CString類的公有成員函數(shù)。其中,TrimLeft和TrimRight函數(shù)不帶參數(shù)時分別用來去除字符串最左邊或最邊一些空格符、換行符、Tab字符等白字符,IsEmpty是用來判斷字符串是否為空。3.2控件的創(chuàng)建和使用方法 這樣,當編輯框內(nèi)容有除白字符之外的實際字符的字符串時,SetWindowText用將其內(nèi)容設定為按鈕控件的標題。否則,按鈕控件的標題為“Button1”。 (3) 編譯并運行。當在編輯框中輸入“Hello”后,單擊Button1按鈕,按鈕的名稱就變成了編輯框控件中的內(nèi)容“Hello”,其結(jié)果如圖3.23所示。圖3.23 Ex_DDX運行結(jié)果3.3常用控件 根據(jù)控件的特性
53、和功能,一般可將其分為三類:Windows公共控件、ActiveX控件以及MFC新增的一些控件等。表3.3列出了本書所用到的常用控件類。 表3.3 常用控件類控件名稱MFC類功能描述靜態(tài)控件CStatic用來顯示一些幾乎固定不變的文字或圖形按鈕CButton用來產(chǎn)生某些命令或改變某些選項,包括單選按鈕、復選框和組框編輯框CEdit用于完成文本和數(shù)字的輸入和編輯列表框CListBox顯示一個列表,讓用戶從中選取一個或多個項組合框CComboBox是一個列表框和編輯框組合的控件滾動條CScrollBar通過滾動塊在滾動條上的移動和滾動按鈕來改變某些量進展條CProgressCtrl用來表示一個操作
54、的進度滑動條CSliderCtrl通過滑動塊的移動來改變某些量,并帶有刻度指示旋轉(zhuǎn)按鈕控件CSpinButtonCtrl帶有一對反向箭頭的按鈕,單擊這對按鈕可增加或減少某個值日期時間控件CDateTimeCtrl用于選擇指定的日期和時間圖像列表CImageList一個具有相同大小的圖標或位圖的集合列表控件CListCtrl可以用 “大圖標”、“小圖標”、“列表”或“報表”等四種不同的方式來顯示一組信息樹控件CTreeCtrl用樹結(jié)構(gòu)的形式顯示一組信息,并能反映這些信息的層次關系3.3常用控件 3.3.1 靜態(tài)控件和按鈕靜態(tài)控件和按鈕是Windows最基本的控件之一。 1. 靜態(tài)控件 一個靜態(tài)控
55、件是用來顯示一個字符串、框、矩形、圖標、位圖或增強的圖元文件。它可以被用來作為標簽、框或用來分隔其它的控件。一個靜態(tài)控件一般不接收用戶輸入,也不產(chǎn)生通知消息。 在對話框編輯器的控件工具欄中,屬于靜態(tài)控件的有:靜態(tài)文本( )、組框( )和靜態(tài)圖片( )三種。其中,靜態(tài)圖片控件的常規(guī)(General)屬性對話框(右擊添加的控件,從彈出的快捷菜單中選擇“屬性”菜單,即可彈出該控件的屬性對話框),如圖3.24所示。 在靜態(tài)圖片控件的常規(guī)屬性對話框中,用戶可以選擇圖片“類型”、“圖像”兩個組合框中的有關選項內(nèi)容,并可將應用程序資源中的圖標、位圖等內(nèi)容顯示在該靜態(tài)圖片控件中。另外,用戶還可設置其樣式來改變
56、控件的外觀以及圖像在控件的位置等。例如,在任一個對話框中添加一個靜態(tài)圖片控件,在其常規(guī)屬性對話框中,將其“類型”選擇為“圖標(Icon)”,再將其“圖像”選擇為IDR_MAINFRAME,則靜態(tài)圖片控件顯示的圖標是 。3.3常用控件圖3.24 靜態(tài)圖片控件的常規(guī)屬性對話框 例Ex_Etched 制作水平蝕刻線 (1)創(chuàng)建一個默認的對話框應用程序Ex_Etched。 (2) 在打開的對話框資源模板中,刪除“TODO: 在這里設置對話控制。”靜態(tài)文本控件,將確定和取消按鈕向?qū)υ捒蜃筮呉苿右欢挝恢?,然后將鼠標移至對話框資源模板右下角的實心藍色方塊處,拖動鼠標,將對話框資源模板的大小縮小一些。3.3常
57、用控件 (3)在對話框資源模板中的靠左中間位置添加一個靜態(tài)圖片控件,右擊該控件,從彈出的快捷菜單中選擇“屬性”,彈出其屬性對話框。 (4)將“類型”選擇為默認的“框架(Frame)”類型,將“顏色”類型選為“蝕刻(Etched)”,然后關閉屬性對話框。此時,靜態(tài)圖片控件變成一個蝕刻的矩形框。 將鼠標移動到添加的靜態(tài)圖片控件的右下角位置,使鼠標指針變成,拖動鼠標使控件的大小變成一條水平線,單擊對話框測試按鈕,則結(jié)果如圖3.25所示。水平蝕刻線圖3.25 水平蝕刻線凡以后在對話框中有這樣的水平蝕刻線或垂直蝕刻線,都是指的這種制作方法,書中不再講述其制作過程。本書作此約定。3.3常用控件2. 按鈕
58、在Windows中所用的按鈕是用來實現(xiàn)一種開與關的輸入,常見的按鈕有3種類型:按鍵按鈕、單選按鈕、復選框按鈕,如圖3.26所示。圖3.26 按鈕的不同類型 (1)按鍵按鈕。按鍵按鈕通??梢粤⒓串a(chǎn)生某個動作,執(zhí)行某個命令,因此也常被稱為命令按鈕。按鍵按鈕有兩種樣式:標準按鍵按鈕和默認(缺?。┌存I按鈕。從外觀上來說,默認按鍵按鈕是在標準按鍵按鈕的周圍加上一個黑色邊框(參見圖3.26),這個黑色邊框表示該按鈕已接受到鍵盤的輸入焦點,這樣一來,用戶只須按回車鍵就能按下該按鈕。一般來說,只把最常用的按鍵按鈕設定為默認按鍵按鈕,具體設定的方法是在按鍵按鈕屬性對話框的樣式(Style)頁面中選中“缺省按鈕(
59、Default button)”項。3.3常用控件 (2)單選按鈕。單選按鈕的外形是在文本前有一個圓圈,當它被選中時,單選按鈕中就標上一個黑點,它可分為一般和自動兩種類型。在自動類型中,用戶若選中同組按鈕中的某個單選按鈕,則其余的單選按鈕的選中狀態(tài)就會清除,保證了多個選項始終只有一個被選中。 (3)復選框。復選框的外形是在文本前有一個空心方框,當它被選中時,復選框 中就加上一個“”標記,通常復選框只有選中和未選中兩種狀態(tài),若復選框前面有一個灰色是“”,則這樣的復選框是三態(tài)復選框,如圖3.26的Check2,它表示復選框的選擇狀態(tài)是“不確定”。設定成三態(tài)復選框的方法是在復選框?qū)傩詫υ捒虻臉邮剑⊿
60、tyle)頁面中選中“三次狀態(tài)(Tri-state)”項。 3. 按鈕的消息 在按鈕映射的消息中,常見的只有兩個:BN_CLICKED(單擊按鈕)和BN_DOUBLE CLICKED(雙擊按鈕)。 4. 按鈕選中操作 最常用的按鈕操作是設置或獲取一個按鈕或多個按鈕的選中狀態(tài)。CButton類的成員函數(shù)SetCheck和GetCheck分別用來設置或獲取指定按鈕的選中狀態(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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力設備供應招標合同三篇
- 珠江花園房屋買賣合同三篇
- 人力資源招聘計劃
- 每月報稅課件(地稅)
- 《黃金與美元的對決》課件
- 《魚苗繁育技術》課件
- 《酒店銷售技巧培訓》課件
- 醫(yī)院消毒滅菌課件
- 《使用框架設計網(wǎng)》課件
- 組織胚胎學課件結(jié)締組織
- 環(huán)境的清潔與消毒及消毒藥械一次性使用醫(yī)療用品管理課件
- 六年級數(shù)學上冊典型例題系列之期中復習應用題部分(解析版)
- 35千伏輸電線路施工方案
- 新團員入團儀式PPT模板
- 八年級歷史上冊教案:第16課 毛澤東開辟井岡山道路
- 優(yōu)質(zhì)下落市政排水檢查井滲水率qc結(jié)果全國教學課件
- 好書推薦玫瑰與教育
- 合作意向協(xié)議
- 腸梗阻完整版課件
- 河南神火興隆礦業(yè)有限責任公司泉店煤礦礦產(chǎn)資源開采與生態(tài)修復方案
- 地質(zhì)勘察報告
評論
0/150
提交評論