windows中負責圖形輸出的是graphics device inte***ce(圖形裝置介面),或 稱gdi.它是乙個通用而強大的圖形介面,windows中有大部分的圖形繪製工作都是由gdi來完成的。
在windows中,每個應用程式的視窗的結果大部分以視窗的形式展顯。因此,程式a的輸出與程式b的輸出是相隔離的。這意味著各程式的輸出必須限制在自己的視窗中。gdi使用一簡單的機制保證在視窗中畫圖的各程式遵循這些規則。這種機制即為裝置描述表(dc)。
裝置描述表表示的是一種邏輯意義上的「顯示平面」,它是window中的一種資料結構,它包含gdi需要的所有關於顯示平面情況的描述字段,包括相連的物理裝置和各種各樣的狀態資訊。
在平面上畫圖之前,windows程式從gdi獲取裝置描述表控制代碼,並在每次呼叫gdi輸出函式時將控制代碼返回給gdi。
裝置描述表在使gdi擺脫裝置限制的過程中發揮了重要的作用。獲得裝置描述表控制代碼後,同一gdi函式可用來向多種輸出裝置上畫圖。
獲取裝置描述表的方法,一種方法是呼叫cwnd::getdc,它返回指向表示windows裝置描述表的cdc物件的指標。在畫圖完畢時,用cwnd::releasedc釋放由cwnd::getdc獲取的裝置描述表指標。
用**表示如下
在處理wm_paint訊息的onpaint函式時,需要用cwnd::beginpaint和cwnd::endpaint來處理。注意這是必須的哦。
用**表示如下
當在處理wm_paint訊息時,cwnd::beginpaint與cwnd::endpaint函式呼叫失敗,將造成wm_paint不會從訊息佇列中刪除。應用程式將一遍一遍的處理同乙個wm_paint訊息而陷入死迴圈。
為了避免上面獲取與釋放裝置描述表時需呼叫相應函式,因此,mfc對上面的過程進行了封裝。按用途的不同,對cdc類進行了派生。
由cdc派生的類如下
cpaintdc 用於在視窗客戶區畫圖(僅限於onpaint處理程式)
cclientdc 用於在視窗客戶區畫圖(除onpaint外的任何處理程式)
cwindowdc 用於在視窗內任意地方畫圖,包括非客戶區
cmetafiledc 用於向gdi元檔案畫圖
類cpaintdc
專門來處理wm_paint訊息的繪圖動作,可以通過下面的方法來建立, 一種是在棧中建立
這種方法好處是,當物件的生命週期結束,則它的析構函式會被自動呼叫。
另一種方法是在堆中建立
這種方法的好處是,很靈活。 但要記住呼叫delete刪除物件。
類cclientdc
用於處理那些非onpaint的繪圖工作。它可以在不等待wm_paint訊息時,在使用者的客戶區區域進行繪圖工作。
類cwindowdc
用於處理在視窗客戶區的地方進行繪圖工作。一般情況下cwindowdc並不常用。如果想在視窗非客戶區作圖,你可以借助onncpaint處理程式捕獲wm_ncpaint訊息,確定非客戶區需要繪製的時間。
乙個有興趣的呼叫,如下
在用cdc繪圖時,我們可以改變裝置描述表屬性,來繪製不同的效果的圖形。比如我們可以在呼叫cdc::drawtext時,指定字元顏色與字型。
裝置描述表的主要屬性如下:
上表中,default是裝置描述表的預設值。
最常用來定義裝置描述表屬性的cdc函式是selectobject. 它可以選入的物件主要有6個物件,分別是pen,brush,font,bitmap,palette,region
每當從windows中獲取裝置描述表時,裝置描述表都被設定為預設值。如果需要改變可以通過上表中相應函式改變。
gdi將畫素輸出到邏輯顯示平面上時,它不只是簡單地輸出畫素點顏色。相反,它通過一系統的布林運算將輸出畫素點的顏色與輸出目標位置上畫素點顏色合成在一起。它所使用的邏輯關係由裝置描述表當前的繪圖模式確定。使用cdc::setrop2可以更改繪圖模式。預設繪圖模式為r2_copypen,它將畫素點複製到顯示平面上。
下面是gdi繪圖模式
mm_text為預設的對映模式,如果要使用其它的對映模式,可以呼叫cdc::setmapmode來改變預設的對映模式。
在進行繪圖時,可以使用cdc::lptodp將邏輯座標值轉換為裝置座標值,反之,呼叫cdc::dptolp函式可以將裝置座標值轉換為邏輯座標值。
最後,談談「使用者座標值」與「螢幕座標值」。使用者座標值是原點設立在視窗客戶區左上角的裝置座標值。螢幕座標值是原點位於螢幕左上角的裝置座標值。可以呼叫cwnd::clienttoscreen與cwnd::screentoclient函式可實現使用者座標值與螢幕座標值之間的轉換。
一起學程式設計(1)
很久以前就想寫本程式設計的書,但因為人懶,動力比較小,雖然也寫了點,但都比較零散。這次給自己乙個目標,一定要完成這個內心的想法。寫到程式設計,當然離不開程式語言,但這個系列不會採用特定的語言進行,我想盡可能的表達出程式設計的一些本質性的東西,這些本質性的東西對於任何語言,都可以進行表達。這樣就給一些...
一起學C 三
第二章 核心c 第一節,第乙個c 程式。第乙個程式成功執行了,我們來看看 都是由什麼組成的,它們都做了些什麼。using system namespace wrox 1.第1行,using system using是關鍵字,想要使用這個功能,就必須使用using這個關鍵字。c 中有很多關鍵字,每乙個...
一起學python(三)
今天主要寫一下迴圈語句,while while else for in和for in else 1.while語句 語法 while 迴圈條件 執行語句 現在我們看一下示例如下所示 示例一 遍歷列表username username lisa nancy tom i 0 while i按照上面的 我...