ActiveX 控制元件重繪無效問題,用CClientDC 而不是CPaintDC

ITBread發表於2018-06-22

ActiveX 控制元件重繪子控制元件時,用Invalid()會出現無效的情況即不會更新介面。


OnPaint 方法裡,是用的 CPaintDC,經測試無效,後換CClientDC,發現可以,百度查他們的區別:

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訊息一起傳送。

說明:在繪圖時推薦使用CClientDC,CPaintDC和CWindowDC物件,而不推薦直接使用CDC物件。

相關文章