InvalidateRect中的「部分區域」理解

2021-05-17 15:57:08 字數 995 閱讀 2754

sandrer問:經常看到書上、網上的資料說 invalidaterect 能使視窗中部分區域無效

呼叫 updatewindow() 就能檢測程式的無效區域,然後傳送 wm_paint 訊息給視窗

但是一般我做程式的時候,在 wm_paint 訊息的處理過程中的**都是畫整個視窗客戶區的

invalidaterect 對我的程式來說是不是沒用(因為每次處理 wm_paint 的時候都是整個客戶區重畫)?

程式設計都幾年了,自己也經常做一些視窗繪製的工作

但就是不能理解這個部分區域該怎麼畫

難道自己要在 wm_paint 中首先獲得需要更新的矩形範圍,然後只畫那一部分上去嗎?

還是說在整個客戶區需要重畫的時候,畫好後把客戶區的圖形儲存下來,然後需要部分重畫的時候,就在這個被儲存的圖形中剪接相應的矩形上去呢?但是在 wm_paint 中如何判斷需要重畫的區域是整個客戶區的矩形區域呢?

是否使用 getupdaterect() 函式來獲得,然後與客戶區域的矩形相比較?

但是如果像上面說的,是從儲存的圖象中剪接出來,那麼如果我在某些操作中更改了客戶區圖形,打算只更新這個區域的話,那麼不就沒用?還得整個客戶區重新畫然後再儲存。

那麼究竟這個部分重畫是怎麼實現的?

cnzdgs答:invalidaterect是將視窗中的一塊矩形區域標註為「無效」,系統會不斷向視窗傳送wm_paint訊息令其重繪。在響應wm_paint訊息時,需要呼叫beginpaint獲取dc來進行重繪。該函式會合併所有「無效」區域,對dc進行裁剪,將整個視窗標註為「有效」,清除wm_paint訊息。dc經裁剪之後,在進行繪製時,超出dc範圍的操作將不被處理,所以即使在響應wm_paint訊息時繪製的是整個視窗,而實際上繪製的也只是「無效」區域。恰當地使用invalidaterect進行重新整理比重新整理整個視窗的效率要高。在wm_paint訊息時,應盡量根據paintstruct結構中rcpaint指定的矩形來處理重繪,減少執行不必要的**,從而提高效率。

理解InvalidateRect函式

bool invalidaterect in hwnd hwnd,in const rect lprect,in bool berase 該函式呼叫後會產生 wm paint訊息 hwnd 哪個視窗要更新 為null表示所有視窗 不僅僅是本程式視窗 不推薦設成null lprect 要更新的矩形區域...

linux中 中括號 中的判斷引數

源自 http www.diybl.com course 6 system linux linuxjs 20081117 151774.html b file 若檔案存在且是乙個塊特殊檔案,則為真 c file 若檔案存在且是乙個字元特殊檔案,則為真 d file 若檔案存在且是乙個目錄,則為真 e...

從HIVE中中查詢

從hive資料庫查詢文件 by ymd 拼接sql語句 string sql select from doc file where contains name wildcard 拼接名稱查詢語句 if stringutils.isnoneempty unstructuredbean.getname ...