




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1第第十二十二講講 對話框設計和圖形繪制對話框設計和圖形繪制電子信息學院課程組武漢大學面向對象程序設計面向對象程序設計本講主要內容本講主要內容一一、使用對話框使用對話框1 1、添加對話框資源、添加對話框資源2 2、對話框屬性編輯、對話框屬性編輯3 3、創(chuàng)建對話框類、創(chuàng)建對話框類4 4、為對話框添加控件、為對話框添加控件5 5、添加與控件關聯(lián)的成員變量、添加與控件關聯(lián)的成員變量6 6、使用對話框、使用對話框7 7、基于對話框的應用程序、基于對話框的應用程序8 8、提示信息對話框、提示信息對話框9 9、公用對話框、公用對話框1010、標準、標準控件控件二、二、MFCMFC圖形繪制圖形繪制1 1、G
2、DIGDI和和DCDC2 2、設備環(huán)境(、設備環(huán)境(Device ContextDevice Context)3 3、GDIGDI坐標系坐標系4 4、設備坐標系、設備坐標系5 5、OnPaint OnPaint 與與OnDrawOnDraw的區(qū)別和聯(lián)系的區(qū)別和聯(lián)系6 6、設置顏色、設置顏色7 7、使用畫筆、使用畫筆 CPenCPen8 8、使用畫刷、使用畫刷 CBrushCBrush9 9、使用系統(tǒng)定義的畫筆和畫刷(堆對象)、使用系統(tǒng)定義的畫筆和畫刷(堆對象)1010、繪制基本圖形、繪制基本圖形1111、文本輸出與字體、文本輸出與字體1212、位圖、圖標和光標、位圖、圖標和光標 3一、一、使用
3、使用對話框對話框 對話框是Windows應用程序中一種常用的資源 主要功能是輸出信息和接收用戶的輸入數(shù)據(jù)。 對話框和控件 控件是嵌入在對話框中的一個特殊的小窗口,用于完成不同的輸入、輸出功能。 對話框依靠控件與用戶進行信息交互 顯示提示信息:例如程序啟動時顯示版權、顯示進度信息 接收用戶輸入的數(shù)據(jù)l在MFC中,對話框的功能被封裝成CDialog類,CDialog類是CWnd類的派生類。 CDialog類的派生關系如下所示:CObject CCmdTarget CWnd CDialogl我們在程序中創(chuàng)建的對話框類是CDialog類的派生類 對話框可以作為一個程序的主窗口:基于對話框的應用程序對話
4、框可以通過菜單命令或工具欄按鈕打開 對話框創(chuàng)建和使用: 首先創(chuàng)建對話框資源:指定對話框本身的屬性(如大小、位置、風格、類型等),添加控件并設置控件屬性; 再創(chuàng)建一個基于該對話框資源的對話框類:規(guī)定對話框和對話框中每個控件的行為(編寫消息響應函數(shù)) 包含對話框類頭文件,聲明對話框類對象并使用1、添加對話框資源 在項目工作區(qū)鼠標右擊資源項Dialog,從彈出式菜單中選擇“Insert Dialog”命令項。 在對話框資源的非控件區(qū)域點擊右鍵在彈出的快捷菜單中選擇Properties,在彈出的信息欄中修改對話框屬性2、對話框屬性編輯3、創(chuàng)建對話框類: 在對話框資源的非控件區(qū)域雙擊鼠標,或者點擊右鍵在
5、彈出的快捷菜單中選擇Add Class,將彈出類添加向導對話框 在類向導中輸入類名,點擊Finish按鈕完成類的添加對話框資源ID3、創(chuàng)建對話框類: 在對話框資源的非控件區(qū)域雙擊鼠標,或者點擊右鍵在彈出的快捷菜單中選擇Add Class,將彈出類添加向導對話框 通過對話框類的成員函數(shù)可對對話框進行管理對話框的常用成員函數(shù)CDialog:CDialog() 通過調用派生類構造函數(shù),根據(jù)對話框資源模板定義一個對話框。CDialog:DoModal() 激活模態(tài)對話框,顯示對話框窗口。CDialog:Create() 根據(jù)對話框資源模板創(chuàng)建非模態(tài)對話框窗口。如果對話框不是Visible屬性,還需通過
6、調用CWnd:ShowWindow()函數(shù)顯示非模態(tài)對話框窗口。CDialog:OnOk() 單擊OK按鈕時調用該函數(shù),接收對話框輸入數(shù)據(jù),關閉對話框。CDialog:OnCancel() 單擊Cancel按鈕或按Esc鍵時調用該函數(shù),不接收對話框輸入數(shù)據(jù),關閉對話框。CDialog:OnInitDialog() WM_INITDIALOG消息處理函數(shù),在調用DoModal或Create函數(shù)時系統(tǒng)發(fā)送WM_INITDIALOG消息,在顯示對話框前調用該函數(shù)進行初始化。CDialog:EndDialog():用于關閉模態(tài)對話框窗口。CWnd:ShowWindow() 顯示或隱藏對話框窗口CWnd
7、:DestroyWindow() 關閉并銷毀非模態(tài)對話框CWnd:UpdateData() 通過調用DoDataExchange()設置或獲取對話框控件的數(shù)據(jù)CWnd:DoDataExchange():被UpdateData()調用以實現(xiàn)對話框數(shù)據(jù)交換,不能直接調用。CWnd:GetWindowText() 獲取對話框窗口的標題CWnd:SetWindowText() 修改對話框窗口的標題CWnd:GetDlgItemText() 獲取對話框中控件的文本內容CWnd:SetDlgItemText() 設置對話框中控件的文本內容CWnd:GetDlgItem() 獲取控件或子窗口的指針CWnd:
8、MoveWindow() 用于移動對話框窗口CWnd:EnableWindow() 使窗口處于禁用或可用狀態(tài)4、為對話框添加控件: 通過Toolbox信息欄為對話框添加控件 在控件上右鍵點擊,在彈出快捷菜單中選擇Add Variable5、添加與控件關聯(lián)的成員變量注意:注意:只有為對話框資源添加了對話框類之后,才能為控件添加關聯(lián)的成員變量 在控件上右鍵點擊,在彈出快捷菜單中選擇Add Variable5、添加與控件關聯(lián)的成員變量成員變量種類成員變量數(shù)據(jù)類型和名稱 成員變量種類Control:關聯(lián)的成員變量是一個MFC控件類對象,可以通過該對象訪問控件類的成員變量和調用控件類的成員函數(shù),實現(xiàn)對控
9、件行為的控制和管理;Value:為該控件的某項屬性關聯(lián)一個成員變量,這意味著程序關心的是控件中的值,而不是控件本身。這時,需要指定成員變量數(shù)據(jù)類型(一般的C+數(shù)據(jù)類型或Visual C+自定義的數(shù)據(jù)類型)5、添加與控件關聯(lián)的成員變量注意:注意:l可 以 為 一 個 控 件 同 時 定 義 一 個可 以 為 一 個 控 件 同 時 定 義 一 個ControlControl類別的變量和一個類別的變量和一個ValueValue類別的類別的變量變量l這些這些變量都是作為對話框派生類的成變量都是作為對話框派生類的成員員變量變量l為了為了在程序其它地方能夠直接訪問添在程序其它地方能夠直接訪問添加的成員變
10、量,它們都被聲明為加的成員變量,它們都被聲明為publicpublic屬性。屬性。常用的MFC控件和控件類 MFC類類控控 件件CStatic靜態(tài)文本、圖片控件CEdit編輯框CButton按鈕、復選框、單選按鈕、組框CComboBox組合框CListBox列表框CScrollBar滾動條CSpinButtonCtrl旋轉按鈕CProgressCtrl進度條CSliderCtrl滑塊CListCtrl列表視控件常用的MFC控件類 MFC類類控控 件件CTreeCtrl樹視控件CTabCtrl標簽CAnimateCtrl動畫控件CRichEditCtrl復合編輯框CDateTimeCtrl日期時
11、間選取器CMonthCalCtrl日歷CComboBoxEx擴展組合框CStatusBarCtrl狀態(tài)條控件CToolBarCtrl工具條控件CImageList圖像列表對于控件Value類型的成員變量,可以通過對話框數(shù)據(jù)交換DDX和驗證DDV實現(xiàn)數(shù)據(jù)輸入輸出對話框數(shù)據(jù)驗證DDV(Dialog Data Validation):對用戶輸入數(shù)據(jù)的有效性進行驗證對話框數(shù)據(jù)交換DDX(Dialog Data Exchange):實現(xiàn)控件與成員變量間的數(shù)據(jù)交換DDV使用方法:把對話框中一個編輯框和UINT型的成員變量m_nInput時指定它的最小值和最大值分別為0和100, 則 C l a s s W
12、 i z a r d 類 向 導 將 在 成 員 函 數(shù)DoDataExchange()中添加以下DDV函數(shù)的調用語句:DDV_MinMaxUInt(pDX, m_nInput, 0, 100); 程序運行時,如果用戶的輸入數(shù)據(jù)超出0100的范圍,DDV將顯示一個提示信息對話框,提示用戶有效的輸入范圍。DDX使用方法:調用UpdateData(TRUE)時,MFC通過調用DDX函數(shù)將數(shù)據(jù)從控件傳遞到關聯(lián)的成員變量;調用UpdateData(FALSE)時,MFC通過調用DDX函數(shù)將數(shù)據(jù)從成員變量傳遞到關聯(lián)的的控件。注意: 創(chuàng)建并顯示對話框時,將自動調用UpdateData(FALSE),將數(shù)據(jù)
13、從成員變量傳遞到關聯(lián)的控件,從而顯示在控件中。 單擊OK按鈕將調用CDialog:OnOk()函數(shù),在OnOK()中調用了UpdateData(TRUE),將數(shù)據(jù)從控件傳遞到關聯(lián)的成員變量。 D D X 就 如 同 一 條 雙 向 通 道 , 而 方 向 控 制 開 關 就 是UpdateData()函數(shù)中的BOOL類型參數(shù)是TRUE還是FALSE。6、使用對話框 用對話框類聲明對象(注意:包含對話框類頭文件) 調用對話框類的DoModal()成員函數(shù)創(chuàng)建并顯示模態(tài)對話框 無模態(tài)對話框的使用請參考相關資料函數(shù)函數(shù)OnOK()、 OnCancel()與與DoModal()的關系:的關系: 對話框
14、中一般都有ID為IDOK和IDCancel的按鈕 單擊ID為IDOK的按鈕時調用CDialog:OnOK()函數(shù) 單擊ID為IDCancel的按鈕時調用CDialog:OnCancel()函數(shù)。 OnOK()函數(shù)和OnCancal()函數(shù)都將結束DoModal()函數(shù)調用,但令DoModal()返回不同的值。 OnOK()函數(shù)令DoModal()返回IDOK, OnCancel()函數(shù)令DoModal()返回IDCANCAL。 用戶可以根據(jù)DoModal()的返回值做出不同的選擇。如: if (myDlg.DoModal() = = IDOK ) 對話框的初始化:對話框的初始化: 可以在三個不
15、同的階段所調用的函數(shù)中進行: (1)對話框類構造函數(shù); (2)WM_CREATE消息處理函數(shù); (3)WM_INITDIALOG消息處理函數(shù)。 建議在消息WM_INITDIALOG的消息處理函數(shù)OnInitDialog()中進行初始化 在收到WM_INIT_ DIALOG消息時,對話框的框架已創(chuàng)建,對話框中的每個控件也已建立起來,但它們還沒有在屏幕上顯示 此時自然可以設置或優(yōu)化對話框中各個控件的外觀、尺寸、位置以及其它屬性 函數(shù)OnInitDialog()將被成員函數(shù)DoModal()調用。例例 編寫編寫SDI程序,通過菜單或工具欄彈出一個對話程序,通過菜單或工具欄彈出一個對話框設置圓的半徑,
16、然后在客戶區(qū)完成圓形的繪框設置圓的半徑,然后在客戶區(qū)完成圓形的繪制。制。 添加對話框資源 為對話框資源添加控件。添加一個靜態(tài)文本控件,其Caption為“請輸入半徑”。添加一個Edit Box編輯框控件,其ID標識為IDC_EDIT_ RADIUS,該控件用于接收用戶的輸入數(shù)據(jù)。 添加與控件關聯(lián)的成員變量m_nRadius,其數(shù)據(jù)類型為UINT。使用對話框數(shù)據(jù)驗證DDV功能:m_nRadius的最小值5和最大值250。 為對話框資源添加對話類:CRadiusDialog 為了在視圖對象中接收并存儲對話框編輯控件的值,在視圖類CMysdiView中手工定義一個UINT類型的成員變量m_nCVie
17、wRadius。 利用菜單編輯器在“編輯”菜單增加一個菜單項“輸入半徑(I)”,其ID標識為ID_EDIT_INPUTRADIUS,Caption為“輸入半徑(&I).”。啟動ClassWzard類向導,在視圖類中為ID_EDIT_INPUTRADIUS菜單項添加COMMAND消息處理函數(shù),在函數(shù)中添加代碼。 void CMysdiView:OnEditInputradius() / TODO: Add your command handler code here CRadiusDialog dlg; / 定義一個對話框對象 dlg.m_nRadius=100;/ 設置編輯框顯示的初始
18、值 if (dlg.DoModal()=IDOK) / 顯示對話框 m_nCViewRadius=dlg.m_nRadius; / 接收并存儲編輯框數(shù)據(jù) Invalidate(); / 刷新視圖 3在視圖類構造函數(shù)CMysdiView:CMysdiView()中將成員變 量 m _ n C V i e w R a d i u s 初 始 化 為 0 。 在 函 數(shù)CMysdiView:OnDraw()中添加如下畫圓的語句:pDC-Ellipse(0, 0, 2*m_nCViewRadius, 2*m_nCViewRadius); 在視圖類實現(xiàn)文件MysdiView.cpp的開始位置加入包含對話
19、框類頭文件的語句: #include RadiusDialog.h”7、基于對話框的應用程序 可以直接利用MFC AppWizard向導創(chuàng)建一個基于對話框的應用程序; 向導將自動完成: 添加對話框資源 為對話框資源添加對話框類,用對話框類聲明對象 通過對話框類的DoModal()創(chuàng)建并顯示對話框,該對話框即為程序的主窗口 程序編寫:添加控件,添加成員變量,添加消息響應函數(shù)1執(zhí)行File|New|Project命令出現(xiàn)New Project對話框,選擇MFC|MFC Application項,輸入程序名MyDialog,單擊OK按鈕。在隨后出現(xiàn)的Application type對話框窗口中選擇D
20、ialog Based選項,單擊Finish按鈕就創(chuàng)建了應用程序項目,并在Developer Studio中打開了對話框編輯器和控件工具欄。2去掉對話框中標題為“TODO: 在這里設置對話控制”的 靜 態(tài) 文 本 控 件 , 調 整 對 話 框 大 小 , 在 成 員 函 數(shù)CMyDialogDlg:OnPaint()中添加代碼。 void CMyDialogDlg:OnPaint() . . . . . . else CPaintDC dc(this); dc.SetBkMode(TRANSPARENT); dc.TextOut(20, 50, 這是一個對話框應用程序!); CDialog:
21、OnPaint(); 8、提示信息對話框 提示信息對話框也稱消息對話框,用來顯示有關的提示信息。提示信息對話框是一種最簡單的對話框,不需要用戶自己創(chuàng)建它就可以直接使用,Visual C+提供了相應的函數(shù)實現(xiàn)這樣的功能: int AfxMessageBox(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 lpCa
22、ption=NULL, UINT nType=MB_OK); MFC全局函數(shù),可以在程序中任何地方使用API函數(shù),可以在程序中任何地方使用CWnd類的成員函數(shù),只能用于控件、對話框、窗口等一些窗口類的成員函數(shù)中例例:在程序中彈在程序中彈出如下圖所示的出如下圖所示的警告提示信息對話警告提示信息對話框框并根據(jù)用戶選擇進行并根據(jù)用戶選擇進行相應的處理:相應的處理:編寫的代碼如下: int nChoice=MessageBox(文件復制失??!, 錯誤, MB_ICONWARNING | MB_ABORTRETRYIGNORE ); switch(nChoice) case IDABORT: / 用戶按
23、下終止按鈕. . . . . . caseIDRETRY: / 用戶按下重試按鈕. . . . . . case IDIGNORE: / 用戶按下忽略按鈕. . . . . . Windows將一些常用的對話框集成到操作系統(tǒng)中,作為Windows公用對話框庫Commdlg.dll的一部分 用戶在程序中可以直接使用這些公用對話框,不必再創(chuàng)建對話框資源和對話框類,減少了大量的編程工作。 用戶還可以定制公用對話框的外觀和性能。 為了在MFC應用程序中使用公用對話框,MFC提供了封裝這些公用對話框的類。這些公用對話框類都是從CCommonDialog類派生而來,而CCommonDialog類又是CDi
24、alog類的派生類。9、公用對話框公用對話框公用對話框 MFC公用對話框類 CColorDialog CFileDialog CFindReplaceDialog CFontDialog CPagesSetupDialog CPrintDialog COleDialog說說 明明顏色設定對話框,選擇不同的顏色文件存取對話框,打開或保存文件查找和替換對話框,查找和替換文本串字體設定對話框,選擇不同的字體。頁面設置對話框,設置頁碼、頁眉等標準的打印對話框,用于打印和打印設置該類及其派生類用于生成OLE對話框10、標準控件 Windows提供的控件分為兩類:標準控件和公共控件。 標準控件:靜態(tài)控件、
25、編輯框、按鈕、列表框、組合框和滾動條等。利用標準控件可滿足大部分用戶界面程序設計的要求。 公共控件:滑塊、進度條、列表視控件、樹視控件和標簽控件等,利用公共控件實現(xiàn)應用程序用戶界面風格的多樣性。 用戶對控件操作時Windows產生控件消息并發(fā)送給父窗口(如對話框)。 標準控件發(fā)送WM_COMMAND控件通知消息,公共控件一 般 發(fā) 送 W M _ N O T I F Y 控 件 通 知 消 息 , 或WM_COMMAND消息。 通過WM_COMMAND消息參數(shù)標識發(fā)出消息的控件和具體的事件,消息參數(shù)中包含了控件的ID標識和通知碼(區(qū)分消息種類,如BN_CLICKED單擊按鈕事件) 程序員不必關
26、心消息具體的發(fā)送和接收,只需為控件消息添加響應函數(shù),然后在響應函數(shù)中編寫具體的處理代碼。 控件的組織 添加或刪除控件 設置控件屬性 調整控件的大小 同時選取多個控件:鼠標框選,shift或ctrl+鼠標點選 復制控件:復制粘貼,ctrl+拖動控件 編排控件:使用主菜單format下的各個子菜單 測試對話框和控件的方法:按下Ctrl+T組合鍵就能測試對話框運行時的界面效果。 控件的公共屬性項項 目目說說 明明 ID控件的標識,對話框編輯器會為每一個加入的控件分配一個默認的ID Caption控件的標題,作為程序執(zhí)行時在控件位置上顯示的文本 Visible指明顯示對話框時該控件是否可見 Group
27、用于指定一個控件組中的第一個控件 HelpID表示為該控件建立一個上下文相關的幫助標識ID Disabled指定控件初始化時是否禁用 Tab Stop表示對話框運行后該控件可以通過使用Tab鍵來獲取焦點1)靜態(tài)控件 靜態(tài)控件(Static control)是用來顯示一個文本串或圖形信息的控件,它包括靜態(tài)文本控件、圖片控件和組框。 靜態(tài)文本控件用來顯示一般不需要變化的文本; 圖片控件用來顯示邊框、矩形、圖標或位圖等圖形; 組框用來顯示一個文本標題和一個矩形邊框,通常用來將一組控件組織在一起。 管理靜態(tài)文本控件和圖片控件的MFC類是CStatic類,而管理組框的MFC類是CButton類。 所有靜
28、態(tài)控件默認的ID標識都為IDC_STATIC,如果要為一個靜態(tài)控件添加成員變量或消息處理函數(shù),必須重新為它指定一個唯一的ID標識。 編程時用的最多是靜態(tài)文本控件,它被用來作為其它控件的標題。每一個靜態(tài)文本控件最多可以顯示255個字符,可以使用“n”換行符。2)編輯框編輯框(Edit box)又稱文本框或編輯控件,它一般與靜態(tài)文本控件一起使用,用于數(shù)據(jù)的輸入和輸出。編輯框提供了完整的鍵盤輸入和編輯功能,可以輸入各種文本、數(shù)字或者口令。 編輯框為用戶提供了良好的輸入、輸出功能,能夠將鍵盤輸入的字符串轉化為要求的數(shù)據(jù)類型(DDX),并驗證它是否符合輸入要求(DDV)。編輯框常用屬性: Multili
29、ne設置單行或多行編輯Align text設置文本對齊方式Number表示只能輸入數(shù)字Password表示鍵入編輯框的字符都將顯示為“*”Uppercase或Lowercase表示鍵入編輯框的字符全部轉換成大寫或小寫形式Read-Only表示只能輸出數(shù)據(jù)。當編輯框的文本被修改,會向父窗口發(fā)送消息,可以利用ClassWizard在對話框類中添加消息處理函數(shù)。編輯框發(fā)送消息有:EN_CHANGEEN_KILLFOCUSEN_SETFOCUSEN_MAXTEXTEN_UPDATE例 編寫一個SDI應用程序Password,程序啟動后首先彈出一個如圖所示的用戶身份確認對話框,當用戶鍵入正確的口令后才能
30、進入程序的主界面。 3)按鈕按鈕(Button)包括按鍵按鈕、單選按鈕和復選框等3種類型,由MFC的CButton類封裝,按鍵按鈕用來執(zhí)行某個命令,也被稱為命令按鈕;單選按鈕用于在一組互相排斥的選項中選擇其中一項;復選框用于在一組選項中選擇其中一項或多項;按鍵按鈕 幾乎所有的對話框都使用簡單的按鍵按鈕,如OK按鈕。通過設置Default button屬性可將按鈕設置成默認按鈕。對話框顯示時按下Enter鍵將執(zhí)行該按鈕的命令功能。一個對話框只能有一個Default button默認按鈕,通常情況下將OK按鈕設置為默認按鈕。其它屬性:Owner draw利用WM_DRAWITEM消息處理函數(shù)定制按
31、鈕的外觀,Icon表示用圖標代替原來的文本標題,Bitmap表示用位圖代替原來的文本標題,Client edge、Static edge、Modal frame用于設置按鈕的外觀。 單選按鈕 一般將一組單選按鈕放在一個組框中 在一組單選按鈕中,第一個(Tab鍵順序)按鈕最重要,其ID值可用于在對話框中為控件建立關聯(lián)的成員變量 必須為同組中的第一個單選按鈕設置Group屬性,而同組的其它單選按鈕不可再設置Group屬性。 復選框不同于單選按鈕,在一組復選框中每次可以同時選擇多項除了選中和沒選中兩種狀態(tài),復選框還有第三種狀態(tài),此時選中標記顯示為暗色,它表示該項不可以由用戶選擇通過設置Tri-sta
32、te屬性得到這種三態(tài)復選框。另外,我們可以通過設置Push-like屬性使單選按鈕或復選框具有普通按鈕的外觀。 按鈕控件發(fā)送的消息: 按鈕控件只能發(fā)送通知碼為BN_CLICKED(單擊按鈕)和 B N _ D O U B L E C L I C K E D ( 雙 擊 按 鈕 ) 的WM_COMMAND消息,我們經常需要編寫按鈕的BN_CLICKED消息處理函數(shù)。CButton類提供了一些成員函數(shù)實現(xiàn)對按鈕控件對象的控制和管理,如利用成員函數(shù)GetCheck()或SetCheck()獲取或設置單選按鈕或復選框的當前狀態(tài)。 例 編寫一個對話框應用程序ColrButn,對話框中有兩個用于選擇顏色模
33、式的單選按鈕和三個用于選擇具體顏色的復選框,只有在彩色模式下才能選擇三種不同顏色的組合。當用戶單擊“應用”按鈕,在對話框右側繪制指定顏色的矩形。 4)列表框 Windows提供了幾個列表類型控件,如列表框、組合框、列表視控件和樹視控件,其中列表框是一種最簡單的列表類型控件。 列表框(List box)是一個列出了一些文本項的窗口,常用來顯示類型相同的一系列清單,如文件、字體和用戶等。與復選框類似,用戶可以選擇其中一項或多項,但同時列表框中選項的數(shù)目和內容可以動態(tài)變化,用戶可往列表框中添加或刪除某些選項。 列表框有單選Single、多選Multiple、擴展多選Extended、不選None四種
34、風格,通過控件的Selection屬性設置。 當列表框中發(fā)生了某個事件,列表框就會向其父窗口發(fā)送一條通知消息。列表框常用的通知消息有: 用戶雙擊列表框中的列表項時發(fā)送消息LBN_DBLCLK 列表框失去鍵盤輸入焦點時發(fā)送消息LBN_KILLFOCUS 列表框獲得鍵盤輸入焦點時發(fā)送消息LBN_SETFOCUS 列表框中的當前選擇項發(fā)生改變時發(fā)送消息LBN_SELCHANGE。 封裝列表框控件的MFC類是CListBox類,在程序中可以通過添加control類型的成員變量,并調用CListBox類成員函數(shù)來實現(xiàn)列表項的添加、刪除、修改和獲取等操作。例 編寫一個對話框應用程ExmpList,對話框中
35、有一個列表框,當用戶單擊列表框中的一個列表項(一個國家)時,在四個編輯框分別顯示指定國家的名稱、首都、面積和人口。單擊“添加”按鈕時,“國家”編輯框中的文本將被添加到列表框中;單擊“刪除”按鈕時,當前的列表項將被刪除。5)組合框 組合框(Combo box)吸收了列表框和編輯框的優(yōu)點 可以顯示列表項供用戶進行選擇, 允許用戶輸入新的列表項。 實質上,組合框是多個控件的組合,包括編輯框、列表框和按鈕。 通過設置組合框的Type屬性可以使組合框有簡單組合框(Simple)、下拉組合框(Dropdown)和下拉列表框(Drop List)三種形式組合框控件的Data屬性: 與編輯框或列表框相比,組合
36、框有一個新的功能屬性,可以通過組合框控件的Data屬性添加初始的列表項,各個列表項用分號隔開。也可以為組合框關聯(lián)control類型的成員變量,并在在對話框類的初始化成員函數(shù)OnInitDialog()中編寫代碼添加列表項。 組合框發(fā)送的消息 : 關閉組合框消息CBN_CLOSEUP打開列表框消息CBN_DROPDOWN雙擊列表項消息CBN_DBLCLK選擇一個列表項并按下Enter鍵或單擊下拉按鈕隱藏列表框時發(fā)送消息CBN_SELENDOK當前選項被取消時(如重新選擇其它控件或關閉對話框)發(fā)送消息CBN_SELENDCANCEL當前選項改變消息CBN_SELCHANGE當組合框的編輯框中的文本
37、被修改且新的文本顯示之后發(fā)送消息CBN_EDITCHANGE當編輯框中的文本被修改且新的文本顯示之前發(fā)送消息CBN_EDITUPDATE組合框失去鍵盤輸入焦點消息CBN_KILLFOCUS組合框獲得鍵盤輸入焦點消息CBN_SETFOCUS。 例 編寫一個單文檔應用程序ExmpCombo,執(zhí)行“測試控件|組合框”菜單命令時打開一個對話框,初始的對話框有一個用于顯示標準控件名的組合框,當用戶在組合框下拉的列表框中選擇一個控件時,該控件將顯示在對話框的右部。當用戶在組合框的編輯框中輸入一個列表項并單擊“應用”按鈕,一個指定標題的靜態(tài)文本控件將出現(xiàn)在對話框的右部。 二、二、MFCMFC圖形繪制圖形繪制
38、紙筆畫刷顏料 畫畫需要什么?顯示器打印機投影儀彩色筆CPen彩色畫刷CBrush輸出設備圖形設備接口(Graphics Device Interface,GDI) 不同圖形設備的操作不一樣(驅動不一樣),同類圖形設備、不用品牌的操作也不一樣; 程序設計者難道要針對每種情況編寫程序? 如何使繪圖程序適用于各種圖形設備?GDIGDI1、GDI GDI通過不同設備提供的驅動程序將繪圖語句轉換為對應的繪圖指令 避免了繪圖語句直接對硬件進行操作,從而實現(xiàn)設備無關性應用程序設備環(huán)境DCGDI設備驅動程序物理設備顯示器打印機2、設備環(huán)境(Device Context)應用程序不直接面向顯示器等物理設備,而是
39、面向虛擬邏輯設備:設備環(huán)境 (DC:Device Context)。設備環(huán)境也稱設備描述表或設備上下文Windows管理的一個數(shù)據(jù)結構保存了繪圖操作中一些需要共同設置的信息,如當前的畫筆、畫刷、字體和位圖等圖形對象及其屬性,以及顏色和背景等影響圖形輸出的繪圖模式。形象地說:設備環(huán)境提供畫布和繪畫工具,應用程序可以使用這些工具在畫布上面繪制點、線、圓和文本。MFC編程時有哪些設備環(huán)境? CDC:其它設備環(huán)境類的基類,可以訪問設備屬性和設置繪圖屬性。CDC類對GDI的所有繪圖函數(shù)進行了封裝。 CPaintDC:是OnPaint()函數(shù)使用的設備環(huán)境類。如果添加WM_PAINT消息處理函數(shù)OnPai
40、nt(),就需要使用CPaintDC類來定義一個設備環(huán)境對象。 CClientDC:客戶區(qū)設備環(huán)境。在客戶區(qū)實時繪圖時需要定義的客戶區(qū)設備環(huán)境。 CWindowDC:代表了整個程序窗口設備環(huán)境,可以在整個窗口區(qū)域繪圖(包含標題欄,工具條,狀態(tài)欄等)。各種的區(qū)別使用的坐標系是否可被打印一般在哪里使用繼承關系邏輯坐標系OnDraw設備環(huán)境基類邏輯坐標系WM_PAINTOnPaintCDC的派生類設備坐標系其它函數(shù)CDC的派生類設備坐標系所有函數(shù)CDC的派生類CWindowDCCDCCPaintDCCClientDC怎樣獲取這些設備環(huán)境? CDC主要用于OnDraw函數(shù)里; CPaintDC主要用于
41、WM_PAINT消息的響應函數(shù)OnPaint里; CClientDC用于其它函數(shù)里; CWindowDC;SDK程序中怎樣獲取這些設備環(huán)境? WM_PAINT消息處理函數(shù)中通過調用API函數(shù)BeginPaint()獲取設備環(huán)境,在消息處理函數(shù)返回前調用API函數(shù)EndPaint()釋放設備環(huán)境。 在其他函數(shù)中通過調用API函數(shù)GetDC()獲取設備環(huán)境,調用API函數(shù)ReleaseDC()釋放設備環(huán)境。 hdc = BeginPaint(hWnd, &ps); /WM_PAINT RECT rt;GetClientRect(hWnd, &rt);DrawText(hdc, sz
42、Hello, strlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps); hdc = GetDC(hWnd); /WM_LBUTTONDOWNRECT rt;GetClientRect(hWnd, &rt);DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); ReleaseDC(hWnd, hdc);3、GDI坐標系 Windows坐標系分為坐標系分為邏輯坐標系邏輯坐標系和和設備坐標系設備坐標系兩種,兩種,GDI支持這兩種坐標系。一般而言,支持這兩種坐
43、標系。一般而言,GDI的文本和圖形輸出函的文本和圖形輸出函數(shù)使用邏輯坐標,而在客戶區(qū)移動或按下鼠標的鼠標位置數(shù)使用邏輯坐標,而在客戶區(qū)移動或按下鼠標的鼠標位置是采用設備坐標。是采用設備坐標。 邏輯坐標系是面向邏輯坐標系是面向DC的坐標系的坐標系,這種坐標不考慮具體的設,這種坐標不考慮具體的設備類型,在繪圖時,備類型,在繪圖時,Windows會根據(jù)當前設置的映射模式會根據(jù)當前設置的映射模式將邏輯坐標轉換為設備坐標。將邏輯坐標轉換為設備坐標。 設備坐標系是面向物理設備的坐標系設備坐標系是面向物理設備的坐標系,這種坐標以像素或,這種坐標以像素或設備所能表示的最小長度單位為單位,設備所能表示的最小長度
44、單位為單位,X軸方向向右,軸方向向右,Y軸軸方向向下。設備坐標系的原點位置方向向下。設備坐標系的原點位置(0, 0)不限定在設備顯示不限定在設備顯示區(qū)域的左上角。區(qū)域的左上角。4、設備坐標系 設備坐標系分為屏幕坐標系、窗口坐標系和客戶區(qū)坐標系設備坐標系分為屏幕坐標系、窗口坐標系和客戶區(qū)坐標系三種相互獨立的坐標系三種相互獨立的坐標系。 坐標之間的相互轉換 MFC提供了兩個函數(shù)CWnd:ScreenToClient()和CWnd:ClientToScreen()用于屏幕坐標與客戶區(qū)坐標的相互轉換。 MFC提供了兩個函數(shù)CDC:DPtoLP()和CDC: LPtoDP()用于設備坐標與邏輯坐標之間的
45、相互轉換。映射模式映射模式邏輯單位坐標系設定MM_TEXT一個像素X軸正方向朝右,Y軸正方向朝下MM_LOMETRIC0.1毫米X軸正方向朝右,Y軸正方向朝上MM_HIMETRIC0.01毫米X軸正方向朝右,Y軸正方向朝上MM_LOENGLISH0.01英寸X軸正方向朝右,Y軸正方向朝上MM_HIENGLISH0.001英寸X軸正方向朝右,Y軸正方向朝上MM_TWIPS1/1440英寸X軸正方向朝右,Y軸正方向朝上MM_ISOTROPIC系統(tǒng)確定X、Y軸可任意調節(jié),X、Y軸比例為1:1MM_ANISOTROPIC系統(tǒng)確定X、Y軸可任意調節(jié),X、Y軸比例任意坐標原點 通過調用函數(shù)CDC:SetW
46、indowOrg()設置設備環(huán)境的窗口原點的坐標,調用CDC:SetViewportOrg()重新設置設備的視口原點的坐標。 窗口原點是指邏輯窗口坐標系的原點在視口(設備)坐標系中的位置,視口原點是指設備實際輸出區(qū)域的原點。 除了映射模式,窗口和視口也是決定一個點的邏輯坐標如何轉換為設備坐標的一個因素。一個點的邏輯坐標按照如下式子轉換為設備坐標: 設備(視口)坐標 = 邏輯坐標 窗口原點坐標 + 視口原點坐標例 分別在OnDraw()函數(shù)中添加如下代碼,設置不同的窗口原點和視口原點,結果有什么不同。 (1) pDC-SetMapMode(MM_TEXT); pDC-Rectangle(CRec
47、t(50, 50, 100, 100);(2) pDC-SetMapMode(MM_TEXT); pDC-SetWindowOrg(50, 50); /屏幕左上角點坐標pDC-Rectangle(CRect(50, 50, 100, 100);(3) pDC-SetMapMode(MM_TEXT); pDC-SetViewportOrg(50,50); /輸出的坐標原點pDC-Rectangle(CRect(50, 50, 100, 100);(4) pDC-SetMapMode(MM_TEXT); pDC-SetViewportOrg(50,50);pDC-SetWindowOrg(50,
48、50);pDC-Rectangle(CRect(50, 50, 100, 100);5、OnPaint 與OnDraw的區(qū)別和聯(lián)系 簡單的說OnPaint只是負責窗口的重繪,而OnDraw是所有CDC的重繪(例如:打印機) 都是邏輯坐標繪圖。(CClientDC為設備坐標繪圖) OnDraw是一個純虛函數(shù),定義為virtual void OnDraw( CDC* pDC ) = 0;而而OnPaint是一個消息響應函數(shù),它響應了WM_PANIT消息,也是是窗口重繪消息 獲得DC后,就可以進行各種圖形操作!6、設置顏色(1)Windows用COLORREF類型的數(shù)據(jù)存放顏色,它是一個32位整數(shù)。
49、0 x000000000 x00FFFFFF共16777216種顏色。顏色由紅、綠、藍三種基本顏色組成,COLORREF類型數(shù)據(jù)的低位字節(jié)存放紅色強度值,第2個字節(jié)存放綠色強度值,第3個字節(jié)存放藍色強度值,高位字節(jié)為0(2)Windows提供了RGB宏用于設置顏色: RGB(byRed, byGreen, byBlue)其中byRed、byGreen和byBlue分別表示紅、綠、藍分量值。0 00 000 0 00 00 000 0 01 11 111 1 10 00 000 0 0標準彩色的RGB值顏色RGB分量值顏色RGB分量值淺紅255,0,0深紅128,0,0淺綠0,255,0深綠0,
50、128,0淺藍0,0,255深藍0,0,128淺黃255,255,0深黃128,128,0淺青0,255,255深青0,128,128紫色255,0,255灰色192,192,192白色255,255,255黑色0,0,0定義顏色變量/定義綠色COLORREF rgbBkClr=RGB(0,255,0); /上句等同于/COLORREF rgbBkClr=65280; 7、使用畫筆 CPen 3 還原畫筆2 選擇畫筆1 創(chuàng)建畫筆畫圖開始CPen的構造函數(shù)CPen的CreatePen函數(shù)設備環(huán)境類的SelectObject函數(shù)設備環(huán)境類的SelectObject函數(shù)CPen的DeleteObje
51、ct 函數(shù)畫圖結束畫圖1)創(chuàng)建畫筆 方法1:利用構造函數(shù)創(chuàng)建CPen pen(PS_SOLID, 4, RGB(0, 0, 255); 方法2:利用CreatePen函數(shù)創(chuàng)建CPen pen; pen.CreatePen(PS_DASH, 1, RGB(255,0,0);注意:以這種方式創(chuàng)建的畫筆,如果以后不再使用,需要進行銷毀。銷毀方式是調用DeleteObject函數(shù)。pen.DeleteObject();畫筆寬度只有在實線時才有效!其它樣式的線只能是1個像素寬!84畫筆樣式樣 式說 明樣 式說 明PS_SOLID實線PS_DASHDOTDOT雙點劃線PS_DOT點線PS_NULL空的邊框
52、PS_DASH虛線PS_INSIDEFRAME邊框實線PS_DASHDOT點劃線 2)選擇畫筆 使用設備環(huán)境類的成員函數(shù)SelectObject來選擇畫筆作為當前使用的畫筆。返回值為舊畫筆的指針。CPen penNew(PS_SOLID, 4, RGB(255,0,0);CPen* pPenOld=pDC-SelectObject(&penNew);3)還原畫筆 仍然使用SelectObject函數(shù)pDC-SelectObject(pPenOld);使用畫筆的例子/-/畫圖開始/創(chuàng)建畫筆CPen penRed;penRed.CreatePen(PS_SOLID, 5, RGB(255,
53、 0, 0);/選擇新畫筆,保存舊畫筆CPen *pOldPen = pDC-SelectObject(&penRed);/畫圖:畫一條直線pDC-MoveTo(100, 50);pDC-LineTo(300, 150);/還原畫筆pDC-SelectObject(pOldPen);/銷毀畫筆penRed.DeleteObject();/畫圖結束/-備注 系統(tǒng)默認的畫筆是實線、實線、1像素寬、黑色像素寬、黑色。 CDC函數(shù)MoveTo(int x, int y) /直線的起點直線的起點LineTo(int x, int y)/直線的終點直線的終點以當前的畫筆畫一條直線。8、使用畫刷 C
54、Brush畫刷能用來填充封閉的區(qū)域3 還原畫刷2 選擇畫刷1 創(chuàng)建畫刷畫圖開始CBrush的構造函數(shù)CBrush的3種Create函數(shù)設備環(huán)境類的SelectObject函數(shù)設備環(huán)境類的SelectObject函數(shù)CBrush的DeleteObject 函數(shù)畫圖結束畫圖畫刷的類型畫刷有三種基本類型:純色畫刷、陰影畫刷和圖案畫刷.1)創(chuàng)建畫刷(構造函數(shù)方式和Create函數(shù)方式) 創(chuàng)建純色畫刷CBrush brush1(RGB(255,0,0);/CBrush brush1; /brush1. CreateSolidBrush(RGB(255,0,0); 創(chuàng)建陰影畫刷CBrush brush2(
55、HS_DIAGCROSS, RGB(255,0,0);/CBrush brush2;/brush2. CreateHatchBrush(HS_DIAGCROSS, RGB(255, 0, 0); 創(chuàng)建圖案畫刷CBitmap bmp;bmp.LoadBitmap(IDB_BRUSH);CBrush brush3(&bmp);/CBrush brush3;/brush3. CreatePatternBrush(&bmp);陰影畫刷的樣式 CBrush brush2(HS_DIAGCROSS, RGB(255,0,0);HS_BDIAGONALHS_CROSSHS_DIAGCROSS
56、HS_FDIAGONALHS_HORIZONTALHS_VERTICAL2)選擇畫刷 使用設備環(huán)境類的成員函數(shù)SelectObject來選擇畫刷作為當前使用的畫刷。返回值為舊畫刷的指針。CBrush brushRed(RGB(255,0,0);CBrush* pBrushOld=pDC-SelectObject(&brushRed);3)還原畫刷 仍然使用SelectObject函數(shù)pDC-SelectObject(pBrushOld);使用畫刷的例子/-/畫圖開始/創(chuàng)建畫刷CBrush brush;brush.CreateHatchBrush(HS_VERTICAL , RGB(25
57、5, 0, 0);/保存舊畫刷CBrush *pOldBrush = pDC-SelectObject(&brush);/畫圖:畫矩形pDC-Rectangle(50, 50, 200, 200);/還原畫刷pDC-SelectObject(pOldBrush);/銷毀畫刷brush.DeleteObject();/畫刷結束/-備注 系統(tǒng)默認畫刷為純色、白色的畫刷。 CDC函數(shù)Rectangle(int x1, int y1, int x2, int y2)是以當前的畫筆畫矩形邊框,內部以當前畫刷填充x1, y1x2, y29、使用系統(tǒng)定義的畫筆和畫刷(堆對象) Windows預定義了
58、一些簡單風格的GDI對象,用戶使用這些GDI對象時,無需自己創(chuàng)建它們,可以直接將它們選入當前的設備環(huán)境,這些GDI對象稱作為堆(堆(Stock)對象)對象。堆對象包括堆畫筆、堆畫刷和堆字體等。堆畫筆、畫刷的樣式及說明樣 式說 明樣 式說 明BLACK_PEN黑色畫筆WHITE_PEN白色畫筆NULL_PEN空畫筆BLACK_BRUSH黑色畫刷WHITE_BRUSH白色畫刷NULL_BRUSH空畫刷GRAY_BRUSH灰色畫刷DKGRAY_BRUSH深灰色畫刷LTGRAY_BRUSH淺灰色畫刷HOLLOW_BRUSH虛畫刷使用堆對象 函數(shù)CDC:SelectStockObject()可以選擇一個
59、堆對象繪圖工具,以下代碼將堆畫筆和堆畫刷作為當前的繪圖工具:pPenOld=(CPen*) pDC-SelectStockObject(NULL_PEN); / 使用堆畫筆對象pBrhOld=(CBrush*) pDC-SelectStockObject(LTGRAY_BRUSH); / 使用堆畫刷對象10、繪制基本圖形 Windows中可以繪制的基本幾何圖形包括點、直線、曲線、矩形、橢圓、弧、扇形、弦形和多邊形等。 繪圖函數(shù)使用的坐標都是邏輯坐標。 各個DC類提供的繪圖函數(shù)有:SetPixelMoveTo LineToPolylinePolyBezier RectangleRoundRect
60、Ellipse ArcArcToPie ChordPolygonDrawIcon繪制基本圖形11、文本輸出與字體 輸出函數(shù)是輸出函數(shù)是TextOut()函數(shù),該函數(shù)只能輸出單行函數(shù),該函數(shù)只能輸出單行文本。要繪制多行文本可以調用文本。要繪制多行文本可以調用DrawText()函數(shù)函數(shù),另一個函數(shù),另一個函數(shù)ExtTextOut()可以用一個矩形框對輸可以用一個矩形框對輸出文本串進行裁剪。出文本串進行裁剪。 在缺省情況下繪制文本時,字體顏色是黑色黑色,背景顏色是白色白色,背景模式為不透明不透明模式??梢酝ㄟ^調用CDC類成員函數(shù)重新設置字體顏色、背景顏色和文本對齊方式等文本屬性。CDC類與文本輸出相關的函數(shù)SetTextColor()設置顯示文本的顏色GetTextColor獲得當前文本的顏色SetBkColor()設置顯示
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 腫瘤護理中的有效溝通
- 直腸惡性腫瘤內科診療體系
- 全國中醫(yī)護理骨干人才匯報
- 行政制度新人培訓
- 開戶云五期培訓
- 護理標識管理規(guī)章制度
- 幼兒教師音樂樂理培訓
- 木材采購保密及森林資源保護協(xié)議
- 車輛收費員招聘與管理服務協(xié)議
- 高端草莓采摘園與旅行社定制旅游合同范本
- 富士康職工檔案管理制度
- 中國共產主義青年團紀律處分條例試行解讀學習
- 國家能源集團陸上風電項目通 用造價指標(2024年)
- 2024北京海淀區(qū)三年級(下)期末語文試題及答案
- MOOC 國際商務-暨南大學 中國大學慕課答案
- 密封條范文模板(A4打印版)
- 人教版七年級下冊數(shù)學《期末檢測試卷》
- 防腐除銹檢驗記錄
- 公司金融課件(完整版)
- 三維激光掃描技術與應用實例-PPT課件
- 鐵路貨物裝載常用計算公式
評論
0/150
提交評論