文章目錄
這個問題可能是很古老的問題了,我之所以寫一下,是因為需要整理一下相關資料,對於老鳥來說,建立一個不規則的表單,確實是小菜一碟,可是這個問題對於一些新手來說,不得不是一個很有意思的話題。
我打算寫的小執行個體中,怎麼可以少了這個很有意思的執行個體呢,還請老鳥不要對偶滴文章拍磚啊,哈哈,新手朋友們,只有不斷積累自己很小的執行個體,才可以在自己的編程之力,越走越遠。
好了,我這回給大家帶來的就是C#變形表單,其實,這種事情很常見的就是,軟體的美工了。一款有創意的表單,最好不過了。
第一步當然是準備工作了
把程式中的標題列去掉,否則整個介面將顯得很不協調。當然你去掉了標題列也就去掉了它的最大化、最小化、關閉、移動表單等功能。為了使程式仍然具有這些功能,我們需在程式中添加一些代碼,這樣使用者就仍然可以像以前一樣和程式進行互動。 哈哈,這些屬性我想大家都會設定吧。
哈哈,首先大家準備以後做那個位元影像檔案,我的美術功底不好,自己畫了一張。
好了,下面我們就用這張圖片做一個不規則的表單吧。
我們下面設定幾個表單的屬性吧。
設定表單的標題列。
、
設定表單的背景以及展開模式。
設定表單的透明顏色
好了,完成了。
這個是最簡單的模式了,呵呵,用一張圖片,使其中的某些顏色透明,就達到我們的目的了,好了,當然,這種表單需要我們實現表單的功能,比如,最大化,關閉..什麼的。
添加關閉事件
,下面,添加移動表單的事件。
首先說一下
SystemInformation 類
提供當前系統內容的有關資訊。
SystemInformation 類提供 static 屬性,該屬性可用於擷取當前系統內容的有關資訊。該類提供對資訊(例如,Windows 顯示元素大小、作業系統設定、網路可用性和系統上安裝的硬體的功能)的訪問。此類無法執行個體化。具體的每個成員代表什麼,請參照 http://msdn.microsoft.com/zh-cn/library/system.windows.forms.systeminformation_members%28v=vs.80%29.aspx
Point mouseOffset;bool isMouseDown = false;private void Form1_MouseDown(object sender, MouseEventArgs e){ int xOffset; int yOffset; if (e.Button == MouseButtons.Left) { xOffset = -e.X - SystemInformation.FrameBorderSize.Width; yOffset = -e.Y - -SystemInformation.FrameBorderSize.Height; mouseOffset = new Point(xOffset, yOffset); isMouseDown = true; }}private void Form1_MouseMove(object sender, MouseEventArgs e){ if (isMouseDown) { Point mousePos = Control.MousePosition; mousePos.Offset(mouseOffset.X, mouseOffset.Y); Location = mousePos; }}private void Form1_MouseUp(object sender, MouseEventArgs e){ if (e.Button == MouseButtons.Left) isMouseDown = false;}
上面的三個事件代表了,按下滑鼠,移動滑鼠,釋放滑鼠的操作。總結起來就是網路上面常見的三步:
1.首先準備一張不規則的背景圖片。
2.建立項目,將表單FormBorderStyle設定為none,以去掉標題列。設定BackgroundImage。
3.設定表單的TransparencyKey屬性為圖片中圓角邊框之外的顏色,表單在遇到該顏色將顯示為透明
通常這種做法是OK的,運行即可看到效果。
注意:
如果監視器的色彩深度設定大於 24 位,則不管 TransparencyKey 屬性是如何設定的,表單的非透明部分都會產生顯示問題。
若要避免出現這種問題,請確保“顯示”控制台中的監視器色彩深度的設定小於 24 位。當開發具有這種透明功能的應用程式時,請牢記應使您的使用者意識到此問題。
下面在介紹一種方式,就是自訂表單,這個需要的就是我們自己繪製表單了。
GraphicsPath
他的用法可以繪製我們想要的表單
private void NewForm_Load(object sender, EventArgs e){ Bitmap image = (Bitmap)Image.FromFile(@"C:\te\1.bmp"); GraphicsPath path = new GraphicsPath(); int width = image.Width; int height = image.Height; Rectangle rect; Color tranColor = image.GetPixel(1,1); for (int i = 0; i < width-1; i++) { for (int j = 0; j < height-1; j++) { if (image.GetPixel(i, j) != tranColor) { rect = new Rectangle(i,j,1,1); path.AddRectangle(rect); } } } this.Region = new Region(path);}
當然你也可以在表單的Paint事件裡面寫上自己的代碼。
這個是文字表單
private void NewForm_Paint(object sender, PaintEventArgs e){ GraphicsPath p = new GraphicsPath(); p.AddString("KingDZ", FontFamily.GenericMonospace, 0, 100f, new Point(10, 10), StringFormat.GenericDefault); this.Region = new Region(p);}
拖動不規程表單分三個步驟:
1、響應表單Mouse_Down事件,記錄滑鼠左鍵按下時的座標
2、響應表單的Mouse_Move事件,擷取當前滑鼠相對螢幕的座標減去以上獲得X,Y座標,賦值給表單Location
3、響應表單的Mouse_Up事件,釋放拖動操作
在上面的代碼中,我們也已經涉及到了。
好了,這個例子先到這吧,有些匆忙。哈哈。