跟我學做c#皮膚美化(五)
--MainForm表單的製作2
前續文章導航
先來回顧一下我們上次遺留的問題
1. 消除圖中不透明的地方
2. 實現標題列的拖動
3. 實現表單的最大化,最小化,關閉功能。
下面就來一個一個解決。
解決不透明的問題:
首先為什麼會有灰色的出現呢。不難想到這些灰色就是Picturebox的背景色。邊角上的圖片對粉紅色透明了,但卻露出了背景的顏色。知道了原因就好瞭解決了,就是我們需要將這一塊的背景色給透明掉。有人說可以講picturebox的背景色設定為透明的啊。不錯,是可以,但整個表單的背景色呢?picturebox下面不還是有整個被覆蓋的表單的嘛!表單是不能像使用者控制項那樣背景色設定為透明的,不過卻有一個屬性TransparencyKey可以間接的為我們解決這個問題。這個屬性的作用是這樣的,當這個屬性設定為某一種顏色後,那該表單上的所有的這種顏色將都變為透明色。
所以我們只需將TransparencyKey的顏色和表單的背景色設定成一樣,那麼背景色不就自動透明了嘛!在這裡我們將所有控制項的背景色和TransparencyKey都設定成系統裡面的Info顏色(這個顏色你可以自己指定,不過不建議是原來的Control色,因為這樣後你再添加一個普通的控制項,那麼這個控制項的一部分也會被透明掉)
實現標題列的拖動
因為我們的表單是沒有狀態列的,所以當我們想移動視窗的時候發現怎麼也”移不動”(不是有個笑話的嘛“中國移不動“,呵呵)。要解決這個問題還是需要藉助API來完成。那如何知道別人需要移動表單呢?這裡我們就通過MouseDown這個事件來判斷。即如果使用者在特定的地區內按下了滑鼠左鍵,那麼我們就認為使用者需要移動用戶端了。這個時候我們調用相應的API向系統通知(SendMessage)讓系統做出響應。為了效果好一點,我們將狀態列那一行的所有的MouseDown事件都用這個方法。於是現在我們運行一下看看能否移動表單。
很不錯嘛!又是一個問題解決了,現在只要將右上方的三個按鈕的功能完成那這個表單就算基本完成了啦。好了,我們繼續。。。
要處理按鈕的事件,毫無疑問我們在設計模式中雙擊對應的按鈕,然後處理。這裡還要提一下的就是我們需要在這些事件的每個方法錢加一個virtual讓這些個方法可以被重寫。道理很簡單,假如我按關閉按鈕的時候不想其直接關閉而是先彈出對話方塊提醒一下使用者怎麼辦呢?總不能讓用這個控制項的人再去修改這個皮膚控制項吧,最好的辦法就是可以讓他們重寫按鈕的click事件,他們想幹嘛幹嘛,不想有其他的功能只要不重寫就是了。
好了開始說最小化功能吧。很簡單,一句話搞定:this.WindowState = FormWindowState.Minimized;然後是關閉按鈕,還是一句話的事情:this.close();呵呵貌似這兩個功能真簡單那!原本最大化也不複雜的,可是遇到了前面說到的那個問題,我們就知道想點兒其他的辦法啦。看代碼:
當使用者點擊最大化按鈕的時候我們先將最大化按鈕上移隱藏,然後將還原按鈕降下(還記得我們一開始給他設定的位置是-30嗎?),然後我們最大化之前就先記錄表單的大小和位置(就是最開始賦值的那四句話)資訊便於後面的還原。接下來的四句就是咱們手動來製造一種表單最大化的狀態啦,首先位置肯定在左上方。然後大小應該就是使用者電腦螢幕客戶區的大小,這個大小我是用Screen.PrimaryScreen.WorkingArea這個函數得到的。狀態設定完了我們只要改一下表單的狀態標識st為stat.Max。然後當使用者想還原的時候我們只要在btres的click的點擊事件中做一下剛才那個動作的反就行了。怎麼樣,是不是也不難啊!Ok,最後看一下運行效果:
發現問題:
終於是做好了。不過假如你也實際跟我動手做出了一個,你或許會發現以下一些問題:
1. 點擊最大化的時候反應好像有點慢,意思就是大概要過個這個半秒鐘才會最大化。
2. 還有一個問題就是從最小化狀態下恢複到最大化狀態,表單左上方會有閃爍現象(閃的實在太快了,沒辦法啊,大家可以應用下我下面上傳的DLL運行下就知道了)。我們本來就是想美化視窗,但是如果這些個問題一來實在是給人感覺不好,甚至還不如不美化。在下一篇中我將會帶領大家解決這個問題。
3. 我們的表單位置雖然能移動了,不過大小還不能拖動。
在下一篇中我會帶領大家解決這些問題,敬請期待!