高程——屏幕保護程序_第1頁
高程——屏幕保護程序_第2頁
高程——屏幕保護程序_第3頁
高程——屏幕保護程序_第4頁
高程——屏幕保護程序_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、高級程序設計語言高級程序設計語言屏幕保護程序 授課教師:楊佳授課教師:楊佳 郵箱:郵箱: 幾種有關幾種有關DC的類的類CDC:與作圖相關的操作都封裝到了:與作圖相關的操作都封裝到了CDC類當中。類當中。 CDC *pDC=GetDC();CClientDC:與窗口客戶區(qū)相關的:與窗口客戶區(qū)相關的DC類,在構造時自動調用類,在構造時自動調用GetDC,在析構時,在析構時 自動調用自動調用ReleaseDC。 CClientDC dc(this);CWindowDC:可以訪問一個窗口的整個屏幕區(qū),包括客戶與非客戶區(qū)域。:可以訪問一個窗口的整個屏幕區(qū),包括客戶與非客戶區(qū)域。 CWindowDC dc

2、(GetParent();/訪問整個窗口屏幕區(qū)訪問整個窗口屏幕區(qū) CWindowDC dc(GetDesktopWindow();/訪問桌面區(qū)。訪問桌面區(qū)。CPaintDC:針對于針對于OnPaint。構造函數(shù)自動調用。構造函數(shù)自動調用BeginPaint,析構函數(shù)自動調,析構函數(shù)自動調用用EndPaint。 繪制直線方法一:繪制直線方法一:如建立名為如建立名為Paint的的MFC單文檔單文檔(SDI)應用程序,為應用程序,為CPaintView添添加加WM_LBUTTONDOWN和和WM_LBUTTONUP消息相應函數(shù),消息相應函數(shù),在在CPaintView中增加數(shù)據(jù)成員中增加數(shù)據(jù)成員CPo

3、int m_Repoint;直線繪制程直線繪制程序如下:序如下:void CPaintView:OnLButtonDown(UINT nFlags, CPoint point) m_Repoint=point;CView:OnLButtonDown(nFlags, point);void CPaintView:OnLButtonUp(UINT nFlags, CPoint point) CClientDC dc(this);dc.MoveTo(m_Repoint);dc.LineTo(point);CView:OnLButtonUp(nFlags, point);繪制直線方法二:繪制直線方法二

4、: CWindowDC dc(GetParent(); dc.MoveTo(m_Repoint); dc.LineTo(point);繪制直線方法三:繪制直線方法三: CWindowDC dc(GetDesktopWindow() ; dc.MoveTo(m_Repoint); dc.LineTo(point);繪制矩形:繪制矩形: CClientDC dc(this); dc.Rectangle(CRect(m_Repoint,point);圖形設備接口圖形設備接口 Windows為設備環(huán)境提供了各種各樣的繪圖工具,為設備環(huán)境提供了各種各樣的繪圖工具,例如用于畫線的例如用于畫線的“畫筆畫筆”

5、、填充區(qū)域的、填充區(qū)域的“畫刷畫刷”以及以及用于繪制文本的用于繪制文本的“字體字體”。MFC封裝了這些工具,并封裝了這些工具,并提供相應的類來作為應用程序的圖形設備接口提供相應的類來作為應用程序的圖形設備接口GDI,這些類有一個共同的抽象基類這些類有一個共同的抽象基類CGdiObject,具體如表,具體如表所示。所示。MFC 的的 GDI 類類類類 名名說說 明明CBitmap“位圖”是一種位矩陣,每一個顯示象素都對應于其中的一個或多個位。用戶可以利用位圖來表示圖像,也可以利用它來創(chuàng)建畫刷。CBrush“畫刷”定義了一種位圖形式的象素,利用它可對區(qū)域內部填充顏色或樣式。CFont“字體”是一種

6、具有某種風格和尺寸的所有字符的完整集合,它常常被當作資源存于磁盤中,其中有一些還依賴于某種設備。CPalette“調色板”是一種顏色映射接口,它允許應用程序在不干擾其他應用程序的前提下,可以充分利用輸出設備的顏色描繪能力。CPen“畫筆”是一種用來畫線及繪制有形邊框的工具,用戶可以指定它的顏色及寬度,并且可以指定它畫實線、點線或虛線等。CRgn“區(qū)域”是由多邊形、橢圓或二者組合形成的一種范圍,可以利用它來進行填充、裁剪以及鼠標點中測試等。 在選擇在選擇GDI對象繪圖時,遵循以下步驟:對象繪圖時,遵循以下步驟: 1.定義一個定義一個GDI對象對象 2.用相應的函數(shù)創(chuàng)建該對象用相應的函數(shù)創(chuàng)建該對象

7、 3.將該對象選入當前設備環(huán)境中將該對象選入當前設備環(huán)境中 4.繪圖繪圖 5.回復設備環(huán)境中原來的回復設備環(huán)境中原來的GDI對象。對象。用新畫筆繪制直線用新畫筆繪制直線CClientDC dc(this);CPen pen(PS_DASH,1,RGB(0,25,255);CPen *oldpen=dc.SelectObject(&pen);dc.MoveTo(m_Repoint);dc.LineTo(point);dc. SelectObject(oldpen);用新畫刷填充矩形顏色用新畫刷填充矩形顏色CBrush brush(RGB(255,255,0);CClientDC dc(t

8、his);dc.SelectObject(&brush);dc.Rectangle(CRect(m_Repoint, point);用新畫刷填充橢圓顏色用新畫刷填充橢圓顏色CBrush brush(RGB(255,255,0);CClientDC dc(this);dc.SelectObject(&brush);dc.Ellipse(m_Repoint.x-20,m_Repoint.y-20, point.x-40,point.y-50);屏幕保護的基本知識屏幕保護的基本知識1 1屏幕保護程序原理屏幕保護程序原理 屏幕保護程序就是普通的可執(zhí)行程序(屏幕保護程序就是普通的可執(zhí)行程

9、序(.exe.exe)。只不過)。只不過WindowsWindows把它換了一個擴展名(把它換了一個擴展名(.scr.scr),放在了系統(tǒng)目錄下,由操),放在了系統(tǒng)目錄下,由操作系統(tǒng)調用而已。對作系統(tǒng)調用而已。對Windows NTWindows NT和和Windows 2000Windows 2000這個目錄是這個目錄是C:WINNTsystem32C:WINNTsystem32,對于,對于Win95Win95,Win98Win98這個目錄是這個目錄是C:WindowsC:Windows和和C:WindowssystemC:Windowssystem。屏幕保護的基本知識屏幕保護的基本知識2

10、2屏幕保護程序激活的條件屏幕保護程序激活的條件(1 1)在規(guī)定時間內沒有鼠標或鍵盤輸入)在規(guī)定時間內沒有鼠標或鍵盤輸入(2 2)當前的活動窗口是標準的)當前的活動窗口是標準的WINDOWSWINDOWS應用應用(3 3)如果當前活動的程序接管了字參數(shù))如果當前活動的程序接管了字參數(shù) wParam wParam 值為值為SC_SCREENSAVE SC_SCREENSAVE 的的WM_SYSCOMMAND WM_SYSCOMMAND 消息并且不傳遞到消息并且不傳遞到 DefWindowProcDefWindowProc()函數(shù)就可以禁止屏幕保護程序。()函數(shù)就可以禁止屏幕保護程序。屏幕保護的基本

11、知識屏幕保護的基本知識3 3屏幕保護程序的作用屏幕保護程序的作用 用戶可以通過控制面板選擇、設置和預覽需要的屏幕保護程序用戶可以通過控制面板選擇、設置和預覽需要的屏幕保護程序,并可以配置屏幕保護程序的參數(shù)。當鼠標和鍵盤空閑一段時,并可以配置屏幕保護程序的參數(shù)。當鼠標和鍵盤空閑一段時間后,屏幕保護程序即運行。屏幕保護程序主要有兩個作用:間后,屏幕保護程序即運行。屏幕保護程序主要有兩個作用: (1)(1)避免長時間顯示同一畫面,損壞顯示器。避免長時間顯示同一畫面,損壞顯示器。 (2)(2)避免屏幕上機密信息的泄露。避免屏幕上機密信息的泄露。如何提高繪圖效率 顯示的圖形為什么會閃爍 繪圖過程大多放在

12、繪圖過程大多放在OnDrawOnDraw()函數(shù)或者()函數(shù)或者OnPaintOnPaint()函數(shù)中,()函數(shù)中,OnDrawOnDraw()函數(shù)在進行屏幕顯示時是由()函數(shù)在進行屏幕顯示時是由OnPaintOnPaint()函數(shù)進行調()函數(shù)進行調用的。當窗口由于任何原因需要重繪時,總是先用背景色將顯用的。當窗口由于任何原因需要重繪時,總是先用背景色將顯示區(qū)清除,然后才調用示區(qū)清除,然后才調用OnPaintOnPaint函數(shù),而背景色往往與繪圖內容函數(shù),而背景色往往與繪圖內容反差很大,這樣在短時間內背景色與顯示圖形的交替出現(xiàn),使反差很大,這樣在短時間內背景色與顯示圖形的交替出現(xiàn),使得顯示窗

13、口看起來在閃。得顯示窗口看起來在閃。如何提高繪圖效率 顯示的圖形為什么會閃爍 簡單圖形之所以看起來沒有復雜圖形那么閃是因為復雜圖形占簡單圖形之所以看起來沒有復雜圖形那么閃是因為復雜圖形占的面積大,重畫時造成的反差比較大,所以感覺上要閃得厲害的面積大,重畫時造成的反差比較大,所以感覺上要閃得厲害一些,但是閃爍頻率要低。一些,但是閃爍頻率要低。 那為什么動畫的重畫頻率高,而看起來卻不閃?因為閃爍就是那為什么動畫的重畫頻率高,而看起來卻不閃?因為閃爍就是反差,反差越大,閃爍越厲害。而動畫的連續(xù)兩個幀之間的差反差,反差越大,閃爍越厲害。而動畫的連續(xù)兩個幀之間的差異很小所以看起來不閃。因此動畫的重畫頻率

14、雖然很高,但看異很小所以看起來不閃。因此動畫的重畫頻率雖然很高,但看起來卻不閃。但如果在動畫的每一幀中間加一張純白的幀,結起來卻不閃。但如果在動畫的每一幀中間加一張純白的幀,結果就不一樣了。果就不一樣了。如何提高繪圖效率 如何避免閃爍 為了更好的解決屏幕閃爍的問題,就要用到雙緩沖的方法。雙為了更好的解決屏幕閃爍的問題,就要用到雙緩沖的方法。雙緩沖就是除了在屏幕上有圖形進行顯示以外,在內存中也有圖緩沖就是除了在屏幕上有圖形進行顯示以外,在內存中也有圖形在繪制??梢园岩@示的圖形先在內存中繪制好,然后再一形在繪制。可以把要顯示的圖形先在內存中繪制好,然后再一次性的將內存中的圖形按照一個點一個點地覆

15、蓋到屏幕上去(次性的將內存中的圖形按照一個點一個點地覆蓋到屏幕上去(這個過程非???,因為是非常規(guī)整的內存拷貝)。這樣在內存這個過程非??欤驗槭欠浅R?guī)整的內存拷貝)。這樣在內存中繪圖時,隨便用什么反差大的背景色進行清除都不會閃,因中繪圖時,隨便用什么反差大的背景色進行清除都不會閃,因為看不見。當復制到屏幕上時,因為內存中最終的圖形與屏幕為看不見。當復制到屏幕上時,因為內存中最終的圖形與屏幕顯示圖形差別很小,這樣看起來屏幕就不會閃。顯示圖形差別很小,這樣看起來屏幕就不會閃。在窗口中貼圖在窗口中貼圖1、創(chuàng)建位圖、創(chuàng)建位圖CBitmap bitmap;bitmap.LoadBitmap(IDB_BI

16、TMAP1);2、創(chuàng)建兼容、創(chuàng)建兼容DCCDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);3、將位圖選到兼容、將位圖選到兼容DC中中dcCompatible.SelectObject(&bitmap);4、將兼容、將兼容DC中的位圖貼到當前中的位圖貼到當前DC中。中。CRect rect(0, 0, 0, 0);GetClientRect(&rect);pDC-BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOP

17、Y);位圖兼容兼容DC當前當前DC如何提高繪圖效率 雙緩沖的實現(xiàn) 其中,函數(shù)其中,函數(shù)BitBltBitBlt是對指定的源設備環(huán)境區(qū)域中的像素進行位是對指定的源設備環(huán)境區(qū)域中的像素進行位塊(塊(bit_blockbit_block)轉換,以傳送到目標設備環(huán)境。)轉換,以傳送到目標設備環(huán)境。函數(shù)原型:函數(shù)原型:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,nWidth,int nHei

18、ght,HDC hdcSrc, int nXSrc,int nYSrc,DWORD dwRop) int nXSrc,int nYSrc,DWORD dwRop);其中,各參數(shù)含義如下所示:其中,各參數(shù)含義如下所示:如何提高繪圖效率 雙緩沖的實現(xiàn) hdcDesthdcDest:指向目標設備環(huán)境的句柄。:指向目標設備環(huán)境的句柄。 nXDestnXDest:指定目標矩形區(qū)域左上角的:指定目標矩形區(qū)域左上角的X X軸邏輯坐標。軸邏輯坐標。 nYDestnYDest:指定目標矩形區(qū)域左上角的:指定目標矩形區(qū)域左上角的Y Y軸邏輯坐標。軸邏輯坐標。 nWidthnWidth:指定源和目標矩形區(qū)域的邏輯寬

19、度。:指定源和目標矩形區(qū)域的邏輯寬度。 nHeightnHeight:指定源和目標矩形區(qū)域的邏輯高度。:指定源和目標矩形區(qū)域的邏輯高度。 hdcSrchdcSrc:指向源設備環(huán)境的句柄。:指向源設備環(huán)境的句柄。如何提高繪圖效率 雙緩沖的實現(xiàn) nXSrcnXSrc:指定源矩形區(qū)域左上角的:指定源矩形區(qū)域左上角的X X軸邏輯坐標。軸邏輯坐標。 nYSrcnYSrc:指定源矩形區(qū)域左上角的:指定源矩形區(qū)域左上角的Y Y軸邏輯坐標。軸邏輯坐標。 dwRopdwRop:指定光柵操作代碼。這些代碼將定義源矩形區(qū)域的顏色:指定光柵操作代碼。這些代碼將定義源矩形區(qū)域的顏色數(shù)據(jù),如何與目標矩形區(qū)域的顏色數(shù)據(jù)組合

20、以完成最后的顏色數(shù)據(jù),如何與目標矩形區(qū)域的顏色數(shù)據(jù)組合以完成最后的顏色。如何提高繪圖效率 雙緩沖的實現(xiàn)首先給出實現(xiàn)的程序,在首先給出實現(xiàn)的程序,在OnDraw(CDC OnDraw(CDC * *pDC)pDC)函數(shù)中添加如下代碼:函數(shù)中添加如下代碼:CDC MemDC; /CDC MemDC; /首先定義一個顯示設備對象首先定義一個顯示設備對象CBitmap MemBitmap; /CBitmap MemBitmap; /定義一個位圖對象定義一個位圖對象/建立與屏幕顯示兼容的內存顯示設備建立與屏幕顯示兼容的內存顯示設備MemDC.CreateCompatibleDC(NULL);MemDC.

21、CreateCompatibleDC(NULL);如何提高繪圖效率 雙緩沖的實現(xiàn)下面建立一個與屏幕顯示兼容的位圖,位圖的大小可以用窗口的大下面建立一個與屏幕顯示兼容的位圖,位圖的大小可以用窗口的大小小: :MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);將位圖選入到內存顯示設備中將位圖選入到內存顯示設備中, ,只有選入了位圖的內存顯示設備才有只有選入了位圖的內存顯示設備才有地方繪圖,畫到指定的位圖上地方繪圖,畫到指定的位圖上: :C

22、Bitmap CBitmap * *pOldBit=MemDC.SelectObject(&MemBitmap);pOldBit=MemDC.SelectObject(&MemBitmap);如何提高繪圖效率 雙緩沖的實現(xiàn)/先用背景色將位圖清除干凈,以白色為例先用背景色將位圖清除干凈,以白色為例MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255);MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255);/繪圖繪圖MemDC.MoveTo();MemDC.MoveTo

23、();MemDC.LineTo();MemDC.LineTo();如何提高繪圖效率 雙緩沖的實現(xiàn)/將內存中的圖拷貝到屏幕上進行顯示將內存中的圖拷貝到屏幕上進行顯示pDC-BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);pDC-BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);/繪圖完成后的清理繪圖完成后的清理MemBitmap.DeleteObject();MemBitmap.DeleteObject();MemDC.DeleteDC();MemDC.DeleteDC();如何提高繪圖效率 提

24、高繪圖效率 實際上,在OnDraw(CDC *pDC)中繪制的圖并不是所有都顯示了的,例如:在OnDraw()函數(shù)中畫了兩個矩形,在一次重繪中雖然兩個矩形的繪制函數(shù)都有執(zhí)行,但是很有可能只有一個顯示了,這是因為MFC本身為了提高重繪的效率設置了裁剪區(qū)。裁剪區(qū)的作用就是:只有在這個區(qū)內的繪圖過程才會真正有效,在區(qū)外的是無效的,即使在區(qū)外執(zhí)行了繪圖函數(shù)也是不會顯示的。如何提高繪圖效率 提高繪圖效率 因為多數(shù)情況下窗口重繪的產(chǎn)生大多是因為窗口部分被遮擋或因為多數(shù)情況下窗口重繪的產(chǎn)生大多是因為窗口部分被遮擋或者窗口有滾動發(fā)生,改變的區(qū)域并不是整個圖形而只有一小部者窗口有滾動發(fā)生,改變的區(qū)域并不是整個圖

25、形而只有一小部分,這一部分需要改變的就是分,這一部分需要改變的就是pDCpDC中的裁剪區(qū)了。因為顯示(往中的裁剪區(qū)了。因為顯示(往內存或者顯存都叫顯示)比繪圖過程的計算要費時得多,有了內存或者顯存都叫顯示)比繪圖過程的計算要費時得多,有了裁剪區(qū)后顯示的就只是應該顯示的部分,大大提高了顯示效率裁剪區(qū)后顯示的就只是應該顯示的部分,大大提高了顯示效率。但是這個裁剪區(qū)是。但是這個裁剪區(qū)是MFCMFC設置的,它已經(jīng)為我們提高了顯示效率設置的,它已經(jīng)為我們提高了顯示效率,在進行復雜圖形的繪制時如何進一步提高效率呢?那就只有,在進行復雜圖形的繪制時如何進一步提高效率呢?那就只有去掉在裁剪區(qū)外的繪圖過程了???/p>

26、以先用去掉在裁剪區(qū)外的繪圖過程了??梢韵扔胮DC-GetClipBoxpDC-GetClipBox()()得到裁剪區(qū),然后在繪圖時判斷你的圖形是否在這個區(qū)內,如得到裁剪區(qū),然后在繪圖時判斷你的圖形是否在這個區(qū)內,如果在就畫,不在就不畫。果在就畫,不在就不畫。屏幕保護程序1、選擇MFC AppWizard ,建立基于單文檔的應用程序2、選擇Project-Setting 命令彈出“工程設置”對話框,選擇General選項卡,然后在Microsoft Foundation Classe下拉列表框中選擇 Use MFC in a Static Library。3、插入bmp圖,ID號為IDB_MYB

27、ITMAP4、在CMyScreenSaverDlg 類中添加幾個必須的變量和函數(shù),添 加后的代碼如下:private: UINT m_showheight;UINT m_showweight;UINT m_showpoint;CDC *m_pdcmem;CBitmap m_bitmap;CPoint m_mousepoint; BITMAP bitmap; /位圖位圖struct屏幕保護程序5、在工程中添加相應的消息相應函數(shù)6、完成消息處理 PostMessage(WM_CLOSE); void CMyScreenSaverDlg:OnMouseMove(UINT nFlags, CPoint

28、 point) / TODO: Add your message handler code here and/or call default if(abs(point.x-m_mousepoint.x)200|abs(point.y-m_mousepoint.y)200) PostMessage(WM_CLOSE);CDialog:OnMouseMove(nFlags, point); 屏幕保護程序void CMyScreenSaverDlg:OnActivateApp(BOOL bActive, HTASK hTask) CDialog:OnActivateApp(bActive, hTas

29、k);if(!bActive) PostMessage(WM_CLOSE);7、DrawBitmap()函數(shù),采用雙緩沖技術,將圖片和文字先寫入內存,然后再在函數(shù),采用雙緩沖技術,將圖片和文字先寫入內存,然后再在 顯示到屏幕上。顯示到屏幕上。屏幕保護程序void CMyScreenSaverDlg:OnPaint() elseCPaintDC dc(this); m_pdcmem=new CDC; m_bitmap.LoadBitmap(IDB_MYBITMAP);m_bitmap.GetBitmap(&bitmap);m_pdcmem-CreateCompatibleDC(&

30、dc);m_pdcmem-SelectObject(&m_bitmap);m_showpoint=0;DrawBitmap();SetTimer(1,10,NULL); CDialog:OnPaint(); 屏幕保護程序 CClientDC dc(this); /將圖片寫入到內存將圖片寫入到內存 CDC dcmem; CBitmap bt; bt.CreateCompatibleBitmap(&dc,m_showweight,m_showheight); dcmem.CreateCompatibleDC(&dc); dcmem.SelectObject(&bt)

31、;dcmem.FillRect(&CRect(0,0,m_showweight,m_showheight), &CBrush(RGB(0,0,0); dcmem.SetBkMode(0); UINT y=(m_showheight-bitmap.bmHeight)/2; dcmem.StretchBlt(0,y,m_showweight,m_showheight,m_pdcmem, m_showpoint,0,bitmap.bmWidth,bitmap.bmHeight-20,SRCCOPY);屏幕保護程序CFont ft; /將字體寫入到內存將字體寫入到內存ft.Create

32、Font(100,10,0,60,30,FALSE,FALSE,FALSE, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH|FF_MODERN, 隸書隸書); dcmem.SelectObject(&ft); static long sweight=m_showweight; -sweight; if(sweight-20) dcmem.SetTextColor(RGB(255,0,0); dcmem.TextOut(sweight-500,20,自動屏幕保護程序自動屏幕保護程序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論