CPaintDC類與 CClientDC類的區別

2021-06-19 17:37:05 字數 1021 閱讀 1351

cpaintdc 與 cclientdc

cpaintdc 與 cclientdc都是從cdc類繼承而來。所以,這兩個類的外在行為高度的抽象一致。以致於初者會誤以為兩者的使用可以替換(或者說mfc初學者很容易將兩者的使用混淆)。事實上,mfc將兩者都從cdc繼承,是為了讓使用者在不同的場景下更加方便,高效的使用dc。如果不理解兩者內部運作原理,混淆使用,就會出現螢幕繪製不能達到客戶呼叫結果要求,螢幕重新整理效率下降等一系列問題。

兩者有以下區別:

1.建構函式和析構函式內部呼叫的區別。

cpaintdc類:

cpaintdc::cpaintdc(cwnd* pwnd)

cpaintdc::~cpaintdc()

cpaintdc類的建構函式和析構函式分別呼叫cwnd::beginpaint()和cwnd::endpaint()函式,則這兩個函式是為了響應wm_paint訊息的,它們是成對使用的。這就決定了cpaintdc類應該只能在cwnd派生視窗類中的wm_paint訊息處理函式onpaint()函式中使用。

由於cwnd::endpaint()函式除了釋放dc外,還額外的負責從訊息佇列中刪除當前wm_paint訊息,所以,如果在onpaint()函式中錯誤的使用cclientdc類重繪,將會引起不斷的視窗重繪。

cclientdc類:

cclientdc::cclientdc(cwnd* pwnd)

cclientdc::~cclientdc()

cclientdc類的建構函式和析構函式分別呼叫cwnd::getdc()和cwnd::releasedc()函式,它只能在視窗的客戶區中使用(客戶區:視窗中除了邊框、標題欄、選單欄以及狀態列外的中間部分)。它是響應視窗中除wm_paint訊息之外的重繪訊息(如鍵盤輸入時繪製文字、滑鼠移動時繪圖)時使用。

檢視過cpaintdc 類和 cclientdc類的建構函式和析構函式以後,你就會知道,在使用上述兩個dc類的時候,應該是在函式中將其申明為函式的區域性變數使用,以便在使用完畢後,由系統自動呼叫析構函式完成相關函式(endpaint()和releasedc()函式)的呼叫。

類與類關係

表現為繼承或實現關係 is a 具體形式為類與類之間的繼承關係,介面與介面之間的繼承關係,類對介面的實現關係。指的是乙個類 稱為子類 子介面 繼承另外的乙個類 稱為父類 父介面 的功能,並可以增加它自己的新功能的能力,uml中實現用三角形箭頭和實線表示 指的乙個類實現介面 可以是多個 的功能,uml...

類值類與類指標類

類值類 行為像值的 class a a const a a ps new string a.ps i a.i 每個類物件有自己的乙份資源拷貝 a operator const a rhs a private string ps int i 一種優化拷貝賦值運算子的方法 copy and swap c...

類模板與模板類

1.類模板與模板類的概念 什麼是類模板乙個類模板 也稱為類屬類或類生成類 允許使用者為類定義一種模式,使得類中的某些資料成員 默寫成員函式的引數 某些成員函式的返回值,能夠取任意型別 包括系統預定義的和使用者自定義的 如果乙個類中資料成員的資料型別不能確定,或者是某個成員函式的引數或返回值的型別不能...