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