MFC控制項自繪之 七

2021-06-20 07:12:57 字數 1697 閱讀 1497



mfc中的cdc,cclientdc,cpaintdc,cwindowdc的區別 cdc是windows繪圖裝置的基類。

cclientdc: 

(1)(客戶區裝置上下文)用於客戶區的輸出,與特定視窗關聯,可以讓開發者訪問目標視窗中客戶區,其建構函式中包含了getdc,析構函式中包含了releasedc。

cpaintdc: 

(1)用於響應視窗重繪訊息(wm_paint)是的繪圖輸出。 

(2)cpaintdc在建構函式中呼叫beginpaint()取得裝置上下文,在析構函式中呼叫endpaint()釋放裝置上下文。 endpaint()除了釋放裝置上下文外,還負責從訊息佇列中清除wm_paint訊息。因此,在處理視窗重畫時,必須使用cpaintdc,否則 wm_paint訊息無法從訊息佇列中清除,將引起不斷的視窗重畫。

(3)cpaintdc也只能用在wm_paint訊息處理之中。

cwindowdc: 

(1)可在非客戶區繪製圖形,而cclientdc,cpaintdc只能在客戶區繪製圖形。 

(2)座標原點是在螢幕的左上角,cclientdc,cpaintdc下座標原點是在客戶區的左上角。 

(3)關聯一特定視窗,允許開發者在目標視窗的任何一部分進行繪圖,包含邊界與標題,這種dc同wm_ncpaint訊息一起傳送。 **********= 

系統何時傳送wm_paint訊息? 

系統會在多個不同的時機傳送wm_paint訊息:當第一次建立乙個視窗時,當改變視窗的大小時,當把視窗從另乙個視窗背後移出時,當最大化或最小 化視窗時,等等,這些動作都是由系統管理的,應用只是被動地接收該訊息,在訊息處理函式中進行繪製操作;大多數的時候應用也需要能夠主動引發視窗中的繪製 操作,比如當視窗顯示的資料改變的時候,這一般是通過invalidaterect和invalidatergn函式來完成的。 invalidaterect和invalidatergn把指定的區域加到視窗的update region中,當應用的訊息佇列沒有其他訊息時,如果視窗的update region不為空時,系統就會自動產生wm_paint訊息。 

系統為什麼不在呼叫invalidate時傳送wm_paint訊息呢?又為什麼非要等應用訊息隊列為空時才傳送wm_paint訊息 呢?這是因為系統把在視窗中的繪製操作當作一種低優先順序的操作,於是盡可能地推後做。不過這樣也有利於提高繪製的效率:兩個wm_paint訊息之間通過 invalidaterect和invaliatergn使之失效的區域就會被累加起來,然後在乙個wm_paint訊息中一次得到更新,不僅能避免多次 重複地更新

同一區域,也優化了應用的更新操作。像這種通過invalidaterect和invalidatergn來使視窗區域無效,依賴於系統在合適 的時機傳送wm_paint訊息的機制實際上是一種非同步工作方式,也就是說,在無效化視窗區域和傳送wm_paint訊息之間是有延遲的;有時候這種延遲 並不是我們希望的,這時我們當然可以在無效化視窗區域後利用sendmessage 傳送一條wm_paint訊息來強制立即重畫,但不如使用windows gdi為我們提供的更方便和強大的函式:updatewindow和redrawwindow。updatewindow會檢查視窗的update region,當其不為空時才傳送wm_paint訊息;redrawwindow則給我們更多的控制:是否重畫非客戶區和背景,是否總是傳送 wm_paint訊息而不管update region是否為空等。 說明:在繪圖時推薦使用cclientdc,cpaintdc和cwindowdc物件,而不推薦直接使用cdc物件。

MFC之自繪控制項

在描繪mfc介面時,mfc自帶的控制項樣式是絕對不滿足介面的需求的。所以我們就要在mfc自帶控制項基礎上對控制項樣式進行重繪。在採用自繪前介面樣式 採用自繪後介面樣式 是不是自繪控制項後看起來正常了很多?自繪控制項的步驟 我們以做乙個關閉按鈕為例 先建立乙個mfc類繼承自cbutton。給這個類新增...

MFC之自繪控制項

在描繪mfc介面時,mfc自帶的控制項樣式是絕對不滿足介面的需求的。所以我們就要在mfc自帶控制項基礎上對控制項樣式進行重繪。在採用自繪前介面樣式 採用自繪後介面樣式 是不是自繪控制項後看起來正常了很多?自繪控制項的步驟 我們以做乙個關閉按鈕為例 先建立乙個mfc類繼承自cbutton。給這個類新增...

MFC自繪控制項

1.c 中drawitem 函式不被呼叫的問題 自繪乙個cmybutton的時候,在drawitem 中改變了button的顏色,但是在程式執行時,drawitem 函式並沒有被執行,原因在於按鈕的型別並不是bs ownerdraw,所以我們需要把它改為 所有者繪製 解決方法 可以過載乙個presu...