個人在實際使用中的體會(基於WINCE),不具有權威性。
1、GetUpdateRect是獲得需要重新整理的無效地區,在調用了InvalidRect後可以用這個函數來獲得無效地區,但是如果在之前調用了BeginPaint/EndPaint則取到的無效地區為空白,這也是為什麼要在WM_PAINT中調用BeginPaint的原因。在需要做局部重新整理的時候這個函數很有用。
2、GetClipBox是獲得裁剪地區大小,在很多時候最終效果是和GetUpdateRect相同的。但是有兩點不太相同的
1)在InvalidateRect觸發WM_PAINT後直接調用GetClipBox取得的可顯示地區是和GetUpdateRect取得的無效地區是一樣的
2)看GetClipBox的傳回值(NULLREGION、SIMPLEREGION、COMPLEXREGION、RGN_ERROR)可以得知,第一種和第二種情況和GetUpdateRect相同(無效地區無或有),而第三種情況在需要進行複雜不規則圖形局部重新整理時很有用也更有效率,舉個簡單的例子:在螢幕左上方和右下角各有一個矩形,在InvalidRect後如果不調用UpdateWindow,則系統會取兩個矩形的最大化地區(也就是全螢幕)並觸發WM_PAINT,此時GetUpdateRect獲得的無效地區也就是全屏無效地區,應用程式是不知道實際重新整理地區的;GetClipBox儘管也是返回的全屏地區,但是在建立裁剪區(CreateRectRgnIndirect)並選入(SelectClipRgn)後,應用程式儘管也不知道實際重新整理地區但最終的效果只會重新整理兩個角的矩形。關於這一點是在實際開發中得知的,這種情況下SelectClipRgn傳回值是COMPLEXREGION,我猜測有可能在CreateRectRgnIndirect的時候系統內部查詢了一下實際無效地區再建立並組合剪裁區(這個猜測不知道是不是對的),或者SelectClipRgn取得是CreateRectRgnIndirect地區和InvalidateRect地區的交集
補充:根據BitBlt在貼圖的時候如果是有效地區則跳過來看,應該是GDI的最佳化機制,這個與region關係不大。所以提倡在WM_PAINT中用BeginPaint來畫圖的深層次目的就是為了利用GDI的最佳化機制進行無效地區管理及局部繪圖提高效率,而用GetDC主動畫圖獲得的是全屏無效地區,想局部重新整理就必須使用者自已來管理無效地區或使用裁剪地區功能。GetUpdateRect和GetUpdateRgn獲得的資料應該是系統記錄的,在BeginPaint後就被reset了