跟我學做c#皮膚美化(四)
跟我學做c#皮膚美化(四)
--MainForm窗體的制作1
做了許多的用戶控件,現在讓我們換換口味,開始窗體的制作吧!這個窗體的制作可以說是整個美化中比較重要的一部分,因為她顯示的是整個美化的窗體。而且內容也比較多,所以我會分幾篇把她講完,而且窗體制作的時候會和前面控件將的時候不一樣,我不會在第一篇把最后的代碼就放出來,而是希望做成跟著我一起一個版本一版本的完成不斷的修改不斷的發現問題并去完善。這也是我做這個時候的一個思路:先做一個大致的框架,然后在其基礎上增加功能或者發現問題,最后完成功能和解決問題。不知道大家感覺這樣是不是更好一點呢?
好了,不多說了,先看最終的效果圖:

怎么樣?是不是有點心動了?下面就正式開始吧!
首先在以前的項目QLFUI上新建一個窗體(不是用戶控件咯)并重新命名為MainForm。
如圖:

接著來設置幾個屬性,如下:
FormBorderStyle:None
Size:300,300
接下來就是用picturebox 和 panel來布局了。這一部分可能比較繁瑣。首先總體介紹一下大概的布局。見圖:

因為我們做的窗體是圓角的,所以窗體的四個角上(紅色)我們會放上四個picturebox。標題欄和狀態欄(藍色)會是兩個panel。二個邊框線(綠色)是兩個picturebox。最后的主體部分(棕色)是一個panel。說完了大體的布局,下面就來動手做啦。一個一個來:
左上角
Name:ptbtl
Location:0,0
Size:10,31
上方的標題欄
Modifiers:Protected;
Name:panelt
Location:10,0
Size:280,31
右上角
Name:ptbtr
Location:290,0
Size:10,31
左側的邊框線
Name:ptbml
Location:0,31
Size:2,232
主窗體部分
Modifiers:Protected;
BackgroundImageLayout:Stretch
Name:panelm
Location:2,31
Size:296,232
右側的邊框線
Name:ptbmr
Location:298,31
Size:2,232
左下角
Name:ptbbl
Location:0,263
Size:10,37
下方的狀態欄
Modifiers:Protected;
Name:panelb
Location:10,263
Size:280,37
右下角
Name:ptbbr
Location:290,263
Size:10,37
最后還有右上方的三個按鈕可不要忘記了,注意按鈕都是在panelt里面設置的而且這三個按鈕都是我們前面做的按鈕哦,終于派上用場啦!
最小化按鈕
Caption:0
Name:btmin
Location:180,0
Size:31,22
最大化按鈕
Caption:0
Name:btmax
Location:211,0
Size:31,22
關閉按鈕
Caption:0
Name:btclose
Location:243,0
Size:37,22
還原按鈕
Caption:0
Name:btres
Location:211,-30
Size:31,22
最后再加上一個label作為窗體的標題
Name:lbtitle
Location:6,9
Size:35,12
BackColor:Transparent
呼,終于結束了!不知道大家有沒有暈乎乎的感覺,反正我是有點兒了,呵呵。最后的布局圖應該是這個樣子滴:

老規矩,界面的事情弄完了,現在開始編碼了。上代碼:
【代碼】(代碼不短,大家還是看我附件里面的代碼,看的也清楚點兒!)
變量部分:
變量我在代碼里都注明了其作用。這里只會說說為什么要這些變量。首先needMaxbt和needMinbt是指示該窗體是否需要最大化或最小化按鈕的,畢竟窗體有很多種吧,比如說一個消息框就沒必要用最大化按鈕吧,所以我們這邊也就設置的靈活一點,下面會將這兩個變量封裝成屬性以便在設計模式下方便的選擇。
接下來的四個變量
orginWidth;
orginHeight;
X;
Y;
都是用來記錄窗體的信息的,分別是窗體的寬,高,x坐標值,y坐標值。為什么要設置一些變量呢?說起來也比較郁悶,這些都是為了窗口的最大化和還原準備的。可能有人會問了最大化不就一句話嘛
this.WindowState= FormWindowState.Maximized;何必還要這些個變量呢。關鍵郁悶就郁悶在這里啦,假如直接用這一句話最后窗體雖然也能最大化可就是右上角的一小段邊框線莫名其妙的沒有了,如圖:

搞了半天也不明白。最后不得已才想出個自己手動最大化的方法來,講到具體的地方再和大家說吧。
接下來我又定義了一個枚舉stat,用來表示窗體的三種狀態,正常,最大化,最小化。下面的那個st就是枚舉的一個變量,默認的是normal也就是窗體正常顯示啦。
變量講完了接下來講屬性。
第一個屬性Size。這個屬性有點特別,因為它里面有一個new關鍵字,為什么呢?因為Size這個屬性在設計器里面原來就有了所以我們加上這個new就相當于重寫這個屬性啦。這個屬性里面我只寫了一個get方法。我寫這個屬性的目的就是要將設計器下原來的size屬性隱藏(看見了上面的那個[Browsable(false)]嗎?就是用它來隱藏的),這樣別人如果要設置窗體的大小就得修改我們下面提到的BorderWidth和BorderHeight了。那為什么要隱藏原來的實現呢,這是因為當我們設置窗體大小的時候窗體上相應的picturebox和panel也需要相應的改變,這里面就需要設置很多的東西。所以我們另外設置屬性來完成這些工作。
第二個屬性BorderWidth。毫無疑問,這個就是用來設置窗體的寬度的啦。[CategoryAttribute("QLFSkinDll"), Description("設置窗體寬度")]我就不講了,前面已經提到過了。里面的get也很簡單就是返回當前窗口的寬度。重點講解set。首先我們用if語句限制了用戶設置的值不能小于180像素,因為當小于180個像素的時候,界面上的最小化按鈕就有將標題都“擠”沒了。所以最小180啦。接下來如果用戶設置的值和設置前的不一樣,那么就開始一下一連串的設置了。我們用newwidth把用戶設置的這個值記錄下來,下面要用到。然后緊接著就改變窗體的大小。
如果僅僅這樣就結束了你會發現panel,picturebox那些控件的位置都沒有動,這不是我們想要的。接下來就是設置這些控件的位置啦。一開始我做的時候也被這些設置搞亂了,最后我用的相對位置才搞清楚的。什么叫相對位置,打比方說無論你窗體的大小怎么變化,關閉按鈕總是在距窗體右側57個像素的位置。按照這個一句來做我們也會發現其他的控件都是一樣的。于是一個一個的設置,找相對距離。當然我現在已經找好了,大家就不必再麻煩一個一個找一遍來了。至此,BorderWidth屬性講完。
第三個屬性BorderHeight。經過上面BorderWidth屬性的講解,我想height屬性就不要我再講解了,都是一樣的道理。
第四個屬性FormTitle。看意思就應該看出來了吧,這個是用來設置窗體的標題的。這個在前面講到的button,checkbox等控件里也有差不多的屬性,這里也不就不羅嗦了。
第五個屬性NeedMax。這個屬性是用來指定窗體是否需要最大化按鈕的。怎么指定呢?看代碼。如果用戶設置的是false也就是不需要,那我們就會將btmax按鈕向上移動50個像素(this.btmax.Top = -50;)同時btmin按鈕頂替最大化按鈕的位置(this.btmin.Left = this.Width - 89;),怎么樣?是不是很簡單就實現了按鈕的隱藏呢?
第六個屬性NeedMin。用法參見上面的第五個屬性。
接下來講構造函數。
前四句就不要我講了吧,前面也遇到過就是開啟雙緩沖和系統默認的是初始化控件。剩下的N多的語句都是用來加載圖片的,其實也沒啥好說的要說的點前面控件制作的時候也已經介紹過了,呵呵。。。說一下最后一句的意思吧。因為我們的窗體默認是沒有狀態欄什么的,所以也就決定了當窗體最小化后右擊任務欄上的窗體沒有菜單彈出來。如果要實現這個功能就需要借助系統API來完成了。不過在c#里面是不可以直接調用API的,需要實現聲明一下。在這里就偷懶一下直接將別人封裝好的API類(win32.cs)。一句話完成這個功能:
Win32.SetWindowLong(this.Handle, -16, Win32.WS_SYSMENU+ Win32.WS_MINIMIZEBOX);好了,來運行看看吧:

發現問題:
大體的模樣是出現了。不過也許大家看圖看不清楚,圖中被我畫圈的其實都不是透明的,而是灰色的。我們在下一篇文章的講解中將解決或實現以下幾個問題:
1.消除圖中不透明的地方
2.實現標題欄的拖動
3.實現窗體的最大化,最小化,關閉功能。
敬請期待。。。

做了許多的用戶控件,現在讓我們換換口味,開始窗體的制作吧!這個窗體的制作可以說是整個美化中比較重要的一部分,因為她顯示的是整個美化的窗體......
浙公網安備 33010602011771號