版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 6 章 對(duì)話框和標(biāo)準(zhǔn)控件,對(duì)話框是Windows應(yīng)用程序中一種常用的資源,其主要功能是輸出信息和接收用戶(hù)的輸入數(shù)據(jù)。控件是嵌入在對(duì)話框中或其它父窗口中的一個(gè)特殊的小窗口,它用于完成不同的輸入、輸出功能。 對(duì)話框與控件關(guān)系密切,在每個(gè)對(duì)話框上一般都有一些控件,對(duì)話框依靠這些控件與用戶(hù)進(jìn)行信息的交互。 本章主要介紹對(duì)話框的工作原理和編程方法,并通過(guò)實(shí)例學(xué)習(xí)一些標(biāo)準(zhǔn)控件和公共控件的使用方法。,6.1 對(duì)話框概述,在MFC中,對(duì)話框的功能被封裝在CDialog類(lèi)中,而CDialog類(lèi)是CWnd類(lèi)的派生類(lèi)。作為窗口,對(duì)話框和其它窗口一樣具有窗口的一切功能。 對(duì)話框的一個(gè)典型應(yīng)用是通過(guò)菜單命令或工具欄
2、按鈕打開(kāi)一個(gè)對(duì)話框,當(dāng)然,對(duì)話框也可以作為一個(gè)程序的主界面。,6.1.1 基于對(duì)話框的應(yīng)用程序,可以直接利用MFC AppWizard向?qū)?chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序,這種程序運(yùn)行后首先出現(xiàn)一個(gè)對(duì)話框。在向?qū)У牡谝徊竭x擇Dialog Based項(xiàng)。此時(shí),應(yīng)用程序向?qū)⒊霈F(xiàn)與單文檔和多文檔程序向?qū)Р煌牟僮鞑襟E,因?yàn)閷?duì)話框應(yīng)用程序一般不包含文檔,故不支持?jǐn)?shù)據(jù)庫(kù)和復(fù)合文檔。 按照對(duì)話框應(yīng)用程序向?qū)崾镜牟襟E進(jìn)行操作就得到一個(gè)對(duì)話框應(yīng)用程序項(xiàng)目,出現(xiàn)對(duì)話框編輯器和控件工具欄浮動(dòng)窗口,它們采用的是一種所見(jiàn)即所得的可視化工作方式。利用向?qū)?chuàng)建應(yīng)用程序的框架后,程序員可根據(jù)程序具體功能要求添加代碼。,例
3、編寫(xiě)一個(gè)對(duì)話框應(yīng)用程序MyDialog,程序運(yùn)行后顯示一個(gè)對(duì)話框,并在對(duì)話框上顯示文本串。,1執(zhí)行File|New命令出現(xiàn)New對(duì)話框,選擇MFC AppWizardexe項(xiàng),輸入程序名MyDialog,單擊OK按鈕。在隨后出現(xiàn)的MFC AppWizard-Step 1對(duì)話框窗口中選擇Dialog Based選項(xiàng),單擊Finish按鈕就創(chuàng)建了應(yīng)用程序項(xiàng)目,并在Developer Studio中打開(kāi)了對(duì)話框編輯器和控件工具欄。 2去掉對(duì)話框中標(biāo)題為“TODO: 在這里設(shè)置對(duì)話控制”的靜態(tài)文本控件,調(diào)整對(duì)話框大小,在成員函數(shù)CMyDialogDlg:OnPaint()中添加代碼。,void CMy
4、DialogDlg:OnPaint() . . . . . . else CPaintDC dc(this); dc.SetBkMode(TRANSPARENT);/背景設(shè)透明 dc.TextOut(20, 50, 這是一個(gè)對(duì)話框應(yīng)用程序!); CDialog:OnPaint(); ,6.1.2 對(duì)話框類(lèi)CDialog,MFC提供了一系列對(duì)話框類(lèi),并實(shí)現(xiàn)了對(duì)話框消息響應(yīng)和處理機(jī)制。CDialog類(lèi)是對(duì)話框類(lèi)中最重要的類(lèi),我們?cè)诔绦蛑袆?chuàng)建的對(duì)話框類(lèi)一般都是CDialog類(lèi)的派生類(lèi)。CDialog類(lèi)還是其它所有對(duì)話框類(lèi)的基類(lèi),其派生關(guān)系如下所示: CObject CCmdTarget CWnd C
5、Dialog,對(duì)話框類(lèi)為程序員提供了管理對(duì)話框的編程接口。 CDialog類(lèi)從CWnd類(lèi)派生而來(lái),所以它繼承了CWnd類(lèi)的成員函數(shù),具有CWnd類(lèi)的基本功能,可以編寫(xiě)代碼移動(dòng)、顯示或隱藏對(duì)話框,并能根據(jù)對(duì)話框的特點(diǎn)增加新的成員函數(shù),擴(kuò)展它的功能。 在CDialog類(lèi)的派生類(lèi)中可以直接調(diào)用CDialog類(lèi)的成員函數(shù)。大部分的成員函數(shù)是虛函數(shù),可以在派生類(lèi)中重載,以實(shí)現(xiàn)特定的目的。 除了CDialog類(lèi)成員函數(shù),類(lèi)CWnd和CWinApp也提供了一些成員函數(shù)用于對(duì)話框的管理。,對(duì)話框的分類(lèi),對(duì)話框主要有以下兩種: (1)模態(tài)對(duì)話框 在對(duì)話框關(guān)閉之前,用戶(hù)無(wú)法在應(yīng)用程序的其他窗口中進(jìn)行工作的對(duì)話框稱(chēng)
6、為模態(tài)對(duì)話框。 例如,Windows的各種應(yīng)用軟件中的Open File對(duì)話框。用戶(hù)不能在應(yīng)用程序的其他地方工作,直到模態(tài)對(duì)話框關(guān)閉。 (2)非模態(tài)對(duì)話框 對(duì)話框保留在屏幕的同時(shí),用戶(hù)還可以在應(yīng)用程序其他窗口中進(jìn)行工作的對(duì)話框稱(chēng)為非模態(tài)對(duì)話框。 例如,Word字處理軟件中的Find和Replace對(duì)話框就是非模態(tài)對(duì)話框的例子。,有關(guān)對(duì)話框的常用處理函數(shù) CDialog:CDialog() 通過(guò)調(diào)用派生類(lèi)構(gòu)造函數(shù),根據(jù)對(duì)話框資源模板定義一個(gè)對(duì)話框。 CDialog:DoModal() 激活模態(tài)對(duì)話框,顯示對(duì)話框窗口。 CDialog:Create() 根據(jù)對(duì)話框資源模板創(chuàng)建非模態(tài)對(duì)話框窗口。如果
7、對(duì)話框不是Visible屬性,還需通過(guò)調(diào)用CWnd:ShowWindow()函數(shù)顯示非模態(tài)對(duì)話框窗口。 CDialog:OnOk() 單擊OK按鈕時(shí)調(diào)用該函數(shù),接收對(duì)話框輸入數(shù)據(jù),關(guān)閉對(duì)話框。 CDialog:OnCancel() 單擊Cancel按鈕或按Esc鍵時(shí)調(diào)用該函數(shù),不接收對(duì)話框輸入數(shù)據(jù),關(guān)閉對(duì)話框。,CDialog:OnInitDialog() WM_INITDIALOG消息處理函數(shù),在調(diào)用DoModal或Create函數(shù)時(shí)系統(tǒng)發(fā)送WM_INITDIALOG消息,在顯示對(duì)話框前調(diào)用該函數(shù)進(jìn)行初始化。 CDialog:EndDialog() 用于關(guān)閉模態(tài)對(duì)話框窗口。 CWnd:Sho
8、wWindow() 顯示或隱藏對(duì)話框窗口 CWnd:DestroyWindow() 關(guān)閉并銷(xiāo)毀非模態(tài)對(duì)話框 CWnd:UpdateData() 通過(guò)調(diào)用DoDataExchange()設(shè)置或獲取對(duì)話框控件的數(shù)據(jù) CWnd:DoDataExchange() 被UpdateData()調(diào)用以實(shí)現(xiàn)對(duì)話框數(shù)據(jù)交換,不能直接調(diào)用。,CWnd:GetWindowText() 獲取對(duì)話框窗口的標(biāo)題 CWnd:SetWindowText() 修改對(duì)話框窗口的標(biāo)題 CWnd:GetDlgItemText() 獲取對(duì)話框中控件的文本內(nèi)容 CWnd:SetDlgItemText() 設(shè)置對(duì)話框中控件的文本內(nèi)容 CW
9、nd:GetDlgItem() 獲取控件或子窗口的指針 CWnd:MoveWindow() 用于移動(dòng)對(duì)話框窗口 CWnd:EnableWindow() 使窗口處于禁用或可用狀態(tài),6.1.3 對(duì)話框數(shù)據(jù)交換DDX和驗(yàn)證DDV,在對(duì)話框中實(shí)現(xiàn)用戶(hù)數(shù)據(jù)輸入和輸出的一般方法是通過(guò)ClassWizard類(lèi)向?qū)?duì)話框控件與成員變量相關(guān)聯(lián),利用對(duì)話框數(shù)據(jù)交換DDX(Dialog Data Exchange)和驗(yàn)證DDV(Dialog Data Validation)機(jī)制實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出。 MFC提供了CDataEchange類(lèi)實(shí)現(xiàn)對(duì)話框數(shù)據(jù)交換DDX,交換功能由DoDataExchange()完成。但
10、是不能直接調(diào)用,它由CWnd類(lèi)的成員函數(shù)UpdateData()調(diào)用。,當(dāng)利用ClassWizard類(lèi)向?qū)砑映蓡T變量時(shí),用戶(hù)如果在窗口的左下角輸入數(shù)據(jù)的范圍,ClassWizard將自動(dòng)加入函數(shù)DDV的調(diào)用代碼。 例如,當(dāng)添加一個(gè)UINT型的成員變量m_nInput時(shí)指定它的最小值和最大值分別為0和100,則ClassWizard類(lèi)向?qū)⒃诔蓡T函數(shù)DoDataExchange()中添加以下DDV函數(shù)的調(diào)用語(yǔ)句: DDV_MinMaxUInt(pDX, m_nInput, 0, 100); 程序運(yùn)行后,如果用戶(hù)的輸入數(shù)據(jù)超出0100的范圍,DDV將顯示一個(gè)提示信息對(duì)話框,提示用戶(hù)有效的輸入范圍
11、。,UpdateData()的用法:,當(dāng)調(diào)用UpdateData(TRUE)時(shí),MFC通過(guò)調(diào)用DDX函數(shù)將數(shù)據(jù)從控件傳遞到關(guān)聯(lián)的成員變量;當(dāng)調(diào)用UpdateData(FALSE)時(shí),MFC通過(guò)調(diào)用DDX函數(shù)將數(shù)據(jù)從成員變量傳遞到關(guān)聯(lián)的的控件。利用UpdateData()函數(shù)實(shí)現(xiàn)了在刷新后重新獲取成員變量。,注意: 表面上看程序并沒(méi)有調(diào)用UpdateData(),但是,當(dāng)程序調(diào)用CDialog:DoModal()創(chuàng)建并顯示對(duì)話框時(shí),將自動(dòng)調(diào)用CDialog:OnInitDialog()完成初始化的工作。在OnInitDialog()中調(diào)用了UpdateData(FALSE),將數(shù)據(jù)從成員變量傳遞
12、到關(guān)聯(lián)的控件,從而顯示在控件中。而單擊OK按鈕將調(diào)用CDialog:OnOk()函數(shù),在OnOK()中調(diào)用了UpdateData(TRUE),將數(shù)據(jù)從控件傳遞到關(guān)聯(lián)的成員變量。 由此看來(lái),不管MFC將DDX技術(shù)如何復(fù)雜化,我們只需知道,DDX就如同一條雙向通道,而方向控制開(kāi)關(guān)就是UpdateData()函數(shù)中的BOOL類(lèi)型參數(shù)是TRUE還是FALSE。,6.1.4 提示信息對(duì)話框,提示信息對(duì)話框也稱(chēng)消息對(duì)話框,用來(lái)顯示有關(guān)的提示信息。提示信息對(duì)話框是一種最簡(jiǎn)單的對(duì)話框,不需要用戶(hù)自己創(chuàng)建它就可以直接使用,Visual C+提供了相應(yīng)的函數(shù)實(shí)現(xiàn)這樣的功能。: int AfxMessageBox(
13、LPCTSTR lpText, UINT nType=MB_OK, UINT nlDHelp=0); int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT nType); int CWnd:MessageBox(LPCTSTR lpText, LPCTSTR lpCaption=NULL, UINT nType=MB_OK);,這三個(gè)函數(shù)分別是MFC全局函數(shù)、API函數(shù)和CWnd類(lèi)的成員函數(shù),它們的功能基本相同,但適用范圍有所不同。AfxMessageBox()和:MessageBox()可以在程序中任何地方使用,而
14、CWnd:MessageBox()只能用于控件、對(duì)話框、窗口等一些窗口類(lèi)中。,例如,在軟件安裝過(guò)程中為了彈出如下圖所示的警告提示信息對(duì)話框并進(jìn)行相應(yīng)的處理:,編寫(xiě)的代碼如下: int nChoice=MessageBox(文件復(fù)制失??!, 錯(cuò)誤, MB_ICONWARNING | MB_ABORTRETRYIGNORE ); switch(nChoice) case IDABORT: / 用戶(hù)按下終止按鈕 . . . . . . caseIDRETRY: / 用戶(hù)按下重試按鈕 . . . . . . case IDIGNORE: / 用戶(hù)按下忽略按鈕 . . . . . . ,6.2 使用對(duì)話
15、框,為了在屏幕上顯示對(duì)話框: (1)首先需要建立對(duì)話框資源及其與資源相關(guān)的對(duì)話框類(lèi); (2)然后添加控件、與控件關(guān)聯(lián)的成員變量和消息處理函數(shù); (3)最后在程序中顯示對(duì)話框并訪問(wèn)與控件關(guān)聯(lián)的成員變量。 在Visual C+中可以利用集成工具如對(duì)話框編輯器和ClassWizard類(lèi)向?qū)Ш芊奖愕貏?chuàng)建對(duì)話框,不需要程序員手工編寫(xiě)太多的源代碼。,6.2.1 一般對(duì)話框工作流程,1.當(dāng)定義了一個(gè)對(duì)話框類(lèi)后,就可以利用這個(gè)對(duì)話框類(lèi)聲明一個(gè)對(duì)話框?qū)ο螅匆粋€(gè)能夠在屏幕上顯示的對(duì)話框。 2.聲明了一個(gè)對(duì)話框?qū)ο蠛?,可以調(diào)用對(duì)話框類(lèi)的成員函數(shù)DoModal()建立對(duì)話框窗口并顯示對(duì)話框。 例如,假設(shè)定義了一個(gè)名
16、為CMyDialog的對(duì)話框類(lèi),為了在屏幕上顯示一個(gè)對(duì)話框,可以編寫(xiě)如下代碼: CMyDialog myDlg; myDlg.DoModal();,函數(shù)OnOK()、 OnCancel()與DoModal()的關(guān)系: 對(duì)話框中一般都有OK和Cancel按鈕,單擊OK按鈕時(shí)調(diào)用CDialog:OnOK()函數(shù),單擊Cancel按鈕時(shí)調(diào)用CDialog:OnCancel()函數(shù)。 OnOK()函數(shù)和OnCancal()函數(shù)都將結(jié)束DoModal()函數(shù)調(diào)用,但令DoModal()返回不同的值。OnOK()函數(shù)令DoModal()返回IDOK,OnCancel()函數(shù)令DoModal()返回IDCA
17、NCAL。 用戶(hù)可以根據(jù)DoModal()的返回值做出不同的選擇。如: if (myDlg.DoModal() = = IDOK ) ,對(duì)話框的初始化可以在三個(gè)不同的階段所調(diào)用的函數(shù)中進(jìn)行: (1)對(duì)話框類(lèi)構(gòu)造函數(shù); (2)WM_CREATE消息處理函數(shù); (3)WM_INITDIALOG消息處理函數(shù)。 通常是在消息WM_INITDIALOG的消息處理函數(shù)OnInitDialog()中進(jìn)行初始化。在收到WM_INIT- DIALOG消息時(shí),對(duì)話框的框架已創(chuàng)建,對(duì)話框中的每個(gè)控件也已建立起來(lái),但它們還沒(méi)有在屏幕上顯示。此時(shí)自然可以設(shè)置或優(yōu)化對(duì)話框中各個(gè)控件的外觀、尺寸、位置以及其它屬性。函數(shù)On
18、InitDialog()將被成員函數(shù)DoModal()調(diào)用。,6.2.2 創(chuàng)建對(duì)話框,在Windows中對(duì)話框是作為一種資源被使用,在程序中要?jiǎng)?chuàng)建一個(gè)對(duì)話框,首先要?jiǎng)?chuàng)建一個(gè)對(duì)話框模板資源,然后創(chuàng)建一個(gè)基于該對(duì)話框模板資源的對(duì)話框類(lèi)。對(duì)話框模板資源指定了對(duì)話框本身的屬性(如大小、位置、風(fēng)格、類(lèi)型等)和對(duì)話框中的控件及屬性, 對(duì)話框類(lèi)規(guī)定了對(duì)話框和對(duì)話框中每個(gè)控件的行為。通過(guò)對(duì)話框模板資源才能創(chuàng)建對(duì)話框類(lèi)和對(duì)象。,為了向應(yīng)用程序項(xiàng)目中添加一個(gè)對(duì)話框資源,執(zhí)行Insert|Resource命令或直接按Ctrl+R鍵,彈出Insert Resource資源列表框。一般要加入通用對(duì)話框資源,所以在Ins
19、ert Resource框中直接選擇Dialog項(xiàng),然后單擊New按鈕。系統(tǒng)將給對(duì)話框資源設(shè)置一個(gè)默認(rèn)的ID標(biāo)識(shí),對(duì)話框的默認(rèn)標(biāo)題Caption為Dialog,對(duì)話框有OK和Cancel兩個(gè)按鈕。,對(duì)話框資源的添加:,添加對(duì)話框資源的簡(jiǎn)單方法:,在項(xiàng)目工作區(qū)鼠標(biāo)右擊資源項(xiàng)Dialog,從彈出式菜單中選擇“Insert Dialog”命令項(xiàng)。,對(duì)話框是在對(duì)話框模板資源和對(duì)話框類(lèi)的基礎(chǔ)上形成的,在完成了對(duì)話框的屬性和外觀設(shè)計(jì)后,再來(lái)設(shè)計(jì)對(duì)話框的行為。 我們需要利用ClassWizard類(lèi)向?qū)?chuàng)建一個(gè)對(duì)話框類(lèi),并將這個(gè)類(lèi)同先前創(chuàng)建的對(duì)話框資源連接起來(lái)。 在創(chuàng)建對(duì)話框類(lèi)之前或之后,都可以為對(duì)話框資源添
20、加控件。 但在創(chuàng)建對(duì)話框類(lèi)之后,才可以為對(duì)話框資源添加與對(duì)話框控件相關(guān)聯(lián)的成員變量和消息處理函數(shù)。,創(chuàng)建對(duì)話框類(lèi):,如果按Ctrl+W鍵或在對(duì)話框資源的非控件區(qū)域雙擊鼠標(biāo),ClassWizard類(lèi)向?qū)l(fā)現(xiàn)已添加了一個(gè)對(duì)話框模板資源,卻沒(méi)有設(shè)計(jì)其對(duì)應(yīng)的類(lèi),因此將彈出Adding a Class對(duì)話框,詢(xún)問(wèn)用戶(hù)是否需要利用該對(duì)話框資源創(chuàng)建一個(gè)對(duì)話框類(lèi)。,Name框:用于輸入對(duì)話框類(lèi)的名稱(chēng); File Name框:列出類(lèi)的文件名,單擊Change按鈕可改變文件名; Base class下拉框:列出可選擇的基類(lèi); Dialog ID下拉框:列出可選擇對(duì)話框資源的ID。,在Adding a Class
21、對(duì)話框單擊OK按鈕,彈出New Class對(duì)話框:,例 假設(shè)已利用MFC AppWizard應(yīng)用程序向?qū)Ы⒘艘粋€(gè)名為Mysdi的單文檔應(yīng)用程序,請(qǐng)向應(yīng)用程序中添加對(duì)話框資源和對(duì)話框類(lèi)。 1首先向應(yīng)用程序項(xiàng)目添加一個(gè)對(duì)話框資源,在項(xiàng)目工作區(qū)鼠標(biāo)右擊資源項(xiàng)Dialog,從彈出式菜單中執(zhí)行Insert Dialog命令,插入一個(gè)對(duì)話框資源。,2設(shè)置對(duì)話框的屬性,將光標(biāo)指向?qū)υ捒虻目瞻孜恢?,單擊鼠?biāo)右鍵,從彈出式菜單中選擇Properties項(xiàng),或直接按Enter鍵,彈出Dialog Properties屬性對(duì)話框。該對(duì)話框包括General、Styles、More Styles、Extended
22、Styles、More Extended Styles等頁(yè)面,用于設(shè)置對(duì)話框多種不同的屬性。 3創(chuàng)建對(duì)話框類(lèi),鼠標(biāo)雙擊對(duì)話框資源的非控件區(qū)域。,6.2.3 添加控件及關(guān)聯(lián)的成員變量,如果沒(méi)有控件,對(duì)話框完成不了什么具體功能,對(duì)話框與控件有著密不可分的關(guān)系。結(jié)合對(duì)話框編輯器,利用Controls控件工具欄可給當(dāng)前正在編輯的對(duì)話框模板資源添加控件。 若Visual C+窗口中沒(méi)有出現(xiàn)Controls工具欄,只需將光標(biāo)指向菜單欄并單擊鼠標(biāo)右鍵,從彈出式菜單中選擇Controls項(xiàng)。 控件工具欄上的每一個(gè)圖標(biāo)都代表了一種控件,如果不能確定控件的類(lèi)型,只要將光標(biāo)在該控件圖標(biāo)上停留片刻,就會(huì)顯示該控件類(lèi)型
23、的提示。,向?qū)υ捒蛱砑涌丶r(shí),先在Controls工具欄單擊要添加的控件,再將光標(biāo)指向?qū)υ捒蚩瞻讌^(qū)域并單擊鼠標(biāo)。,添加與控件關(guān)聯(lián)的成員變量,在生成自己的對(duì)話框類(lèi)并添加需要的控件后,可以利用ClassWizard類(lèi)向?qū)г趯?duì)話框類(lèi)的定義中為對(duì)話框資源上的每一個(gè)控件添加一個(gè)或多個(gè)對(duì)應(yīng)的成員變量。 ClassWizard類(lèi)向?qū)У腗ember Variables頁(yè)面主要用來(lái)為對(duì)話框類(lèi)添加和刪除與對(duì)話框控件關(guān)聯(lián)的成員變量,我們?cè)诰帉?xiě)對(duì)話框程序時(shí)經(jīng)常同該頁(yè)面打交道。,Class name下拉框:選擇要添加成員變量的對(duì)話 框類(lèi); Control IDs欄:選擇控件,因?yàn)橐砑拥某蓡T變量總是與一個(gè)對(duì)話框控件ID
24、聯(lián)系在一起,它們代表控件對(duì)象本身或控件的某項(xiàng)屬性; Add Variable按鈕:添加與控件關(guān)聯(lián)的成員變量; Delete Variable按鈕:刪除控件的某個(gè)成員變量。 Control IDs欄:列出對(duì)話框資源上已有的控件,第1列Control IDs表示控件的ID,第2列Type表示變量的類(lèi)型,第3列Member表示成員變量名。,在Member Variables頁(yè)面:,Add Member Variable對(duì)話框,Member variable name框:輸入成員變量名; Category下拉框:選擇成員變量的類(lèi)別,可為Control或Value; Variable type下拉框:選
25、擇成員變量的類(lèi)型。,如果在Category下拉框選擇Value項(xiàng),表示要為該控件的某項(xiàng)屬性定義一個(gè)變量,這意味著程序關(guān)心的是控件中的值,而不是控件對(duì)象本身。這時(shí),還可以通過(guò)Variable type下拉框?yàn)樽兞窟x擇不同的類(lèi)型。,如果在Category下拉框中選擇Control項(xiàng),則表示定義的變量代表控件對(duì)象本身, Control類(lèi)別的變量實(shí)質(zhì)是一個(gè)控件對(duì)象,其類(lèi)型是MFC控件類(lèi)。,可以為一個(gè)控件同時(shí)定義一個(gè)Control類(lèi)別的變量和一個(gè)Value類(lèi)別的變量。這些變量都是作為對(duì)話框派生類(lèi)的成員變量,為了在程序其它地方能夠直接訪問(wèn)添加的成員變量,它們都被聲明為public屬性。,例 完善Mysdi
26、程序,向?qū)υ捒蛸Y源添加需要使用的控件,并添加與控件關(guān)聯(lián)的成員變量。,1向?qū)υ捒蛸Y源添加控件。添加一個(gè)靜態(tài)文本控件,其Caption為“請(qǐng)輸入半徑”。添加一個(gè)Edit Box編輯框控件,其ID標(biāo)識(shí)為IDC_EDIT_ RADIUS,該控件用于接收用戶(hù)的輸入數(shù)據(jù)。 2添加與控件關(guān)聯(lián)的成員變量。按Ctrl+W鍵啟動(dòng)ClassWizard類(lèi)向?qū)?,單擊Member Variables標(biāo)簽。在Class name下拉框選擇類(lèi)CRadiusDialog,在Control IDs欄選擇編輯框IDC_EDIT_RADIUS,單擊Add Variable按鈕。通過(guò)Add Member Variable對(duì)話框添加成
27、員變量m_nRadius,其數(shù)據(jù)類(lèi)型為UINT。 3使用對(duì)話框數(shù)據(jù)驗(yàn)證DDV功能,在該頁(yè)面的左下角輸入成員變量m_nRadius的最小值5和最大值250。,例 完善Mysdi程序,通過(guò)“編輯”菜單中的“輸入半徑(I)”命令打開(kāi)上述標(biāo)題為“輸入半徑”的對(duì)話框,并根據(jù)輸入的半徑畫(huà)一個(gè)圓。 1為了在視圖對(duì)象中接收并存儲(chǔ)對(duì)話框編輯控件的值,在視圖類(lèi)CMysdiView中手工定義一個(gè)UINT類(lèi)型的成員變量m_nCViewRadius。 2利用菜單編輯器在“編輯”菜單增加一個(gè)菜單項(xiàng)“輸入半徑(I)”,其ID標(biāo)識(shí)為ID_EDIT_INPUTRADIUS,Caption為“輸入半徑( / 定義一個(gè)對(duì)話框?qū)ο?
28、dlg.m_nRadius=100;/ 設(shè)置編輯框顯示的初始值 if (dlg.DoModal()=IDOK) / 顯示對(duì)話框 m_nCViewRadius=dlg.m_nRadius; / 接收并存儲(chǔ)編輯框數(shù)據(jù) Invalidate(); / 刷新視圖 ,3在視圖類(lèi)構(gòu)造函數(shù)CMysdiView:CMysdiView()中將成員變量m_nCViewRadius初始化為0。在函數(shù)CMysdiView:OnDraw()中添加如下畫(huà)圓的語(yǔ)句: pDC-Ellipse(0, 0, 2*m_nCViewRadius, 2*m_nCViewRadius); 在視圖類(lèi)實(shí)現(xiàn)文件MysdiView.cpp的開(kāi)始
29、位置加入包含對(duì)話框類(lèi)頭文件的語(yǔ)句: #include RadiusDialog.h”,例:采用另一種方法獲取對(duì)話框編輯框控件的數(shù)據(jù)。 步驟: 1.刪除編輯框控件的成員變量m_nRadius. 2.給CRadiusDialog添加WM_INITAIALOG的消息函數(shù)。 BOOL CRadiusDialog:OnInitDialog() CDialog:OnInitDialog(); CString strRadius; strRadius.Format(%d,100); CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT_RADIUS); pEdit-SetWindo
30、wText(strRadius); return TRUE; ,3.在CRadiusDialog定義一個(gè)public屬性、UINt類(lèi)型的成員變量m_nDiaCtlRdu。在IDOK添加BN_CLICKED的消息函數(shù),添加代碼: void CRadiusDialog:OnOK() m_nDiaCtlRdu=GetDlgItemInt(IDC_EDIT_RADIUS); CDialog:OnOK(); ,4.改寫(xiě)菜單項(xiàng)“輸入半徑”的命令函數(shù)。 void CMysdiView:OnEditInputradius() / TODO: Add your command handler code here
31、 CRadiusDialog dlg; / 定義一個(gè)對(duì)話框?qū)ο?if (dlg.DoModal()=IDOK) / 顯示對(duì)話框 m_nCViewRadius=dlg.m_nDiaCtlRdu; / 接收并存儲(chǔ)編輯框數(shù)據(jù) Invalidate(); / 刷新視圖 ,6.3 標(biāo)準(zhǔn)控件,Windows提供的控件分為兩類(lèi):標(biāo)準(zhǔn)控件和公共控件。 標(biāo)準(zhǔn)控件:靜態(tài)控件、編輯框、按鈕、列表框、組合框和滾動(dòng)條等。利用標(biāo)準(zhǔn)控件可滿(mǎn)足大部分用戶(hù)界面程序設(shè)計(jì)的要求。 公共控件:滑塊、進(jìn)度條、列表視控件、樹(shù)視控件和標(biāo)簽控件等,利用公共控件實(shí)現(xiàn)應(yīng)用程序用戶(hù)界面風(fēng)格的多樣性。,6.3.1 控件概述,控件是Windows提供
32、的完成特定功能的獨(dú)立小部件,它使應(yīng)用程序?qū)υ捁δ艿脑O(shè)計(jì)更容易完成,在對(duì)話框與用戶(hù)的交互過(guò)程中擔(dān)任主要角色,用于完成用戶(hù)輸入和程序運(yùn)行過(guò)程中的輸出。 控件對(duì)應(yīng)一個(gè)CWnd派生類(lèi)的對(duì)象,它實(shí)際上也是一個(gè)窗口,可以通過(guò)調(diào)用窗口類(lèi)的成員函數(shù)實(shí)現(xiàn)控件的移動(dòng)、顯示或隱藏、禁用或可用等操作,也可以重新設(shè)置它們的尺寸和風(fēng)格等屬性。 MFC以類(lèi)的形式對(duì)標(biāo)準(zhǔn)控件和公共控件進(jìn)行了封裝,這些類(lèi)大部分是從CWnd類(lèi)直接派生而來(lái)。,常用的MFC控件類(lèi),常用的MFC控件類(lèi),控件通知Notification消息:,用戶(hù)對(duì)控件的操作將引發(fā)控件事件,Windows產(chǎn)生對(duì)應(yīng)的控件通知Notification消息,消息由其父窗口(如
33、對(duì)話框)接收并處理。 標(biāo)準(zhǔn)控件發(fā)送WM_COMMAND控件通知消息,公共控件一般發(fā)送WM_NOTIFY控件通知消息,有時(shí)也發(fā)送WM_COMMAND消息。 通過(guò)WM_COMMAND消息參數(shù)標(biāo)識(shí)發(fā)出消息的控件和具體的事件,消息參數(shù)中包含了控件的ID標(biāo)識(shí)和通知碼(如BN_CLICKED單擊按鈕事件)??丶ㄖa前綴最后一個(gè)字母為N。 程序員不必關(guān)心消息具體的發(fā)送和接收,只需利用ClassWizard將控件映射到成員變量,將控件消息映射到成員函數(shù),然后編寫(xiě)具體的處理代碼。,控件的創(chuàng)建方法:,控件在程序中可作為對(duì)話框控件或獨(dú)立的窗口兩種形式存在,因此,控件的創(chuàng)建方法也有兩種。 一種方法是在對(duì)話框模板資源
34、中指定控件,這樣當(dāng)應(yīng)用程序創(chuàng)建對(duì)話框時(shí),Windows就會(huì)為對(duì)話框創(chuàng)建控件,編程時(shí)我們一般都采用這種方法。 一種方法是通過(guò)調(diào)用MFC控件類(lèi)的成員函數(shù)Create()創(chuàng)建控件,也可以調(diào)用API函數(shù)CreateWindow()或CreateWindowEx()創(chuàng)建控件。 控件也可以用于其它窗口,如在程序視圖窗口顯示控件。這時(shí),需要首先聲明一個(gè)MFC控件類(lèi)的對(duì)象,然后調(diào)用Create()函數(shù)創(chuàng)建控件。,6.3.2 控件的組織,1. 添加或刪除控件 打開(kāi)對(duì)話框編輯器和控件工具欄,在控件工具欄中單擊要添加的控件,此時(shí),當(dāng)光標(biāo)指向?qū)υ捒驎r(shí)將變成十字形狀,在對(duì)話框指定位置處單擊鼠標(biāo)左鍵,則該控件被添加到對(duì)話
35、框中指定的位置。也可以將光標(biāo)指向控件工具欄中的控件,然后按住鼠標(biāo)不放,采用鼠標(biāo)拖曵的方法將控件拖入到對(duì)話框中。 要?jiǎng)h除已添加的控件,先單擊對(duì)話框中的控件,再按Delete鍵即可刪除指定的控件。,2. 設(shè)置控件屬性 將光標(biāo)指向?qū)υ捒蛑行柙O(shè)置屬性的控件,按回車(chē)鍵(或右擊鼠標(biāo),在彈出式菜單中選擇Properties項(xiàng))彈出Properties對(duì)話框,在Properties對(duì)話框中設(shè)置控件屬性??梢詫傩詫?duì)話框始終保持打開(kāi),只需要按下屬性對(duì)話框左上角的圖釘按鈕。 3. 調(diào)整控件的大小 對(duì)于靜態(tài)文本控件,當(dāng)輸入標(biāo)題內(nèi)容時(shí),控件的大小會(huì)自動(dòng)改變。對(duì)于其它控件,先單擊控件,然后利用控件周?chē)某叽缯{(diào)整點(diǎn)來(lái)改變
36、控件的大小。所選對(duì)象的位置和大小將顯示在狀態(tài)欄的右端。,4. 同時(shí)選取多個(gè)控件 一種方法是在對(duì)話框內(nèi)按住鼠標(biāo)不放,拖曵出一個(gè)大的虛線框,然后釋放鼠標(biāo),則被該虛線框所包圍的控件都將被同時(shí)選??;另一種方法是按住Shift(或Ctrl)鍵不放,然后用鼠標(biāo)連續(xù)選取控件。 5. 移動(dòng)和復(fù)制控件 當(dāng)單個(gè)或多個(gè)控件被選取后,按方向鍵或用鼠標(biāo)拖動(dòng)選擇的控件可移動(dòng)控件。若在鼠標(biāo)拖動(dòng)過(guò)程中按住Ctrl鍵則復(fù)制控件,復(fù)制的控件保持原來(lái)控件的大小和屬性。并且,控件能夠通過(guò)復(fù)制和粘貼操作而加入到其它對(duì)話框中。,6. 編排控件 編排控件主要是指同時(shí)調(diào)整對(duì)話框中一組控件的大小或位置。編排控件有兩種方法,一種方法是使用控件布
37、局工具欄,自動(dòng)編排對(duì)話框中同時(shí)選定的多個(gè)控件;另一種方法是使用Layout菜單,當(dāng)打開(kāi)對(duì)話框編輯器時(shí),Layout菜單將出現(xiàn)在菜單欄上。為了便于用戶(hù)在對(duì)話框內(nèi)精確定位各個(gè)控件,系統(tǒng)還提供了網(wǎng)格、標(biāo)尺等輔助功能。 測(cè)試對(duì)話框和控件的方法: 通過(guò)按下Ctrl+T組合鍵就能測(cè)試對(duì)話框運(yùn)行時(shí)的界面效果。,6.3.3 控件共有屬性,控件的屬性決定了控件的外觀和功能,我們只有通過(guò)控件屬性對(duì)話框才能設(shè)置控件的屬性。 控件屬性對(duì)話框上有若干選項(xiàng)卡,如General(通用屬性)、Style(風(fēng)格)及Extend Styles(擴(kuò)展風(fēng)格)選項(xiàng)卡等,其中General頁(yè)用于設(shè)置控件的通用屬性,Styles和Exte
38、ndcd Styles頁(yè)用來(lái)設(shè)置控件的外觀和輔助屬性。 不同控件有不同的屬性,但它們都具有通用屬性,如控件標(biāo)識(shí)ID、標(biāo)題Caption等項(xiàng),,控件的General屬性,6.3.4 靜態(tài)控件,靜態(tài)控件(Static control)是用來(lái)顯示一個(gè)文本串或圖形信息的控件,它包括靜態(tài)文本控件、圖片控件和組框。 靜態(tài)文本控件用來(lái)顯示一般不需要變化的文本;圖片控件用來(lái)顯示邊框、矩形、圖標(biāo)或位圖等圖形;組框用來(lái)顯示一個(gè)文本標(biāo)題和一個(gè)矩形邊框,通常用來(lái)作為一組控件周?chē)奶摂M邊界,并將一組控件組織在一起。 管理靜態(tài)文本控件和圖片控件的MFC類(lèi)是CStatic類(lèi),而管理組框的MFC類(lèi)是CButton類(lèi)。,所有靜
39、態(tài)控件默認(rèn)的ID標(biāo)識(shí)都為IDC_STATIC,如果要為一個(gè)靜態(tài)控件添加成員變量或消息處理函數(shù),必須重新為它指定一個(gè)唯一的ID標(biāo)識(shí)。 編程時(shí)用的最多是靜態(tài)文本控件,它被用來(lái)作為其它控件的標(biāo)題。每一個(gè)靜態(tài)文本控件最多可以顯示255個(gè)字符,可以使用“n”換行符,并可以通過(guò)Styles頁(yè)面設(shè)置控件的風(fēng)格。,6.3.5 編輯框,編輯框(Edit box)又稱(chēng)文本框或編輯控件,它一般與靜態(tài)文本控件一起使用,用于數(shù)據(jù)的輸入和輸出。編輯框提供了完整的鍵盤(pán)輸入和編輯功能,可以輸入各種文本、數(shù)字或者口令。 編輯框?yàn)橛脩?hù)提供了良好的輸入、輸出功能,能夠?qū)㈡I盤(pán)輸入的字符串轉(zhuǎn)化為要求的數(shù)據(jù)類(lèi)型,并驗(yàn)證它是否符合輸入要求
40、(字符串長(zhǎng)度或數(shù)值范圍)。通過(guò)前述對(duì)話框內(nèi)容的學(xué)習(xí)我們已經(jīng)知道,完成上述工作是利用了MFC提供的對(duì)話框數(shù)據(jù)交換(DDX)和數(shù)據(jù)驗(yàn)證(DDV)技術(shù)。,編輯框常用屬性: Multiline設(shè)置單行或多行編輯,Align text設(shè)置文本對(duì)齊方式,Number表示只能輸入數(shù)字,Password表示鍵入編輯框的字符都將顯示為“*”,Uppercase或Lowercase表示鍵入編輯框的字符全部轉(zhuǎn)換成大寫(xiě)或小寫(xiě)形式,Read-Only表示只能輸出數(shù)據(jù)。 當(dāng)編輯框的文本被修改,會(huì)向父窗口發(fā)送消息,可以利用ClassWizard在對(duì)話框類(lèi)中添加消息處理函數(shù)。編輯框發(fā)送消息有:EN_CHANGE、EN_KIL
41、LFOCUS、EN_SETFOCUS、EN_MAX TEXT、EN_UPDATE等。,例 編寫(xiě)一個(gè)SDI應(yīng)用程序Password,程序啟動(dòng)后首先彈出一個(gè)如圖所示的用戶(hù)身份確認(rèn)對(duì)話框,當(dāng)用戶(hù)鍵入正確的口令后才能進(jìn)入程序的主界面。,6.3.6 按鈕,按鈕(Button)包括按鍵按鈕、單選按鈕、復(fù)選框和組框等4種類(lèi)型。雖然封裝按鈕控件的MFC類(lèi)都是CButton類(lèi),但它們具有不同的功能。按鍵按鈕在被按下時(shí)會(huì)立即執(zhí)行某個(gè)命令,也被稱(chēng)為命令按鈕;單選按鈕用于在一組互相排斥的選項(xiàng)中選擇其中一項(xiàng);復(fù)選框用于在一組選項(xiàng)中選擇其中一項(xiàng)或多項(xiàng);組框可以使一組控件關(guān)聯(lián)起來(lái)。,1. 按鍵按鈕,幾乎所有的對(duì)話框都使用簡(jiǎn)
42、單的按鍵按鈕,如OK按鈕。通過(guò)Properties對(duì)話框可以設(shè)置按鈕的不同風(fēng)格,如通過(guò)設(shè)置Default button屬性設(shè)置一個(gè)默認(rèn)按鈕。默認(rèn)按鈕是指當(dāng)對(duì)話框剛顯示時(shí)的命令執(zhí)行按鈕,此時(shí)按下Enter鍵將執(zhí)行該按鈕的命令功能。一個(gè)對(duì)話框只能有一個(gè)Default button默認(rèn)按鈕,通常情況下將OK按鈕設(shè)置為默認(rèn)按鈕。 其它屬性:Owner draw利用WM_DRAWITEM消息處理函數(shù)定制按鈕的外觀,Icon表示用圖標(biāo)代替原來(lái)的文本標(biāo)題,Bitmap表示用位圖代替原來(lái)的文本標(biāo)題,Client edge、Static edge、Modal frame用于設(shè)置按鈕的外觀。,2. 單選按鈕,單選
43、按鈕是由一個(gè)圓圈和緊隨其后的文本標(biāo)題組成,當(dāng)它被選中時(shí),圓圈中就標(biāo)上一個(gè)黑點(diǎn)。 單選按鈕設(shè)置Auto自動(dòng)屬性為默認(rèn)屬性,Auto屬性表示用戶(hù)若選中同組中的某個(gè)單選按鈕,則自動(dòng)清除其余單選按鈕的選中狀態(tài),保證一組選項(xiàng)中始終只有一項(xiàng)被選中。 一般將一組單選按鈕放在一個(gè)組框中,在一組單選按鈕中,第一個(gè)(Tab鍵順序)按鈕最重要,其ID值可用于在對(duì)話框中為控件建立關(guān)聯(lián)的成員變量。必須為同組中的第一個(gè)單選按鈕設(shè)置Group屬性,而同組的其它單選按鈕不可再設(shè)置Group屬性。,3. 復(fù)選框,復(fù)選框是由一個(gè)空心方框和緊隨其后的文本組成,當(dāng)它被選中時(shí),空心方框中就加上一個(gè)“”或“”標(biāo)記。 不同于單選按鈕,在一
44、組復(fù)選框中每次可以同時(shí)選擇多項(xiàng)。除了選中和沒(méi)選中兩種狀態(tài),復(fù)選框還有第三種狀態(tài),此時(shí)選中標(biāo)記顯示為暗色,它表示該項(xiàng)不可以由用戶(hù)選擇。通過(guò)設(shè)置Tri-state屬性得到這種三態(tài)復(fù)選框。另外,我們可以通過(guò)設(shè)置Push-like屬性使單選按鈕或復(fù)選框具有普通按鈕的外觀。,按鈕控件發(fā)送的消息:,按鈕控件只能發(fā)送通知碼為BN_CLICKED(單擊按鈕)和BN_DOUBLECLICKED(雙擊按鈕)的WM_COMMAND消息,我們經(jīng)常需要編寫(xiě)按鈕的BN_CLICKED消息處理函數(shù)。 CButton類(lèi)提供了一些成員函數(shù)實(shí)現(xiàn)對(duì)按鈕控件對(duì)象的控制和管理,如利用成員函數(shù)GetCheck()或SetCheck()獲
45、取或設(shè)置單選按鈕或復(fù)選框的當(dāng)前狀態(tài),利用成員函數(shù)GetButtonStyle()或SetButtonStyle()獲取或改變按鈕控件的風(fēng)格。,例 編寫(xiě)一個(gè)對(duì)話框應(yīng)用程序ColrButn,對(duì)話框中有兩個(gè)用于選擇顏色模式的單選按鈕和三個(gè)用于選擇具體顏色的復(fù)選框,只有在彩色模式下才能選擇三種不同顏色的組合。當(dāng)用戶(hù)單擊“應(yīng)用”按鈕,對(duì)話框右邊的按鍵按鈕將根據(jù)選擇的顏色實(shí)現(xiàn)按鈕的自畫(huà)。,6.3.7 列表框,Windows提供了幾個(gè)列表類(lèi)型控件,如列表框、組合框、列表視控件和樹(shù)視控件,其中列表框是一種最簡(jiǎn)單的列表類(lèi)型控件。 列表框(List box)是一個(gè)列出了一些文本項(xiàng)的窗口,常用來(lái)顯示類(lèi)型相同的一系列清單,如文件、字體和用戶(hù)等。與復(fù)選框類(lèi)似,用戶(hù)可以選擇其中一項(xiàng)或多項(xiàng),但同時(shí)列表框中選項(xiàng)的數(shù)目和內(nèi)容可以動(dòng)態(tài)變化,用戶(hù)可往列表框中添加或刪除某些選項(xiàng)。 列表框有單選Single、多選Multiple、擴(kuò)展多選Extended、不選None四種風(fēng)格,在控件Properties屬性對(duì)話框的Selection下拉框中設(shè)置。,當(dāng)列表框中發(fā)生了某個(gè)事件,列表框就會(huì)向其父窗口發(fā)送
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 61300-3-50:2025 FR Fibre optic interconnecting devices and passive components - Basic test and measurement procedures - Part 3-50: Examinations and measurements - Crosst
- 【正版授權(quán)】 IEC 61811-1:2015/AMD1:2025 EN Amendment 1 - Electromechanical telecom elementary relays of assessed quality - Part 1: Generic specification and blank detail specification
- 可愛(ài)風(fēng)中小學(xué)開(kāi)學(xué)安全第一課
- 制藥廠安全工程課件
- 制度安全培訓(xùn)心得課件
- 制圖基本知識(shí)課件
- 工程兵知識(shí)課件
- 燃?xì)狻㈦姎庠O(shè)備檢查管理制度模版(三篇)
- 運(yùn)輸安全生產(chǎn)監(jiān)督檢查制度
- 成本控制與優(yōu)化策略在聯(lián)合治療中應(yīng)用
- 四年級(jí)上冊(cè)語(yǔ)文1-27課必背知識(shí)
- 2025年考研馬克思主義理論馬克思主義基本原理試卷(含答案)
- 軟件項(xiàng)目開(kāi)發(fā)需求文檔范例
- 兒童靜脈血栓栓塞癥抗凝藥物治療專(zhuān)家共識(shí)(2025)解讀 2
- 2025-2026學(xué)年統(tǒng)編版小學(xué)語(yǔ)文四年級(jí)上冊(cè)期末考試測(cè)試卷及參考答案
- 湖北省武漢市經(jīng)開(kāi)區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期末道德與法治試卷(含答案)
- 注射用硝普鈉臨床應(yīng)用考核試題
- 國(guó)際貿(mào)易UCP600條款中英文對(duì)照版
- (正式版)DB15∕T 3463-2024 《雙爐連續(xù)煉銅工藝技術(shù)規(guī)范》
- 【中國(guó)信通院】2025年軟件工程智能化標(biāo)準(zhǔn)體系建設(shè)指南
- 臨床微生物標(biāo)本采集運(yùn)送及處理
評(píng)論
0/150
提交評(píng)論