




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VC+編程基礎(chǔ)(補(bǔ)充),一、Windows應(yīng)用程序 二、VC+編程環(huán)境介紹 三、VC+交互編程基礎(chǔ) 四、Windows圖形編程,Windows應(yīng)用程序的相關(guān)概念,Windows應(yīng)用程序設(shè)計(jì)方法 (1)使用Windows提供的Windows API函數(shù) Windows API是Windows系統(tǒng)和Windows應(yīng)用程序間的標(biāo)準(zhǔn)程序接口,應(yīng)用程序可以通過(guò)此接口訪問(wèn)系統(tǒng) (2)使用Microsoft提供的MFC類庫(kù) MFC類庫(kù)集成了大量已經(jīng)預(yù)先定義好的類,用戶可以根據(jù)編程的需要調(diào)用相應(yīng)的類,或根據(jù)需要自定義有關(guān)的類。,Windows應(yīng)用程序的相關(guān)概念,Windows應(yīng)用程序開(kāi)發(fā)模式值得注意的幾個(gè)方面
2、:,Message Processing The Windows Graphics Device Interface Resource-Based Programming Memory Management Dynamic Link Libraries The Win32 Application Programming Interface,Windows應(yīng)用程序的相關(guān)概念,Windows應(yīng)用程序基本結(jié)構(gòu):,Windows應(yīng)用程序的相關(guān)概念,Windows應(yīng)用程序以消息為基礎(chǔ),以事件驅(qū)動(dòng)之。,事件驅(qū)動(dòng)程序設(shè)計(jì)是圍繞著消息的產(chǎn)生與處理而展開(kāi)的。一條消息是關(guān)于發(fā)生的事件的信息。作為一個(gè)Windows
3、程序員,其工作就是對(duì)正開(kāi)發(fā)的應(yīng)用程序所要發(fā)出或要接收的消息進(jìn)行排序和管理。,Windows應(yīng)用程序的相關(guān)概念,Windows消息的結(jié)構(gòu)MSG:,typedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG, *PMSG;,Windows應(yīng)用程序的相關(guān)概念,Windows消息的處理:,MSG msg /定義一個(gè)MSG類型的變量 while (GetMessage ( /將消息傳遞給窗口函數(shù),以便處理相應(yīng)的消息 ,Windows應(yīng)用程序的相關(guān)概念,Wind
4、ows應(yīng)用程序中的數(shù)據(jù)類型及常量,typedefunsigned char BYTE typedefunsigned short WORD typedefunsigned long DWORD typedeflong LONG typedefchar *PSTR typedef char NEAR *NPST typedefchar FAR*LPSTR typedefvoid VOID #denfineWM_QUIT0X0012,Windows應(yīng)用程序的相關(guān)概念,Windows應(yīng)用程序中的數(shù)據(jù)類型及常量,類型 說(shuō)明 CS 窗口類的風(fēng)格(Class Style) IDI 預(yù)定義的圖標(biāo)對(duì)象的標(biāo)識(shí)符
5、(IDentity of Icon) IDC 預(yù)定義的光標(biāo)對(duì)象的標(biāo)識(shí)符(IDentity of Cursor) WS 窗口的風(fēng)格(Windows Style) CW 創(chuàng)建窗口(Create Windows) WM 窗口消息(Windows Message) DT 繪制文本(Drawing Text),一些常見(jiàn)常量的前綴意義,Windows應(yīng)用程序的相關(guān)概念,Windows應(yīng)用程序中的數(shù)據(jù)類型及常量,在變量名的表示方法方面,Windows推薦使用一種稱為“匈牙利表示法”的方法。每個(gè)變量名用小寫字母或描述了變量的數(shù)據(jù)類型的字母作為前綴,變量的名字緊跟其后,且用大寫字母開(kāi)始的單詞(一個(gè)或多個(gè)單詞)表
6、示其含義,這樣每個(gè)變量都能附加上其數(shù)據(jù)類型的助記符。例如:WORDwOffset ;/ w表示W(wǎng)ORD類型 DWORD dwValue ; / dw表示DWORD類型,Windows應(yīng)用程序的相關(guān)概念,Windows應(yīng)用程序中的數(shù)據(jù)類型及常量,類型 說(shuō)明 b BOOL,布爾類型 by BYTE類型 c char類型 dw DWORD類型 l LONG類型 lp 遠(yuǎn)(長(zhǎng))指針(long pointer) n 短整型 p 指針 s 字符串,VC+編程環(huán)境介紹,1 Visual C+簡(jiǎn)介,是Windows環(huán)境下最主要的應(yīng)用開(kāi)發(fā)系統(tǒng)之一 是C+語(yǔ)言的集成開(kāi)發(fā)環(huán)境 與Win32緊密相連 強(qiáng)大的調(diào)試功能為
7、大型復(fù)雜軟件的開(kāi)發(fā)提供了有效的排錯(cuò)手段,2 可視化,指軟件開(kāi)發(fā)階段的可視化 利用計(jì)算機(jī)圖形技術(shù)和方法,VC+編程環(huán)境介紹,3 開(kāi)發(fā)環(huán)境,(1) VC+的菜單欄 - File菜單,斷點(diǎn)作用: 中斷程序的執(zhí)行過(guò)程,以便檢查程序代碼、變量和寄存器值,用來(lái)設(shè)置 刪除和 查看斷點(diǎn),提供有效 的成員名,在View菜單中可以: 改變窗口 改變工具欄的顯示方式 檢查源代碼 激活調(diào)試等,(a-1) ClassWizard 中的Message Maps選項(xiàng)卡,為窗口、對(duì)話框、控件、菜單選項(xiàng)和加速鍵等對(duì)象映射消息,創(chuàng)建或刪除消息處理函數(shù),查看編輯消息處理函數(shù)的代碼,(a-2) Member Variables選項(xiàng)卡
8、: 定義成員變量用于自動(dòng)初始化 其中: Control IDs是映射到成員變量的控件ID值 Type是成員變量的類型 Member是成員變量名,(b) Resource Symbols選項(xiàng) 該選項(xiàng)將打開(kāi)資源符號(hào)瀏覽器,從中可以瀏覽資源編輯符號(hào),資源編輯符號(hào)是映射到整數(shù)值上的一串字符,相當(dāng)于資源的一個(gè)代號(hào),在同一個(gè)程序中,資源編輯符號(hào)不能重復(fù),(c) Resource Includes選項(xiàng),該對(duì)話框包含資源符號(hào)頭文件名和預(yù)處理指令。,(a) New Class選項(xiàng) 該選項(xiàng)用來(lái)創(chuàng)建新類并添加到項(xiàng)目中,(4) VC+的菜單欄-Insert菜單,使用Project可以創(chuàng)建、修改和存儲(chǔ)正在編輯的工程文件
9、 工程文件組合了一個(gè)應(yīng)用程序的所有源文件的組成部分。工程文件包含在擴(kuò)展名為.MAK的文件中。,(5) VC+的菜單欄 - Project菜單,(b) Add To Project選項(xiàng) 選擇該選項(xiàng)將打開(kāi)一個(gè)級(jí)聯(lián)子菜單,通過(guò)級(jí)連子菜單,可以把文件、文件夾、數(shù)據(jù)鏈接以及VC組件或控件添加到當(dāng)前工程文件中,(a) Set Active Project選項(xiàng) 設(shè)定指定的項(xiàng)目為工作區(qū)的活動(dòng)項(xiàng)目,(c) Settings選項(xiàng) 選擇該選項(xiàng)將彈出Project Settings對(duì)話框,其中 General選項(xiàng)卡用來(lái)設(shè)置基礎(chǔ)類用法和目錄,指出應(yīng)用程序與MFC的鏈接方式,指出所建立的應(yīng)用程序的 缺省位置為Debug目
10、錄,輸出文件的位置,Build菜單用于編譯、建立和執(zhí)行應(yīng)用程序,(6) V C+的菜單欄-Build菜單,(e) Start Debug選項(xiàng),從當(dāng)前語(yǔ)句開(kāi)始執(zhí) 行程序直到遇到斷 點(diǎn)或遇到程序結(jié)束,單步執(zhí)行程序, 并在遇到函數(shù)調(diào) 用時(shí)進(jìn)入函數(shù)內(nèi) 部再?gòu)念^單步執(zhí)行,使程序在運(yùn)行到當(dāng)前光 標(biāo)所在位置時(shí)停止(相當(dāng) 于設(shè)置一個(gè)臨時(shí)斷點(diǎn)),調(diào)試過(guò)程中直 接進(jìn)入到正在 運(yùn)行的進(jìn)程中,(a)Source Browse選項(xiàng) 編譯器在建立項(xiàng)目時(shí)會(huì)創(chuàng)建與項(xiàng)目中每一程序文件信息有關(guān)的.SBR文件。 BSCMAKE程序?qū)⑦@些.SBR文件匯編為單個(gè)瀏覽信息數(shù)據(jù)庫(kù),選擇Source Browse將 彈出瀏覽窗口,它顯 示與
11、程序中所有符號(hào) (類、函數(shù)、數(shù)據(jù)、宏 和類型)有關(guān)的信息,(7) VC+的菜單欄-Tools菜單,在工作區(qū)中添加項(xiàng)目: 用File-Open選項(xiàng)可打開(kāi)已存在的項(xiàng)目;通過(guò)New對(duì)話框的Projects選項(xiàng)卡創(chuàng)建新的項(xiàng)目,并選擇Add to current workspace復(fù)選框。,VC以項(xiàng)目工作區(qū) 的形式來(lái)組織文件、 項(xiàng)目和項(xiàng)目配置,1. 創(chuàng)建新的項(xiàng)目工作區(qū),創(chuàng)建新的空工作區(qū)步驟: (a) File-New-Workspaces- 輸入工作區(qū)名字并指定工作區(qū)目錄,在VC中,源代碼或資源編輯器為了引用資源和用戶自定義的其它對(duì)象,于是就引入了一種與資源一一對(duì)應(yīng)的符號(hào)即資源符號(hào),使之能夠以字符串的方
12、式被引用。 資源符號(hào)是映射到整數(shù)值上的一串字符,是一種標(biāo)識(shí)符。每當(dāng)創(chuàng)建一個(gè)新的資源或資源對(duì)象時(shí),系統(tǒng)就會(huì)為其提供一個(gè)缺省的資源符號(hào)名稱并賦一個(gè)整數(shù)值,該定義保存在resource.h文件中。,資源是一種界面元素, 用戶可以從中獲得信息 并在其中執(zhí)行某個(gè)動(dòng)作,資源及資源編輯器,VC Programmers Guide:VC程序員指南。 VC Users Guide:VC用戶指南。 VC Tutorials:VC教程。 MFC and Templates:微軟基礎(chǔ)類庫(kù)和模板參考信息。 Languages and Libraries for C+:C+語(yǔ)言和庫(kù)文件信息。,VC幫助系統(tǒng) 主要提供五 個(gè)
13、方面內(nèi)容,聯(lián)機(jī)幫助,VC+交互編程基礎(chǔ),MFC是用來(lái)編寫Windows應(yīng)用程序的C+類集,該類集以層次結(jié)構(gòu)組織起來(lái),其中封裝了大部分Windows API函數(shù)和Windows控件,它所包含的功能涉及到整個(gè)Windows操作系統(tǒng)。 MFC不僅為用戶提供了 Windows圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)建應(yīng)用程序的組件。,MFC庫(kù)中的類按層次關(guān)系劃分類: (1)根類:CObject (2)應(yīng)用程序體系結(jié)構(gòu)類 (3)窗口、對(duì)話框和控件類 (4)繪圖和打印類 (5)簡(jiǎn)單數(shù)據(jù)類型類 (6)數(shù)組、列表和映射類 (7)文件和數(shù)據(jù)庫(kù)類 (8)Internet和網(wǎng)絡(luò)工作類 (9)OLE類 (10)調(diào)試和
14、異常類,VC+交互編程基礎(chǔ),應(yīng)用程序體系結(jié)構(gòu)類,應(yīng)用程序體系結(jié)構(gòu)類,可視對(duì)象類,1窗口類:CWnd類,CWnd提供了MFC中所有窗口類的基本功能,是CCmdTarget類的子類,可視對(duì)象類,可視對(duì)象類,可視對(duì)象類,VC+交互編程基礎(chǔ),MFC 中全局函數(shù)和全局變量,AfxAbort: 無(wú)條件終止一個(gè)應(yīng)用程序 AfxBeginThread: 創(chuàng)建一個(gè)新線程并執(zhí)行它 AfxEndThread: 終止當(dāng)前正在執(zhí)行的線程 AfxMessageBox: 顯示一個(gè)Windows消息框 AfxGetApp: 返回當(dāng)前應(yīng)用程序?qū)ο蟮闹羔?AfxGetInstanceHandle:返回標(biāo)識(shí)當(dāng)前應(yīng)用程序?qū)ο蟮木浔?
15、AfxRegisterWndClass: 注冊(cè)用于創(chuàng)建Windows窗口的窗口類 theApp 應(yīng)用程序唯一的全局對(duì)象,應(yīng)用程序向?qū)?應(yīng)用程序向?qū)?應(yīng)用程序向?qū)?應(yīng)用程序向?qū)?應(yīng)用程序向?qū)?應(yīng)用程序向?qū)?應(yīng)用程序向?qū)?應(yīng)用程序向?qū)?圖形設(shè)備接口GDI,Windows圖形設(shè)備接口(GDI)是為與設(shè)備無(wú)關(guān)的圖形設(shè)計(jì)的。所謂設(shè)備的無(wú)關(guān)性,就是操作系統(tǒng)屏蔽了硬件設(shè)備的差異,因而設(shè)備無(wú)關(guān)性能使用戶編程時(shí)無(wú)需考慮特殊的硬件設(shè)置。 GDI負(fù)責(zé)系統(tǒng)與用戶或繪圖程序之間的信息交換,并控制在輸出設(shè)備上顯示圖形或文字。,GDI的一些概念 繪圖工具對(duì)象 繪圖函數(shù) 文本的顯示,圖形設(shè)備接口GDI,GDI的一些概念 繪圖
16、工具對(duì)象 繪圖函數(shù) 文本和字體,圖形設(shè)備接口GDI,Windows系統(tǒng),外設(shè),直接訪問(wèn),統(tǒng)一的設(shè)備環(huán)境(DC),使應(yīng)用程序與設(shè)備相連,用戶,GDI的一些概念,設(shè)備環(huán)境(上下文)DC,GDI的一些概念,CDC類,CDC類提供與繪圖有關(guān)的所有操作函數(shù),如:繪圖工具對(duì)象的選擇;繪圖屬性、映射模式、視口等的設(shè)置;提供坐標(biāo)轉(zhuǎn)換、裁剪和繪制簡(jiǎn)單圖形、顯示文本的函數(shù)等。 派生自CDC類的還有CPaintDC、 CClientDC、 CWindowDC 、CMetaFileDC。,GDI的一些概念,CDC類,CreateDC、CreateCompatibleDC、DeleteDC Attach、Detach
17、GetCurrentBrush、GetCurrentFont、GetCurrentPalette、GetCurrentPen、GetWindow SelectObject、SelectStockObject SelectPalette、RealizePalette GetBkColor、SetBkColor、GetBkMode、SetBkMode、GetPolyFillMode、SetPolyFillMode、GetROP2、SetROP2、GetStretchBltMode、SetStretchBltMode、GetTextColor、SetTextColor GetMapMode、SetM
18、apMode、GetViewportExt、SetViewportExt、GetWindowExt、SetWindowExt PatBlt、BitBlt、StretchBlt、GetPixel、SetPixel,圖形刷新,(1) 刷新請(qǐng)求,窗口大小的調(diào)整 窗口移動(dòng) 被覆蓋后的恢復(fù),GDI的一些概念,GDI的一些概念,(2) 系統(tǒng)對(duì)刷新請(qǐng)求的響應(yīng) 當(dāng)用戶區(qū)的內(nèi)容需要刷新時(shí),系統(tǒng)向應(yīng)用程序消息隊(duì)列發(fā)送WM_PAINT消息,三種 刷新,窗口移動(dòng)后的刷新 被覆蓋區(qū)域的刷新 對(duì)象穿越后的刷新 (系統(tǒng)自動(dòng)完成),用戶區(qū)移動(dòng)或顯示 用戶窗口大小改變 程序通過(guò)滾動(dòng)條滾動(dòng)窗口,窗口被另一個(gè)窗口覆蓋的 恢復(fù)如下拉
19、式菜單關(guān)閉等,光標(biāo)穿過(guò)用戶區(qū) 圖標(biāo)拖過(guò)用戶區(qū),窗口被另一個(gè)窗口覆蓋的區(qū)域稱為無(wú)效區(qū)域。 Windows系統(tǒng)為每個(gè)窗口建立了一個(gè)PAINTSTRUCT結(jié)構(gòu),該結(jié)構(gòu)中包含了包圍無(wú)效區(qū)域的一個(gè)最小矩形的結(jié)構(gòu)RECT,應(yīng)用程序可以根據(jù)這個(gè)無(wú)效矩形執(zhí)行刷新操作。,typedef struct tagPAINTSTRUCT HDC hdc; /設(shè)備環(huán)境句柄 BOOL fErase; /一般取真值,表示擦除無(wú)效矩形的背景 RECT rcPaint;/無(wú)效矩形標(biāo)識(shí) BOOL fRestore; /系統(tǒng)保留 BOOL fIncUpdate;/系統(tǒng)保留 BYTE rgbReserved32;/系統(tǒng)保留 PAINT
20、STRUCT;,GDI的一些概念,常用的windows應(yīng)用程序刷新窗口的方法,保存副本。刷新時(shí)將副本拷貝到相應(yīng)的窗口中。,記錄事件。刷新時(shí)重新執(zhí)行這個(gè)曾經(jīng)發(fā)生的事件。,重新繪制。將圖形繪制處理程序放在消息WM_PAINT響應(yīng)模塊中,刷新時(shí)重繪圖形。,(3) 有效的刷新方法,GDI的一些概念,激活刷新的MFC窗口類的函數(shù),GDI的一些概念,BOOL InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );,BOOL Invalidate( BOOL bErase = TRUE );,void InvalidateRgn( HRGN hRgn, B
21、OOL bErase = TRUE );,獲取設(shè)備環(huán)境DC的方法,獲取設(shè)備環(huán)境是應(yīng)用程序輸出圖形的先決條件,常用的兩種方法是調(diào)用函數(shù)BeginPaint或GetDC,1、應(yīng)用程序響應(yīng)WM_PAINT消息進(jìn)行圖形刷新時(shí),主要通過(guò)調(diào)用BeginPaint函數(shù)獲取設(shè)備環(huán)境 hdc=BeginPaint(hwnd, CDC* GetWindowDC( ); CClientDC( CWnd* pWnd );,由GetDC函數(shù)獲取的設(shè)備環(huán)境必須用ReleaseDC函數(shù)釋放。,GDI的一些概念,GDI的一些概念,獲取設(shè)備環(huán)境DC的方法,映像模式 映像模式定義了將邏輯單位轉(zhuǎn)化為設(shè)備的度量單位以及設(shè)備的x方向和
22、y方向,程序員可在一個(gè)統(tǒng)一的邏輯坐標(biāo)系中操作而不必考慮輸出設(shè)備的坐標(biāo)系。,窗口:對(duì)應(yīng)邏輯坐標(biāo)系上程序員設(shè)定的區(qū)域 視口:對(duì)應(yīng)實(shí)際輸出設(shè)備上程序員設(shè)定的區(qū)域,GDI的一些概念,GDI的一些概念,窗口視區(qū)變換通常解決下面幾個(gè)方面的問(wèn)題: (1)窗口邏輯坐標(biāo)與視區(qū)設(shè)備坐標(biāo)之間的轉(zhuǎn)換。 (2)用戶坐標(biāo)系到屏幕坐標(biāo)系,坐標(biāo)軸方向可能改變,還有坐標(biāo)原點(diǎn)的映射問(wèn)題; (3)用戶坐標(biāo)系中窗口區(qū)的圖形坐標(biāo)轉(zhuǎn)換到視圖區(qū)上的坐標(biāo)需要取整。 (4)如果視圖區(qū)水平分辨率和垂直分辨率不同,為了保持圖形不變形,還要進(jìn)行比例變換。,GDI的一些概念,應(yīng)用程序可獲取設(shè)備環(huán)境的當(dāng)前映像模式,并根據(jù)需要設(shè)置映像模式。,GDI的一些
23、概念,CDC:GetMapMode CDC:SetMapMode int GetMapMode( ) const; virtual int SetMapMode( int nMapMode );,圖形設(shè)備接口GDI,GDI的一些概念 繪圖工具對(duì)象 繪圖函數(shù) 文本的顯示,CGdiObject,繪圖工具對(duì)象,1. 畫筆(CPen ),畫筆的創(chuàng)建 CPen( int nPenStyle, int nWidth, COLORREF crColor ); CPen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount
24、 = 0, const DWORD* lpStyle = NULL ); BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor ); BOOL CreatePen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );,繪圖工具對(duì)象,PS_DASH PS_DASHDOT PS_DASHDOTDOT PS_DOT PS_INSIDEFRAME PS_NULL PS_SOLID
25、,創(chuàng)建畫筆后,必須調(diào)用SelectObject函數(shù)將其選入設(shè)備環(huán)境。,不再使用當(dāng)前畫筆時(shí),需刪除畫筆,以免占內(nèi)存 DeleteObject(hP);,繪圖工具對(duì)象,CPen pen(0,width,color); CPen* oldPen = pDC-SelectObject(,2.畫刷(CBrush ),CBrush( COLORREF crColor ); CBrush( int nIndex, COLORREF crColor ); CBrush( CBitmap* pBitmap ); BOOL CreateSolidBrush( COLORREF crColor ); BOOL Cr
26、eateHatchBrush( int nIndex, COLORREF crColor ); BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush ); BOOL CreatePatternBrush( CBitmap* pBitmap ); BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage ); BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage ); BOOL CreateSysColorB
27、rush( int nIndex );,繪圖工具對(duì)象,CBrush brush; brush.CreateSysColorBrush(COLOR_BTNFACE); / Select the brush into the device context. CBrush* pOldBrush = (CBrush*)pDC-SelectObject(,繪圖工具對(duì)象,2.畫刷(CBrush ),BOOL CreatePalette( LPLOGPALETTE lpLogPalette ); BOOL CreateHalftonePalette( CDC* pDC ); UINT GetPaletteE
28、ntries( UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors ) const; UINT SetPaletteEntries( UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors );,繪圖工具對(duì)象,3.調(diào)色板(CPalette ),typedef struct tagPALETTEENTRY BYTE peRed; BYTE peGreen; BYTE peBlue; BYTE peFlags; PALETTEENTRY;,
29、typedef struct tagLOGPALETTE WORD palVersion; WORD palNumEntries; PALETTEENTRY palPalEntry1; LOGPALETTE;,BOOL CreateRectRgn( int x1, int y1, int x2, int y2 ); BOOL CreateRectRgnIndirect( LPCRECT lpRect ); BOOL CreateEllipticRgn( int x1, int y1, int x2, int y2 ); BOOL CreateEllipticRgnIndirect( LPCRE
30、CT lpRect ); BOOL CreatePolygonRgn( LPPOINT lpPoints, int nCount, int nMode ); BOOL CreatePolyPolygonRgn( LPPOINT lpPoints, LPINT lpPolyCounts, int nCount, int nPolyFillMode ); BOOL CreateRoundRectRgn( int x1, int y1, int x2, int y2, int x3, int y3 ); int CombineRgn( CRgn* pRgn1, CRgn* pRgn2, int nC
31、ombineMode );,繪圖工具對(duì)象,4. CRgn,圖形設(shè)備接口GDI,GDI的一些概念 繪圖工具對(duì)象 繪圖函數(shù) 文本的顯示,CDC的繪圖函數(shù): CPoint GetCurrentPosition( ) const; CPoint MoveTo( int x, int y ); CPoint MoveTo( POINT point ); BOOL LineTo( int x, int y ); BOOL LineTo( POINT point ); BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int
32、y4 ); BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );,繪圖函數(shù),CDC的繪圖函數(shù): BOOL AngleArc( int x, int y, int nRadius, float fStartAngle, float fSweepAngle ); BOOL LineTo( int x, int y ); BOOL Polyline( LPPOINT lpPoints, int nCount ); BOOL PolyPolyline( const POINT* lpPoints, const DWORD* lpPolyPoin
33、ts, int nCount ); BOOL PolyBezier( const POINT* lpPoints, int nCount ); BOOL DrawIcon( int x, int y, HICON hIcon ); void DrawDragRect( LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE sizeLast, CBrush* pBrush = NULL, CBrush* pBrushLast = NULL ); void Draw3dRect( LPCRECT lpRect, COLORREF clrTopLef
34、t, COLORREF clrBottomRight );,繪圖函數(shù),CDC的繪圖函數(shù): BOOL Chord( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 ); BOOL Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 ); BOOL Pie( LPCRECT lpRect, POINT ptStart, PO
35、INT ptEnd );,繪圖函數(shù),CDC的繪圖函數(shù): BOOL Ellipse( int x1, int y1, int x2, int y2 ); BOOL Ellipse( LPCRECT lpRect ); BOOL Polygon( LPPOINT lpPoints, int nCount ); int SetPolyFillMode( int nPolyFillMode ); BOOL PolyPolygon( LPPOINT lpPoints, LPINT lpPolyCounts, int nCount ); BOOL Rectangle( int x1, int y1, in
36、t x2, int y2 ); BOOL Rectangle( LPCRECT lpRect ); void DrawFocusRect( LPCRECT lpRect ); BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 ); BOOL RoundRect( LPCRECT lpRect, POINT point );,繪圖函數(shù),圖形設(shè)備接口GDI,GDI的一些概念 繪圖工具對(duì)象 繪圖函數(shù) 文本和字體,文本和字體,使用定義好的與設(shè)備無(wú)關(guān)的字體集, Windows就能維護(hù)它的設(shè)備無(wú)關(guān)性,提供“所見(jiàn)即所得”的好處,即屏
37、幕所見(jiàn)與設(shè)備輸出的文本是一樣的。,文本和字體,邏輯字體定義的字符集是設(shè)備無(wú)關(guān)的,它可以精確標(biāo)度,因此得到廣泛應(yīng)用,物理字體是為特殊設(shè)備設(shè)計(jì)的,因而是設(shè)備相關(guān)的,字體 說(shuō)明 ANSI_FIXED ANSI標(biāo)準(zhǔn)的固定寬度的字體 ANSI_VAR ANSI標(biāo)準(zhǔn)的可變寬度的字體 DEFAULT_GUI當(dāng)前GUI的缺省字體 OEM_FIXED 由標(biāo)準(zhǔn)原設(shè)備制造商(OEM)提供 DEVICE_DEFAULT當(dāng)前圖形設(shè)備的字體 SYSTEM_FIXEDWindows的標(biāo)準(zhǔn)固定寬度的字體 SYSTEM Windows提供的可變寬度的字體,Windows 系統(tǒng)提供了七種基本字體,文本和字體,CFont類 BOO
38、L CreateFontIndirect(const LOGFONT* lpLogFont ); BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename
39、 ); BOOL CreatePointFont( int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL ); BOOL CreatePointFontIndirect( const LOGFONT* lpLogFont, CDC* pDC = NULL );,文本和字體,typedef struct tagLOGFONT LONG lfHeight; LONG lfWidth; /字體高度、寬度 LONG lfEscapement; LONG lfOrientation; /字體角度 LONG lfWeight; /字體粗細(xì)度 BYTE
40、lfItalic; /字體是否傾斜 BYTE lfUnderline; /字體是否有下劃線 BYTE lfStrikeOut; /字體是否有中劃線 BYTE lfCharSet; /字體所屬字符集 BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceNameLF_FACESIZE; /字體名 LOGFONT, *PLOGFONT;,文本和字體,CFont類 CClientDC dc(this); CFont font; VERIFY(font.CreatePo
41、intFont(120, Arial, ,文本和字體,設(shè)置字體和背景顏色(CDC),virtual COLORREF SetBkColor( COLORREF crColor ); int SetBkMode( int nBkMode ); virtual COLORREF SetTextColor( COLORREF crColor );,輸出文字(CDC),virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount ); BOOL TextOut( int x, int y, const CString,GDI編程的
42、幾個(gè)問(wèn)題,CRgn類 位圖相關(guān)知識(shí) 映射模式與窗口-視口變換 MFC中的MVC模式 編程實(shí)例解析,CRgn類,CRgn類的主要方法:,1、創(chuàng)建各類多邊形區(qū)域: BOOL CreateRectRgn( int x1, int y1, int x2, int y2 ); BOOL CreateEllipticRgn( int x1, int y1, int x2, int y2 ); BOOL CreateRoundRectRgn( int x1, int y1, int x2, int y2, int x3, int y3 ); BOOL CreatePolygonRgn( LPPOINT lp
43、Points, int nCount, int nMode ); BOOL CreatePolyPolygonRgn( LPPOINT lpPoints, LPINT lpPolyCounts, int nCount, int nPolyFillMode ); BOOL CreateFromPath( CDC* pDC ); BOOL CreateFromData( const XFORM* lpXForm, int nCount, const RGNDATA* pRgnData );,CRgn類,CRgn類的主要方法:,2、用于多邊形區(qū)域的交互拾?。?BOOL PtInRegion( int
44、 x, int y ) const; BOOL RectInRegion( LPCRECT lpRect ) const;,CRgn類還用于CDC類的裁剪操作: int SelectClipRgn( CRgn* pRgn, int nMode ); virtual BOOL PtVisible( int x, int y ) const; virtual BOOL RectVisible( LPCRECT lpRect ) const; virtual int OffsetClipRgn( int x, int y ); int ExcludeUpdateRgn( CWnd* pWnd );,
45、CRgn類,CRgn用于多邊形區(qū)域的交互拾取例子,鼠標(biāo)當(dāng)前位置,構(gòu)造線段的選擇矩形區(qū)域,直線的交互拾取,CRgn類,CRgn用于多邊形區(qū)域的交互拾取例子,橢圓的交互拾取實(shí)例代碼 BOOL CGDI_ExeDoc:GetEllipseAt(CRect ,位圖相關(guān)知識(shí),1、位圖相關(guān)數(shù)據(jù)結(jié)構(gòu) 2、DIB /位圖文件類型,“BM ” DWORD bfSize; /位圖文件大小,單位字節(jié) WORD bfReserved1;/保留字,取0 WORD bfReserved2; /保留字,取0 DWORD bfOffBits; /文件頭到位圖數(shù)據(jù)的偏移量 BITMAPFILEHEADER, *PBITMAPF
46、ILEHEADER;,位圖相關(guān)知識(shí),1、位圖相關(guān)數(shù)據(jù)結(jié)構(gòu),typedef struct tagBITMAPINFOHEADER DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER, *PBITMAPINFOHEADER;,位
47、圖相關(guān)知識(shí),1、位圖相關(guān)數(shù)據(jù)結(jié)構(gòu),typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors1; BITMAPINFO, *PBITMAPINFO; typedef struct tagRGBQUAD BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; RGBQUAD;,位圖相關(guān)知識(shí),1、位圖相關(guān)數(shù)據(jù)結(jié)構(gòu),typedef struct tagBITMAP LONG bmType; /位圖類型 LONG bmWidth; /位圖寬 LONG
48、 bmHeight; /位圖高 LONG bmWidthBytes; /位圖數(shù)據(jù)每行字節(jié)數(shù) WORD bmPlanes; /位圖色平面數(shù) WORD bmBitsPixel; /位圖像素的位數(shù) LPVOID bmBits; /位圖像素?cái)?shù)據(jù) BITMAP, *PBITMAP;,位圖相關(guān)知識(shí),2、DIB(Device-Independent Bitmap ) DDB(Device-Dependent Bitmap ),在Windows系統(tǒng)中,那些以BMP或DIB為擴(kuò)展名的文件都是設(shè)備無(wú)關(guān)位圖文件。 DIB文件由四個(gè)部分組成: BITMAPFILEHEADER BITMAPINFOHEADER RGB
49、QUAD 位圖圖像數(shù)據(jù) 設(shè)備相關(guān)位圖則通常在內(nèi)存中創(chuàng)建,它不帶調(diào)色板信息,其顏色由與它相關(guān)的設(shè)備決定。通常由CBitmap類來(lái)創(chuàng)建管理。,位圖相關(guān)知識(shí),3、CBitmap類,1、位圖數(shù)據(jù)操作: int GetBitmap( BITMAP* pBitMap ); DWORD SetBitmapBits( DWORD dwCount, const void* lpBits ); DWORD GetBitmapBits( DWORD dwCount, LPVOID lpBits ) const; CSize SetBitmapDimension( int nWidth, int nHeight );
50、 CSize GetBitmapDimension( ) const;,位圖相關(guān)知識(shí),3、CBitMap類,2、創(chuàng)建位圖: BOOL LoadBitmap( UINT nIDResource ); BOOL CreateBitmap( int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits ); BOOL CreateBitmapIndirect( LPBITMAP lpBitmap ); BOOL CreateCompatibleBitmap( CDC* pDC, int nWidth, int nH
51、eight ); BOOL CreateDiscardableBitmap( CDC* pDC, int nWidth, int nHeight );,位圖相關(guān)知識(shí),4、CDC中相關(guān)位圖操作,/將一個(gè)位圖從一個(gè)DC拷貝至另一個(gè)DC BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop ); /將樣式畫刷相關(guān)的位圖拷貝至DC BOOL PatBlt( int x, int y, int nWidth, int nHeight, DWORDdwRop );,位
52、圖相關(guān)知識(shí),4、CDC中相關(guān)位圖操作,int SetStretchBltMode( int nStretchMode ); /將一個(gè)位圖從一個(gè)DC拷貝至另一個(gè)DC,可顯示壓縮位圖 BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );,位圖相關(guān)知識(shí),4、CDC中相關(guān)位圖操作,BOOL MaskBlt( int x, int y, int nWidth, int nHeight, CD
53、C* pSrcDC, int xSrc, int ySrc, CBitmap,位圖相關(guān)知識(shí),位圖應(yīng)用實(shí)例,C*View:C*View() m_pMapBmp = new CBitmap; m_bEnableUpDateClientWindow = FALSE; void C*View:OnInitialUpdate() CClientDC dc(this); int nBmpWidth = :GetSystemMetrics(SM_CXSCREEN); int nBmpHeight = :GetSystemMetrics(SM_CYSCREEN); m_pMapBmp-CreateCompat
54、ibleBitmap( ,位圖相關(guān)知識(shí),位圖應(yīng)用實(shí)例,void C*View:OnDraw(CDC* pDC) CDC* pMemDC = new CDC; if (!pMemDC-CreateCompatibleDC(pDC) return; CBitmap* pOldBmp = pMemDC-SelectObject(m_pMapBmp); if(m_bEnableUpDateClientWindow = TRUE) BeginWaitCursor(); m_GMDataManage.GMF_ShowWorkSpace(pMemDC, rClient); EndWaitCursor();
55、m_bEnableUpDateClientWindow = FALSE; pDC-BitBlt(0, 0, rClient.Width(), rClient.Height(), pMemDC, 0, 0, SRCCOPY); pMemDC-SelectObject(pOldBmp); delete pMemDC; ,映射模式與窗口-視口變換,窗口-視口變換通常完成邏輯坐標(biāo)系和設(shè)備坐標(biāo)系之間的坐標(biāo)變換,在GIS軟件中通常是地理坐標(biāo)系(或高斯直角坐標(biāo)系)與設(shè)備坐標(biāo)系之間的變換。坐標(biāo)變換與映射模式有著直接的關(guān)聯(lián)。,映射模式與窗口-視口變換,CDC類中關(guān)于坐標(biāo)變換的函數(shù): /設(shè)備坐標(biāo)到邏輯坐標(biāo) voi
56、d DPtoLP( LPPOINT lpPoints, int nCount = 1 ) const; void DPtoLP( LPRECT lpRect ) const; void DPtoLP( LPSIZE lpSize ) const; /設(shè)備坐標(biāo)到邏輯坐標(biāo) void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const; void LPtoDP( LPRECT lpRect ) const; void LPtoDP( LPSIZE lpSize ) const;,映射模式與窗口-視口變換,CDC類中關(guān)于坐標(biāo)變換的函數(shù): void DPto
57、HIMETRIC( LPSIZE lpSize ) const; void HIMETRICtoDP( LPSIZE lpSize ) const; void LPToHIMETRIC( LPSIZE lpSize ) const; void HIMETRICtoLP( LPSIZE lpSize ) const; /與映射模式和窗口、視口設(shè)置有關(guān)的主要函數(shù) virtual int SetMapMode( int nMapMode ); virtual CPoint SetViewportOrg( int x, int y ); virtual CSize SetViewportExt( in
58、t cx, int cy ); CPoint SetWindowOrg( int x, int y ); virtual CSize SetWindowExt( int cx, int cy );,映射模式與窗口-視口變換,例程坐標(biāo)變換實(shí)例,/設(shè)備坐標(biāo)轉(zhuǎn)換為邏輯坐標(biāo),映射模式為MM_TEXT void CGDI_ExeView:ClientToDoc(CPoint ,映射模式與窗口-視口變換,例程坐標(biāo)變換實(shí)例,/邏輯坐標(biāo)轉(zhuǎn)換為設(shè)備坐標(biāo),注意不同映射模式的轉(zhuǎn)換結(jié)果不同 void CGDI_ExeView:DocToClient(CPoint ,映射模式與窗口-視口變換,GIS中坐標(biāo)變換實(shí)例,CPoint DocToClient(GMS_3DPOINT ,映射模式與窗口-視口變換,GIS中坐標(biāo)變換實(shí)例,GMS_3DPOINT ClientToDoc(CPoint point) GMS_3DPOINT dpoint; dpoint.X = (point.x-m_dDX)/m_dScale; dpoint.Y = (point.y-m_dDY)/(-m_dScale); dpoint.H = 0.0; re
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 腸內(nèi)外營(yíng)養(yǎng)的護(hù)理
- 廢舊倉(cāng)庫(kù)改造方案(3篇)
- 毛線團(tuán)兒童繪畫課件
- 溝口砂石開(kāi)采方案(3篇)
- 包車公司運(yùn)營(yíng)方案(3篇)
- 市場(chǎng)商鋪清退方案(3篇)
- 水力水電規(guī)劃方案(3篇)
- 運(yùn)動(dòng)場(chǎng)方案(3篇)
- 外墻清潔方案(3篇)
- 中式外墻改建方案(3篇)
- DB11∕T 1692-2019 城市樹(shù)木健康診斷技術(shù)規(guī)程
- 三年級(jí)(下冊(cè))西師版數(shù)學(xué)全冊(cè)重點(diǎn)知識(shí)點(diǎn)
- ASTMD638-03中文版塑料拉伸性能測(cè)定方法
- 單句(長(zhǎng)短句變換)運(yùn)用訓(xùn)練-2025年高考語(yǔ)文一輪復(fù)習(xí)學(xué)生版
- 奧沙利鉑超敏反應(yīng)全程管理中國(guó)專家共識(shí)(2024年版)解讀
- 國(guó)家開(kāi)放大學(xué)《管理信息系統(tǒng)》大作業(yè)參考答案
- 2024年河北理科高考成績(jī)排名一分一檔表
- GB/T 150.2-2024壓力容器第2部分:材料
- 智聯(lián)eas測(cè)評(píng)題庫(kù)
- 浙江省杭州市余杭區(qū)2024年小升初語(yǔ)文試題及答案
- LED照明有關(guān)國(guó)家標(biāo)準(zhǔn)及對(duì)應(yīng)國(guó)際標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論