跟我學做c#皮膚美化(六)

來源:互聯網
上載者:User

跟我學做c#皮膚美化(六)

                      --MainForm表單的製作3

前續文章導航

最終源碼下載


在上一篇中,我們雖然已經做出介面大概的樣子出來了。不過還是存在著一些問題,包括運行緩慢和閃爍等一些問題。那麼下面就讓我們一起來解決吧。

先來說說閃爍和緩慢的問題。

我認為最主要的還是由於我們設定了transparent所造成的。網上的一些解釋是這樣的,當表單顯示時我們設定的透明部分在顯示的時候會先呈現出黑色然後再在上面顯示圖片。這樣一來控制項一多我們很容易就看見了。不管解釋的對不對,反正我們知道設定表單的transparent肯定是對表單的顯示有一些負面影響的(接下來的表單避免設定transparent也確實證明了這一點)。既然是這個transparent“搞的鬼”,那能不能不用它來實現表單的透明呢?答案是我還沒找到。但是不代表這個問題解決不了。

我們不妨先來回憶一下我們為什麼要使用這個transparent。還記得下面這張圖吧?

 

我們運用transparent就是為瞭解決四個角上透明度的問題。現在我們不想使用transparent怎麼辦呢?其實簡單的換個思路就行了。我們為什麼非要那邊是透明的啊,它不透明就讓它不透明唄,我們只要在顯示的時候“切掉”它不就行了。也就是說我們自己先要在原有的視窗內畫出一個圓矩形出來然後四個直角就自然切掉不要了。那怎麼畫怎麼切?看下面的系統API,

 

 

 

 

第一個是用來畫的,而第二個當然就是用來切的啦。MSDN上面已經給我們解釋的很清楚了。CreateRoundRectRgn前面四個參數分別是左上方和右下角的座標,我們在畫的時候只需要將其起點設定為(1,1)終點設定為(this.width-1,this.height-1)就能得到一個外邊距相當於1的矩形啦。

圖中的藍色部分就是我們需要省略的部分。

 

最後兩個參數分別是橢圓形的寬高(其實就是我們切的圓角的弧度啦)。這個函數執行成功了就會返回切好的地區的控制代碼,然後我們只要在SetWindowRgn中拿到這個handle就可以把我們需要的圓矩形部分切下來啦。

可是好像又有一個問題那!到底該什麼時候切呢?鉛筆,刀都準備好了,但總不能讓他傻傻站那兒不知道什麼時候動手吧!時機很重要。我們應該讓他在表單大小變化的時候就行動一次,這樣才能保證每次表單大小變化(比如說最大化)後還能保證是圓角矩形。好啦,原理講好了,現在該真正動手幹活咯。

首先第一步就是切掉原來表單的transparent,這個就不用我多說了吧!會設定還不會取消嘛!接著就重寫一個OnResize函數就可以啦。兩句話搞定,

 

       protected overridevoid OnResize(EventArgse)       {            base.OnResize(e);            intRgn = Win32.CreateRoundRectRgn(1, 1, this.Width - 1, this.Height- 1, 7, 7);            Win32.SetWindowRgn(this.Handle, Rgn, true);       }

 

 

好了,來運行一下看看效果吧!

 

現在我們再來最大化,最小化還原看看效果確實比上次好多了。基本看不到左上方還有閃爍的情況了,而且響應也蠻快的。不過大家也從看出來了,就是最大化的時候周圍有空隙的啊。其實也不難想到這些空隙就是我們切掉不要的那一部分表單。要想最大化的時候表單完全覆蓋只要在最大化的時候稍微增加一下表單的寬和高就是了。於是我們在上一期的代碼中再對最大化事件做以下修改。

 

       private voidbtmax_Click(object sender, EventArgs e)       {            this.btmax.Top-= 30;            this.btres.Top= 0;             //最大化之前記錄視窗資訊便於縮小            orginHeight = this.Height;            orginWidth = this.Width;            X = this.Location.X;            Y = this.Location.Y;             this.Top= 1;            this.Left= 1;            BorderWidth = Screen.PrimaryScreen.WorkingArea.Width +4;            BorderHeight = Screen.PrimaryScreen.WorkingArea.Height +4;            st = stat.Max;  }

 

 

其中這個表單的寬和高我試了一下,加4正好差不多能覆蓋原來的空隙了。大家可以試一下。

OK,閃爍終於算是解決了。接下來實現表單大小的拖動功能。

這個問題還是由於我們的表單樣式為None導致的(看來這個None還真是搞出了不少麻煩呢)。不過不管怎樣,咱還是想辦法解決吧。前面的視窗移動我們是通過API來完成的,沒有疑問的大小的調整我們也藉助系統API發送訊息來完成。Win32.SendMessage(Handle,274, 61440 + x, 0);其中的x代表了不同的數字,當數字不同的時候產生的拖動大小的方向也不同。具體的數字代表的方向大家可以看My Code。

現在最主要的問題就是實現滑鼠到達表單邊緣時可以拖動。這裡我運用了MouseMove這個事件。當滑鼠到達指定地區時我們通過判斷滑鼠左鍵是否按下來實現改變大小訊息的發送與否。我舉一個稍微複雜一點的事件說一下吧。拿右上方來說吧。右上方運用ptbtr_MouseMove這個事件來判斷是否更改大小。看圖:

 

我將右上方的地區分為了四個地區。當滑鼠分別落在1,2,4地區並按下滑鼠的時候我們才相應的賦予x值從而改變表單大小。那麼如何判斷滑鼠經過的地區呢?我們可以直接用MouseEventArgs e參數中的x,y屬性。該屬性工作表明了滑鼠在相應的panel或者picture下的相對位置。還好是相對位置,不然我們又要麻煩了,呵呵。

看代碼:首先我們用if (!sizeAble)判斷是否設定了可更改大小。當可以改變大小時,我們再逐一判斷滑鼠左鍵按下時滑鼠的位置,並相應作出更改。代碼中我那個點是採用3個像素的位置作為分界線的(就是1和4的分界區),這個位置如果大家覺得不合適可以自己更改。只要按照上面的思路去一個一個的設定表單最後肯定會獲得你想要的效果的。

在這裡順便打一下小廣告^ ^,這個表單皮膚的效果已經被我用在了我編寫的一個小軟體“上網計時小助手”上了,如果想看看皮膚的運用效果不妨去看看那個軟體哦!嘿嘿....軟體地址:http://www.cnblogs.com/qianlifeng/archive/2010/05/03/1726801.html

好了,表單部分經過3個部分的講解終於算是結束了。

相信大家對控制項的編寫也有了一定的“感覺”了吧。這個表單其實說起來還有一些地方不夠完善的,比如說表單的起始位置沒有地方設定,再比如說當表單上的控制項太多的時候載入顯示表單還是有一定程度上的不好的顯示現象的等等。這些缺點還只是我暫時發現的,肯定還有其他一些不好的地方就等待著細心而認真的你發現並去嘗試著解決它了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.