簡體   English   中英

調整主窗口大小時,靜態控件會稍微閃爍

[英]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 Editionpure Win32 API

注意事項 :由於VS Express版沒有資源編輯器,因此可使用ResEdit從以下位置創建資源文件和資源頭: http : //www.resedit.net/

問題:

調整窗口大小時,靜態控件會稍微閃爍。

我為解決問題所做的努力:

我已經處理了WM_ERASEBKGND (返回(LRESULT)1 ),並且從我的窗口類中排除了樣式CS_VREDRAWCS_HREDRAW因此不應因此而引起閃爍。

我的窗口沒有WS_CLIPCHILDREN樣式。

編輯:為了回應下面的評論,我解釋了為什么我的窗口沒有設置這種樣式:

問題在於,桌面圖片的一部分可以在靜態控件的位置看到。

為了避免閃爍,我為兩個處理程序都實現了雙重緩沖。

我使用了從此處下載的工具GDIViewhttp : 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM