Visual C++法式設計中Windows GDI貼圖閃耀的處理辦法。本站提示廣大學習愛好者:(Visual C++法式設計中Windows GDI貼圖閃耀的處理辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Visual C++法式設計中Windows GDI貼圖閃耀的處理辦法正文
本文實例講述了Visual C++法式設計中Windows GDI貼圖閃耀的處理辦法。分享給年夜家供年夜家參考。詳細以下:
普通的windows 龐雜的界面須要應用多層窗口並且要用貼圖來丑化,所以弗成防止在窗口挪動或許轉變年夜小的時刻湧現閃耀。
先來談談閃耀發生的緣由
緣由一:
假如熟習顯卡道理的話,挪用GDI函數向屏幕輸入的時刻其實不是連忙就顯示在屏幕
上只是寫到了顯存裡,而顯卡每隔一段時光把顯存的內容輸入到屏幕上,這就是刷新周期。
普通顯卡的刷新周期是 1/80秒閣下,詳細數字可以本身設置的。
如許成績就來了,普通繪圖都是先畫配景色,然後再把內容畫上去,假如這兩次操作不在統一個
刷新周期內完成,那末給人的視覺感觸感染就是,先看到只要配景色的圖象,然後看到畫上內容的圖象,
如許就會感到閃耀了。
處理辦法:
盡可能快的輸入圖象,使輸入在一個刷新周期內完成,假如輸入內容許多比擬慢,那末采取
內存緩沖的辦法,先把要輸入的內容在內存預備好,然後一次輸入到顯存。要曉得一次API挪用普通可以
在一個刷新周期內完成。
關於GDI,用創立內存DC的辦法便可以了
緣由二:
龐雜的界面有多層窗口構成,當windows在窗口轉變年夜小的時刻是先重畫父窗口,然後重畫子窗口,子父
窗口重畫的進程普通沒法在一個刷新周期內完成,所以會出現閃耀。
我們曉得父窗口上被子窗口蓋住的部門其實沒需要重畫的
處理辦法:
給窗口加個作風 WS_CLIPCHILDREN ,如許父窗口上被子窗口蓋住的部門就不會重畫了。
假如同級窗口之間有堆疊,那末須要再加上 WS_CLIPSIBLINGS 作風
緣由三:
有時刻須要在窗口上應用一些控件,好比IE,當你的窗口轉變年夜小的時刻IE會閃耀,即便你有了WS_CLIPCHILDREN
也沒用。緣由在於窗口的類作風有CS_HREDRAW 或許 CS_VREDRAW,這兩個作風表現窗口在寬度或許高度變更的時刻
重畫,然則如許就會惹起IE閃耀
處理辦法:
注冊窗口類的時刻不要應用這兩個作風,假如窗口須要在轉變年夜小的時刻重畫,那末可以在WM_SIZE的時刻
挪用RedrawWindow。
緣由四:
界面上窗口許多,並且轉變年夜小時許多窗口都要挪動和轉變年夜小,假如應用MoveWindow或許SetWindowPos兩個API來
轉變窗口的年夜小和地位,因為他們是期待窗口重畫完成後才前往,所以進程很慢,如許視覺後果便可能會閃耀。
處理辦法:
應用以下API來處置窗口挪動,BeginDeferWindowPos, DeferWindowPos,EndDeferWindowPos
先挪用 BeginDeferWindowPos 設定須要挪動的窗口的個數
應用DeferWindowPos,來挪動窗口,這個API其實不真的形成窗口挪動
EndDeferWindowPos 一次性完成一切窗口的年夜小和地位的轉變。
有個處所要特殊留意,要細心盤算清晰要挪動若干個窗口,BeginDeferWindowPos設定
的個數必定要和現實的個數分歧,不然在Win9x下,假如現實挪動的窗口數多於挪用BeginDeferWindowPos
時設定的個數,能夠會形成體系瓦解。在Windows NT系列下不會有如許的成績。
願望本文所述對年夜家的Visual C++法式設計有所贊助。