引言:
誰都希望自己的應(yīng)用程序能讓人留下一個(gè)深刻的印象,讓自己的程序窗體有一件與眾不同的"外衣"是一個(gè)好辦法。試想:在一大堆的普通窗口中突然跳出一個(gè)很酷的界面,一定能讓人眼睛一亮進(jìn)而產(chǎn)生興趣的。
在VB,VC中如何定制可伸縮個(gè)性化窗口早就不是什么秘密了,已經(jīng)有了大量相關(guān)的文章進(jìn)行介紹,無非都是如何調(diào)用系統(tǒng)API之類的方法,但是在.Net中調(diào)用API卻相對比較麻煩,所以使用.Net制作個(gè)性化窗體的文章也有一些,一般都是使用透明背景加圖片的方式,所以不能移動或者不能任意放大縮小窗體。
那有沒有不需要調(diào)用系統(tǒng)API的方法來實(shí)現(xiàn)可伸縮的個(gè)性化窗體的辦法呢?當(dāng)然有,.Net Framework提供了一套非常強(qiáng)大的系統(tǒng)類庫,我們下面就要做一個(gè)使用"純".Net打造的可伸縮個(gè)性化窗體。
我們需要將窗體所有的"皮膚"全部換成我們自己定義的,包括標(biāo)題欄,邊框和系統(tǒng)按紐等,所以我們首先需要定做一套自己的皮膚圖形文件。因?yàn)榇绑w是可伸縮的,所以我們不能簡單的取一整幅圖片來作為窗體皮膚,而是根據(jù)需要先將圖片切割為不同的部分,一般來說,有以下圖示幾大部分(紅線為切割線):
根據(jù)方位,將圖片各部分命名為:Bottom_Left,Bottom_Middle,Bottom_Right,Middle_Left,Middle_Right,Top_Left,Top_Middle,Top_Right,SysButton_Min,SysButton_Max,SysButton_Close,SysButton_Restore等。注意,有些圖片是可以伸縮的地方,比如Middle_Left,Bottom_Middle等處的圖片可以只是一小塊,以后需要進(jìn)行重復(fù)貼圖。而有些固定大小的圖片,比如Bottom_Left,Top_Left等以后只用貼一次,實(shí)際應(yīng)用的時(shí)候要注意區(qū)分。
采用以上原則,你便可以制作皮膚圖片,圖示如下:
然后可以將這些圖片放到ImageList控件或資源文件中供程序調(diào)用。(關(guān)于如何制作資源文件請參考:Visual C#資源文件編程--創(chuàng)建資源文件)
接下來,我們使用Visual Studio .Net新建一個(gè)Windows應(yīng)用程序的項(xiàng)目,在窗體的屬性設(shè)置中,將窗體的FormBorderStyle屬性設(shè)置為None(無邊框樣式),如下圖所示:
定義一個(gè)資源管理器:
private ResourceManager rm ;
然后使用以下的方法在Form的構(gòu)造函數(shù)中將圖片取出來(資源文件名為Skin.resources):
rm = new ResourceManager("SkinWindow.Skin", Assembly.GetExecutingAssembly());
Bottom_Left = (Bitmap)rm.GetObject("Bottom_Left");
…(其它的圖片也按照此方法取)
重載Form的OnPaint事件:
Graphics g = e.Graphics;//手工畫窗體的各個(gè)部分
DrawMiddle_Left(e.Graphics);//畫左邊框
DrawBottom_Middle(e.Graphics);//畫下邊框
DrawMiddle_Right(e.Graphics);//畫右邊框
DrawBottom_Left(e.Graphics);//畫左下角
DrawBottom_Right(e.Graphics);//畫右下角
DrawTop_Left(e.Graphics);//畫標(biāo)題欄左邊
DrawTop_Right(e.Graphics);//畫標(biāo)題欄右邊
DrawTop_Middle(e.Graphics);//畫標(biāo)題欄中間
DrawSys_Button(e.Graphics);//畫系統(tǒng)按紐
新聞熱點(diǎn)
疑難解答