資源描述:
《Windows屏幕保護程序》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、VC++程序設(shè)計項目實踐賈振華第2章Windows屏幕保護程序?qū)W習(xí)目標:1.屏幕保護基本原理2.如何提高繪圖效率3.VC++中對鼠標的控制4.加載圖片的方法2.1屏幕保護的基本知識1.屏幕保護程序原理屏幕保護程序就是普通的可執(zhí)行程序(.exe)。只不過Windows把它換了一個擴展名(.scr),放在了系統(tǒng)目錄下,由操作系統(tǒng)調(diào)用而已。對WindowsNT和Windows2000這個目錄是C:WINNTsystem32,對于Win95,Win98這個目錄是C:Windows和C:Windowssys
2、tem。2.1屏幕保護的基本知識2.屏幕保護程序激活的條件(1)在規(guī)定時間內(nèi)沒有鼠標或鍵盤輸入(2)當(dāng)前的活動窗口是標準的WINDOWS應(yīng)用(3)如果當(dāng)前活動的程序接管了字參數(shù)wParam值為SC_SCREENSAVE的WM_SYSCOMMAND消息并且不傳遞到DefWindowProc()函數(shù)就可以禁止屏幕保護程序。2.1屏幕保護的基本知識3.屏幕保護程序的作用用戶可以通過控制面板選擇、設(shè)置和預(yù)覽需要的屏幕保護程序,并可以配置屏幕保護程序的參數(shù)。當(dāng)鼠標和鍵盤空閑一段時間后,屏幕保護程序即運行。屏幕保護程序
3、主要有兩個作用:(1)避免長時間顯示同一畫面,損壞顯示器。(2)避免屏幕上機密信息的泄露。2.2如何提高繪圖效率2.2.1顯示的圖形為什么會閃爍繪圖過程大多放在OnDraw()函數(shù)或者OnPaint()函數(shù)中,OnDraw()函數(shù)在進行屏幕顯示時是由OnPaint()函數(shù)進行調(diào)用的。當(dāng)窗口由于任何原因需要重繪時,總是先用背景色將顯示區(qū)清除,然后才調(diào)用OnPaint函數(shù),而背景色往往與繪圖內(nèi)容反差很大,這樣在短時間內(nèi)背景色與顯示圖形的交替出現(xiàn),使得顯示窗口看起來在閃。2.2如何提高繪圖效率2.2.1顯示的圖形
4、為什么會閃爍簡單圖形之所以看起來沒有復(fù)雜圖形那么閃是因為復(fù)雜圖形占的面積大,重畫時造成的反差比較大,所以感覺上要閃得厲害一些,但是閃爍頻率要低。那為什么動畫的重畫頻率高,而看起來卻不閃?因為閃爍就是反差,反差越大,閃爍越厲害。而動畫的連續(xù)兩個幀之間的差異很小所以看起來不閃。因此動畫的重畫頻率雖然很高,但看起來卻不閃。但如果在動畫的每一幀中間加一張純白的幀,結(jié)果就不一樣了。2.2如何提高繪圖效率2.2.2如何避免閃爍窗口形成時給窗口的注冊類的背景刷賦值為NULL也可以在形成以后修改背景可以重載OnEraseB
5、kgnd(CDC*pDC)函數(shù),直接返回TRUE這樣背景沒有了,結(jié)果圖形顯示的確不閃了,但是顯示也象前面所說的一樣,變得一團亂。2.2如何提高繪圖效率2.2.2如何避免閃爍為了更好的解決屏幕閃爍的問題,就要用到雙緩存的方法。雙緩沖就是除了在屏幕上有圖形進行顯示以外,在內(nèi)存中也有圖形在繪制??梢园岩@示的圖形先在內(nèi)存中繪制好,然后再一次性的將內(nèi)存中的圖形按照一個點一個點地覆蓋到屏幕上去(這個過程非???,因為是非常規(guī)整的內(nèi)存拷貝)。這樣在內(nèi)存中繪圖時,隨便用什么反差大的背景色進行清除都不會閃,因為看不見。當(dāng)復(fù)制
6、到屏幕上時,因為內(nèi)存中最終的圖形與屏幕顯示圖形差別很小,這樣看起來屏幕就不會閃。2.2如何提高繪圖效率2.2.3雙緩沖的實現(xiàn)首先給出實現(xiàn)的程序,在OnDraw(CDC*pDC)函數(shù)中添加如下代碼:CDCMemDC;//首先定義一個顯示設(shè)備對象CBitmapMemBitmap;//定義一個位圖對象//建立與屏幕顯示兼容的內(nèi)存顯示設(shè)備MemDC.CreateCompatibleDC(NULL);2.2如何提高繪圖效率2.2.3雙緩沖的實現(xiàn)//下面建立一個與屏幕顯示兼容的位圖,位圖的大小可以用窗口的大小MemBi
7、tmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);//將位圖選入到內(nèi)存顯示設(shè)備中//只有選入了位圖的內(nèi)存顯示設(shè)備才有地方繪圖,畫到指定的位圖上CBitmap*pOldBit=MemDC.SelectObject(&MemBitmap);2.2如何提高繪圖效率2.2.3雙緩沖的實現(xiàn)//先用背景色將位圖清除干凈,以白色為例MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));//繪圖MemDC.MoveTo
8、(……);MemDC.LineTo(……);2.2如何提高繪圖效率2.2.3雙緩沖的實現(xiàn)//將內(nèi)存中的圖拷貝到屏幕上進行顯示pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//繪圖完成后的清理MemBitmap.DeleteObject();MemDC.DeleteDC();2.2如何提高繪圖效率2.2.3雙緩沖的實現(xiàn)其中,函數(shù)BitBlt是對指定的源設(shè)備環(huán)境