版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Windows中負(fù)責(zé)圖形輸出的是GDI(即GraphicDeviceInterface,圖形設(shè)備接口)。這是Windows與硬件無關(guān)的圖形輸出模式的體現(xiàn)。GDI建立在硬件抽象層(HAL)之上屏蔽了不同輸出設(shè)備之間的差異從而為用戶提供了一個統(tǒng)一的“標(biāo)準(zhǔn)輸出設(shè)備”。但是,與DOS不同,Windows是多任務(wù)、進(jìn)程獨立的,每一個窗口都應(yīng)該有一個獨立的輸出通道。這樣,GDI又使用了一種簡單的機制來保證在窗口中畫圖的不同程序之間能共享“設(shè)備”而又
2、互不干擾。這個機制就是DC(DeviceContext,設(shè)備描述表)。有人把DC比喻成畫家的畫室,這里有畫布、畫刷、畫筆等等很多工具。就畫布而言,畫布形式可以不同,是的,我可以在桌上(desktop)的紙上(window)畫,也可以就畫在桌面上,還可以畫在墻上(管的著嗎!^_^)。為此,WindowsMFC提供了四種不同的DC環(huán)境(封裝為C類),以標(biāo)明不同的繪制權(quán)限即:CPaintDC用于在窗口客戶區(qū)畫圖(僅限于在OnPaint處理函數(shù)
3、中使用)CClientDC也用于在窗口客戶區(qū)畫圖(限于在OnPaint處理函數(shù)之外使用);CWindowDC用于在窗口內(nèi)任意地方畫圖,包括非客戶區(qū);CMetaFileDC用于繪制GDI圖元文件。這些類都可以直接實例化,如:CPaintDCdc(this)this表示此DC所屬窗口為當(dāng)前窗口創(chuàng)建了一個CPaintDC對象dc。CWindowDC一般不常用,如果想在窗口非客戶區(qū)畫圖,可借助OnNcPaint()處理函數(shù)捕獲WM_NCPAIN
4、T消息。剛才說了,DC中還有畫刷、畫筆等。這些都是DC的屬性,可通過DC自身(調(diào)用其成員函數(shù))獲得。DC屬性包括文本顏色、背景顏色、映射模式、繪圖模式、當(dāng)前位置、當(dāng)前畫筆(刷)和當(dāng)前字體等。畫筆(Pen)、畫刷(Brush)都是獨立的GDI對象,可通過CDC成員函數(shù)Object()選入DC。同樣操作方式的對象還有字體(Font)、位圖(Bitmap)、調(diào)色板(Palette)和區(qū)域(Region)。關(guān)于Object():在創(chuàng)建好GDI對
5、象之后,Object()接收該對象指針,其返回值為先前選入DC的相同類型的對象指針(通常用來恢復(fù)DC用)。Windows也預(yù)先定義了一些畫筆、畫刷、字體以及其他一些GDI對象。這些對象稱為備用對象,用CGdiObject::StockObject()選入。CGdiObject是表示GDI對象的CPen、CFont等類的基類。備用對象的屬性說明可以查MSDN。由CGdiObject派生類創(chuàng)建的畫筆、畫刷和其他對象都要占用內(nèi)存資源,因此使用
6、后一定要刪除它們。處理方法與其他window對象類似。在棧中創(chuàng)建的對象,當(dāng)此CGdiObject超出范圍時會自動析構(gòu)。在堆中用new創(chuàng)建的CGdiObject對象,可通過調(diào)用CGdiObject::Object顯式刪除(這會引起對GDI對象析構(gòu)函數(shù)的調(diào)用)或用相應(yīng)的運算符。如果是備用對象,則沒必要專門刪除,留給windows就可以了。VC有一種簡單的方法用來確定是否成功的刪除了GDI對象:只要在調(diào)試狀態(tài)下運行應(yīng)用程序的調(diào)試版本即可。在應(yīng)
7、用程序結(jié)束時,沒有釋放的資源會顯示在調(diào)試窗口中。一些知識點:性,即樣式、寬度和顏色。樣式有PS_SOLID、PS_INSIDEFRAME、PS_NULL等。PS_NULL一般稱其為“NULL畫筆”,想畫一個沒有邊框的圖形,就用到它了。筆寬以邏輯單位給出,實際意義與當(dāng)前映射模式相同。顏色是通過RGB宏把三個獨立顏色成分的值合成為一個可傳遞給GDI的COLREF值來確定的。2)CBrush:畫刷有三種基本類型,即單色、帶陰影線和帶圖案。其中
8、圖案畫刷允許用位圖填充圖形內(nèi)部(這樣,窗口背景也就沒啥新鮮的了)。常用函數(shù)有CDC::SetBkMode()、CDC::SetBkCol()等。6.文本與字體:CDC有一打文本處理函數(shù),重要的幾個是DrawText、TextOut、GetTextMetrics、SetTextCol和SetTextAlign等。其中GetTextMetrics()傳給TEXTMETRIC結(jié)構(gòu)關(guān)于字體性質(zhì)的相關(guān)信息。字體是一組具有特定尺寸(高度)和字樣的字
9、符;字樣指示字體共有屬性,如粗細(xì)等。字體封裝在CFont類中,建立字體對象,要在CFont構(gòu)造之后,再調(diào)用CFont的成員函數(shù)CreateFont或CreateFontIndirect等來建立GDI字體資源。針對字體,有一個LOGFONT結(jié)構(gòu),其中定義了字體的所有特性。也可通過填充它來創(chuàng)建字體。后記:寫這一章的筆記時有一種被作者牽著鼻子走的感覺。知識點太多,寫出來有一種羅列或拼湊的嫌疑。我不希望這樣,但想一想,技術(shù)也就是這樣。所以我希望
10、大家看的時候,能夠思考著看,而不是記憶著看。思考著看只要求我們知道技術(shù)點、怎么用,用熟了,用多了,也就記住了。精華是濃縮的,至于如何把它化開,可要靠你自己了。堆與棧的問題:堆,heap可以動態(tài)的建立和刪除的內(nèi)存。棧,stack先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),是用來暫時保存數(shù)據(jù)的。堆用來動態(tài)分配內(nèi)存,棧由編譯器自動使用,用來分配局部變量、函數(shù)參數(shù)。堆的增長由內(nèi)存的底部向上,棧的增長由內(nèi)存的高端向下。堆的大小一般比棧大得多。堆是用來實現(xiàn)動態(tài)存儲分配的,
11、和FILO沒有關(guān)系。棧由于它先進(jìn)后出的特性適合作活動記錄(包括函數(shù)返回地址,局部變量,對于pal等語言還包括display表)的存儲。(想一想如果你編寫一個遞歸程序,棧是怎樣起作用的。)至于堆和棧的組織是不是相臨的,這和OS的實現(xiàn)有關(guān)。CObjectaboj則aobj建在堆棧中CObjectpAObj=newCObject()pAObj建在堆中,需要你用刪除之。比如用到DC對象的時候,可以這樣:CDCdc(this)建在堆棧中,函數(shù)結(jié)束
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論