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