跟我學做c 面板美化(六)

2022-01-30 05:17:47 字數 2871 閱讀 4944

跟我學做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)

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

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

private voidbtmax_click(object sender, eventargs e)

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

ok,閃爍終於算是解決了。接下來實現窗體大小的拖動功能。

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

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

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

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

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

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

跟我學做c 面板美化(一)

跟我學做c 美化 一 概述與導航 每每看著qq,360等等那些軟體漂亮的外衣時,你是不是總是在想我的軟體什麼時候才能穿上這麼漂亮的外衣呢?不過現在當你看到這篇文章的時候不必再發出這樣的疑問了,因為接下來我會帶領大家一步一步 畫出 這些漂亮的外衣!在寫這系列文章之前要感謝的蘇飛,我也是看來他的文章後才...

跟我學XSL(六)

今天我們學習xsl的各種運算子,滿足編寫更大靈活性的xsl樣式的要求。表 一 運算子與特殊字元 運算子描述選擇子元素,返回左側元素的直接子元素 如果 位於最左側表示選擇根結點的直接子元素 遞迴下降,不論深度,搜尋指定的元素 如果位於最左側表示從根結點出發遞迴下降搜尋指定元素 表示當前元素 萬用字元,...

跟我學XSL(六)

運算子 關係與邏輯運算子,特殊字元等 今天我們學習xsl的各種運算子,滿足編寫更大靈活性的xsl樣式的要求。表一 運算子與特殊字元 運算子 描述 選擇子元素,返回左側元素的直接子元素 如果 位於最左側表示選擇根結點的直接子元素 遞迴下降,不論深度,搜尋指定的元素 如果位於最左側表示從根結點出發遞迴下...