詳解C#制作屏幕保護
初學C#的時候就曾想過C#制作屏幕保護,當時覺得很深奧,摸不著頭緒,就放棄了。今日又重新拾起,突然覺得也就是那么一回事,知道了就很簡單了。好的,下面就介紹一下如何利用C#制作屏幕保護。
打開Visual Studio.net2005(其他版本也差不多),建立一個windows項目。這次的屏保是模仿Windows XP自帶的一個屏幕保護。
把窗口的屬性設(shè)置一下:
1.首先把 WindowState 設(shè)置為 FormWindowState.Maximized 這樣窗口就可以在打開之后呈現(xiàn)***化的狀態(tài)。
2.把TopMost 設(shè)置為true,這樣使得窗口處于最頂層,就是所謂的“永遠在前”,相信用過千千靜聽,金山詞霸等軟件的朋友應(yīng)該熟悉。
3.把FormBorderStyle 設(shè)置為FormBorderStyle.None ,這樣窗口就沒有邊框,即沒有了標題欄,周圍的一圈邊框。也就省去了一個個去掉MaximizeBox ,MinimizeBox了。
4.把BackColor設(shè)置為Color.Black, 這樣窗口背景色就變成黑色了
5.ShowInTaskBar 設(shè)置為false,(這個步驟可以省去,本身***化就看不到任務(wù)欄了)
其他的屬性修改都是多余了,當然把name等等類似改改也行,總之,上面5個(嚴格的說4個)弄好了,UI方面就設(shè)計完畢了。
下面拖動一個timer控件進來,將其Enabled屬性設(shè)置為true,Interval設(shè)置為10000(因為以milliseconds為單位,所以這里設(shè)置為10,000,也就是10s)。
加timer控件是為了每隔一定的事件觸發(fā)一個事件。因此給timer加一個事件,點擊Solution Explorer 上面的閃電圖標,添加唯一的一個Tick事件。
下面就開始設(shè)計算法了,其實也是再簡單不過了,隨機產(chǎn)生一個點,然后再該處繪制預(yù)先準備好的圖片。(如果為了好看點,可以設(shè)置坐標之間的關(guān)系)
- privatereadonlyintscreenWidth;
- privatereadonlyintscreenHeight;
- privateBitmapbitmap=newBitmap("ms.bmp");
- privateRandomrandom=newRandom();
- privateintx=0;
- privateinty=0;
增加若干成員變量, 挺有self-documenting的味道,我就不過多解釋了,前兩個是標志屏幕的寬度和高度,
然后是一個位圖對象,存儲預(yù)先準備的圖片,這里是一張bitmap。random是一個隨機類對象,用來產(chǎn)生隨機點的。再下面分別是產(chǎn)生的隨機點的x,y坐標。
構(gòu)造函數(shù)內(nèi)添加
- Rectangle rect = Screen.PrimaryScreen.Bounds;
- screenWidth = rect.Width;
- screenHeight = rect.Height;
***句話是用來獲得整個顯示器的邊界范圍。然后分別把寬度和高度賦值給成員變量。
注:Screen類提供了一些與顯示器相關(guān)的屬性,感興趣的朋友可以參閱MSDN
下面填補Tick事件
- privatevoidtimer1_Tick(objectsender,EventArgse)
- {
- x=random.Next(screenWidth);
- y=random.Next(screenHeight);
- if(x+bitmap.Width>screenWidth)
- {
- x=screenWidth-bitmap.Width;
- }
- if(y+bitmap.Height>screenHeight)
- {
- y=screenHeight-bitmap.Height;
- }
- this.Invalidate();
- }
上面是獲取一個x,y坐標分別不大于顯示器的寬度和高度的點。為了美觀一點,判斷圖片是否超過屏幕邊界,對x,y進行了一些處理, 不是很難,相信大家都能看懂。***刷新屏幕,調(diào)用paint事件。
我想您一定知道了,對, 在Form的paint事件里面有了一句畫圖的語句,回答正確!
- e.Graphics.DrawImage(bitmap, x, y, bitmap.Width,bitmap.Height);
Image 對象存儲像素寬度值及水平分辨率值(每英寸點數(shù))。圖像的物理寬度(以英寸為單位)等于像素寬度除以水平分辨率。例如,像素寬度為 216、水平分辨率為 72 點/英寸的圖像的物理寬度為 3 英寸。此說明同樣適用于像素高度和物理高度。
此方法使用圖像的物理大小繪制圖像,因此無論顯示設(shè)備的分辨率(每英寸點數(shù))是多少,圖像大小(以英寸為單位)都是正確的。例如,假定圖像的像素寬度為 216,水平分辨率為 72 點/英寸。如果調(diào)用此方法在分辨率為 96 點/英寸的設(shè)備上繪制該圖像,則所呈現(xiàn)圖像的像素寬度是 (216/72)*96 = 288。
哈哈,也就是說前者在用圖片的物理大小,后者使用指定大小。物理大小在不同的水平分辨率的顯示器上顯示的始終是圖片的真實大小。(注意,bitmap 的width和height返回的大小都是以 pixel(像素)為單位的)。疑云頓時解開了!
***添加一個程序退出的操作,這里我使用的是鍵盤按下或者鼠標焦點變換。這個不難,略過。
到此為止,把程序執(zhí)行一下就可以看到預(yù)期的效果了。***把bin/debug或者bin/release下的可執(zhí)行程序后綴改成scr,并拷貝到系統(tǒng)盤Windows的system32下(圖片也拷貝進去哦?。?BR>這樣通過桌面屬性的屏幕保護程序設(shè)置一下就可以投入使用了,C#制作屏幕保護是不是很炫呢!趕緊試試吧!
【編輯推薦】