Windows使用者介面程式設計中的介面閃爍問題

2021-09-07 22:53:16 字數 1862 閱讀 3625

使用者介面出現閃爍自然害處多多,首先它使得你的程式看起來不專業,甚至有不穩定的嫌疑,對於追求完美的你這麼會容許它的存在呢;其次閃爍會損害使用者的視力,容易讓使用者產生視覺疲勞。

好了,廢話我不多說了,我們就來發現問題,分析問題,解決問題。

首先說說閃爍的本質,說到本質,就不得不提一些計算機系統結構和windows圖形使用者子系統的一些知識。我們知道,在計算機記憶體中有乙個區域叫做視訊記憶體,而顯示卡則每過一些毫秒就從掃瞄視訊記憶體,然後根據操作顯示器來繪製乙個個象素,因此每過一些毫秒顯示器顯示的內容就會重新設定一遍,由於這是硬體操作,非常快,若畫面內容沒有變化,則人類肉眼是看不到這個重新整理的,此時使用者介面是沒有任何閃爍。

某個時刻,應用程式需要繪製使用者介面,首先需要清空繪製容器,因此將視訊記憶體一大片區域設定為白色,應用程式剛完成了清空操作,還每來得及繪製內容時,顯示卡就重新整理了,很快顯示器上顯示了一大片白色。同時,應用程式開始繪製內容,應用程式執行緩慢,它化了20毫秒繪製了文件的上半身,文件上半身主要為紅色,剛繪製了上半身,顯示卡就好不留情的進行重新整理,很快顯示器上顯示了一半的文件,剛才一半的白色大半變成了紅色,此時使用者看來,顯示器一下變成一片白,然後很快一半變成紅色,此時顯示器內容產生了兩次大面積的內容變幻,然後應用程式又化了20毫秒顯示了文件的下半身,文件下半身主要為綠色,此時顯示卡進行重新整理,顯示器上另一半還殘存的白色又變成綠色。由於應用程式繪製文件完畢,因此不再修改視訊記憶體,此時顯示器的顯示的內容不再發生改變。

在上面的描述中,顯示器首先從花花綠綠變成一片白,20毫秒後一半變成紅色,又20毫秒後另一半變成綠色,如此大面積的顯示內容短期的改變就是所謂的閃爍,此時計算機顯示器就是在折磨使用者的眼睛。

其實從廣義上說,計算機顯示器顯示的內容頻繁的發生大面積的改變都是考驗人類的眼睛。有些人玩一些激烈的3d遊戲,比如雷神cs之類的,若玩的時間長點眼睛就受不了。就是因為這些遊戲程式導致顯示器顯示的內容頻繁的發生大面積的改變。因此遊戲程式也算導致使用者介面閃爍。只不過這種閃爍不算難受。

通過上面的討論,知道了閃爍的根源,於是我們發現了問題,並分析了問題,現在解決問題。在目前的計算機結構中,我們的應用程式只能通過填充視訊記憶體來繪製使用者介面,在這種情況下,對付閃爍的不二法則就是快,應用程式要非常快的修改視訊記憶體。對於每20毫秒進行重新整理操作的顯示卡,若我們的應用程式能在20毫秒內修改視訊記憶體完畢,則在很多情況下顯示卡就只會導致顯示器顯示的內容發生改變,減少閃爍,應用程式填充視訊記憶體前後視訊記憶體的資料進行對比,若資料前後不一致的位元組數越少,顯示器中重新整理操作前後顏色發生改變的象素數就越少,這使用者介面的閃爍就越小。

提高應用程式修改視訊記憶體的速度的方法有很多中,而且windows作業系統為我們做了許多底層的操作。我們知道若乙個窗體被覆蓋後又顯示了,則windows作業系統就會向該窗體傳送重繪訊息,而且還會傳乙個矩形資料,該矩形表示窗體中需要重新整理的區域,應用程式可以根據這個矩形來重新繪製文件的某個部分,這樣就不必要繪製所有的內容,提高繪製速度,減少繪製時間,這就需要進行繪圖**的優化。

在某些情況下,繪圖速度很難優化起來,此時可以採用所謂「雙緩衝」的技術來減少閃爍,應用程式可以在記憶體中建立乙個和螢幕相相容的圖形裝置上下文。該上下文實際上處理乙個儲存在記憶體中的bmp物件,這樣就容許應用程式緩慢地在這個bmp上繪製圖形。應用程式繪製完畢,就用win32api函式bitblt來將bmp填充到視訊記憶體中,bitblt函式速度非常快,足以在螢幕的重新整理周期內完成繪圖,這樣能基本上避免閃爍。但雙緩衝也有缺點,首先增加程式複雜度,其次要消耗一些記憶體,還有它讓整個繪圖時間變長,導致使用者進行滾動時會產生「介面沉重感」,有「慣性」,此外還讓人偷懶而不注意繪圖操作的優化。

俗話說,說得容量做到難,程式設計也一樣,本文中對付閃爍的說的輕巧,但在實際程式設計中,閃爍一直是圖形化使用者介面程式設計的老大難問題,需要精心的設計程式結構,優化**,提高速度。這需要靠很多的理論知識和深厚的程式設計功底,這些需要長期的程式設計實踐。

Windows的使用者管理中的使用者模擬

使用者模擬 impersonation 是自從 windows 2000 時引入的強大的功能。windows 系統甚至允許使用者模擬 impersonation 被用在客戶端 服務端的程式設計模型裡面。在傳統模式下,比如乙個遠端伺服器可以提供檔案 印表機或者資料庫服務,希望使用這些資源的客戶端可以傳...

Windows介面程式設計 控制項問題

windows介面程式設計過程中,有些控制項需要初始化才能使用,下面列舉了需要初始化的控制項。初始化函式 initcommoncontrol icex initcommoncontrols 需要初始化的控制項 animate icc animate class statusbar,trackbar,...

Windows 程式設計中的問題

預設當前工作目錄 vcxproj 檔案所在的目錄,所以在設定相對路徑時需要根據這個檔案所在位置來設定。而直接執行exe時是相對於exe所在的目錄,或者執行exe時的工作目錄。執行庫配置 將相關的dll檔案新增到exe所在目錄 將dll檔案新增到 c windows system32 32bit 或者...