[英]Static controls slightly flicker when main window is resized
我在主窗口的WM_PAINT
處理程序中要實現一個復雜的繪畫。
我提交了下面的圖片進行說明:
主窗口具有樣式為SS_NOTIFY
靜態控件,而不是按鈕。
當用戶單擊它們時,程序中會發生某些動作。
下圖顯示了主窗口中靜態控件的位置:
橙色面板上的Map是EMF
文件,左上和右上徽標是PNG
文件,其他圖片是位圖。
為了實現此任務,我決定在WM_PAINT
繪制整個圖片,並在與之對應的圖片上放置不可見的靜態控件。
因此,我只在WM_CTLCOLORSTATIC
處理程序中返回NULL_BRUSH
,如下所示:
case WM_CTLCOLORSTATIC:
return (LRESULT)( (HBRUSH)GetStockObject(NULL_BRUSH) );
我在Windows XP
上工作,使用MS Visual Studio C++ 2008 Express Edition
和pure Win32 API
。
注意事項 :由於VS Express版沒有資源編輯器,因此可使用ResEdit從以下位置創建資源文件和資源頭: http : //www.resedit.net/ 。
調整窗口大小時,靜態控件會稍微閃爍。
我已經處理了WM_ERASEBKGND
(返回(LRESULT)1
),並且從我的窗口類中排除了樣式CS_VREDRAW
和CS_HREDRAW
因此不應因此而引起閃爍。
我的窗口沒有WS_CLIPCHILDREN
樣式。
編輯:為了回應下面的評論,我解釋了為什么我的窗口沒有設置這種樣式:
問題在於,桌面圖片的一部分可以在靜態控件的位置看到。
為了避免閃爍,我為兩個處理程序都實現了雙重緩沖。
我使用了從此處下載的工具GDIView
: http : GDIView
來跟蹤GDI leaks
。
每次我調整窗口大小時, GDIView
的區域列都會顯示+4,這意味着我泄漏了區域。
我不知道這怎么可能,因為我沒有使用對區域進行操作的API。
為了確切說明我所面臨的問題,我制作了一個演示應用程序,並提供了詳盡的注釋: http : //www.filedropper.com/geotermistgrafika
我相信這是一種更有效的方法,然后發布代碼,因為它會占用太多空間。
如何在演示項目中修改代碼以消除閃爍?
我的方法錯誤嗎?如果是,正確的方法是什么?
謝謝。 問候。
調整主窗口大小后, WM_SIZE
處理程序將移動靜態子窗口。
移動子窗口時,Windows會自動將子控件的客戶區從舊位置復制到新位置。
然后,主窗口將在WM_PAINT
處理程序中重新繪制自身。
換句話說,當調整窗口大小時,所有靜態控件將移至其新位置,然后重新繪制窗口的其余部分。 缺乏同步表現為閃爍。
您可以通過將SWP_NOCOPYBITS
標志傳遞給SetWindowPos
來避免這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.