大家在進行Winform開發過程中,很容易就可以完成一個窗口的布局工作,但現在的軟件界面美化效果一個比一個好,很多軟件都是無邊框的,於是乎,你是不是也感嘆:winform的帶邊框的窗體如此丑陋,我一定要把邊框去掉!OK,去掉邊框對Winform來說那絕對一件相當easy的事情,一句this.FormBorderStyle=FormBorderStyle.None就可搞定。
簡單倒是簡單,邊框去掉了,達到了自己的要求,但同時來了很多麻煩,其中一個就是窗口無法拖動改變大小了(這個問題在網上也有解決辦法,但是清一色都是調用Win32的API來處理,可是如我這般的新手們對Win32了解甚少,根本不了解其運行原理和機制,所以還是希望用純托管的代碼來解決此問題,今天下午閑着沒事,突然來了些“靈感”,嘗試了一下,現在解決了,把我的一些想法拿出來和大家分享一下,如有bug,還望大家多多批評指正!好了,啰嗦半天了,不廢話,先上圖,看看是不是你想要的效果:
思想:要拖拽改變窗體大小必須要鼠標按下,同時要知道拖拽方向,主要用到窗體的三個事件:
(1) MouseDown:只有在鼠標按下時候,我們才可以拖動邊緣改變窗體大小;
(2) MouseUp:鼠標彈開以后,將不能改變窗體尺寸;
(3) MouseMove:當鼠標處於按下狀態時,鼠標移動改變窗體大小
以下是源代碼,可以復制過去看一下效果:

1 namespace Kaifafanli 2 { 3 public partial class Form4 : Form 4 { 5 public Form4() 6 { 7 InitializeComponent(); 8 9 } 10 bool isMouseDown = false; //表示鼠標當前是否處於按下狀態,初始值為否 11 MouseDirection direction = MouseDirection.None;//表示拖動的方向,起始為None,表示不拖動 12 13 private void Form4_MouseDown(object sender, MouseEventArgs e) 14 { 15 //鼠標按下 16 isMouseDown = true; 17 } 18 19 private void Form4_MouseUp(object sender, MouseEventArgs e) 20 { 21 // 鼠標彈起, 22 23 isMouseDown = false; 24 //既然鼠標彈起了,那么就不能再改變窗體尺寸,拖拽方向置 none 25 direction = MouseDirection.None; 26 } 27 28 private void Form4_MouseMove(object sender, MouseEventArgs e) 29 { 30 //鼠標移動過程中,坐標時刻在改變 31 //當鼠標移動時橫坐標距離窗體右邊緣5像素以內且縱坐標距離下邊緣也在5像素以內時,要將光標變為傾斜的箭頭形狀,同時拖拽方向direction置為MouseDirection.Declining 32 if (e.Location.X >= this.Width - 5 && e.Location.Y > this.Height - 5) 33 { 34 this.Cursor = Cursors.SizeNWSE; 35 direction = MouseDirection.Declining; 36 } 37 //當鼠標移動時橫坐標距離窗體右邊緣5像素以內時,要將光標變為傾斜的箭頭形狀,同時拖拽方向direction置為MouseDirection.Herizontal 38 else if (e.Location.X >= this.Width - 5) 39 { 40 this.Cursor = Cursors.SizeWE; 41 direction = MouseDirection.Herizontal; 42 } 43 //同理當鼠標移動時縱坐標距離窗體下邊緣5像素以內時,要將光標變為傾斜的箭頭形狀,同時拖拽方向direction置為MouseDirection.Vertical 44 else if (e.Location.Y >= this.Height - 5) 45 { 46 this.Cursor = Cursors.SizeNS; 47 direction = MouseDirection.Vertical; 48 49 } 50 //否則,以外的窗體區域,鼠標星座均為單向箭頭(默認) 51 else 52 this.Cursor = Cursors.Arrow; 53 //設定好方向后,調用下面方法,改變窗體大小 54 ResizeWindow(); 55 } 56 57 private void ResizeWindow() 58 { 59 //這個判斷很重要,只有在鼠標按下時才能拖拽改變窗體大小,如果不作判斷,那么鼠標彈起和按下時,窗體都可以改變 60 if (!isMouseDown) 61 return; 62 //MousePosition的參考點是屏幕的左上角,表示鼠標當前相對於屏幕左上角的坐標this.left和this.top的參考點也是屏幕,屬性MousePosition是該程序的重點 63 if (direction == MouseDirection.Declining) 64 { 65 //此行代碼在mousemove事件中已經寫過,在此再寫一遍,並不多余,一定要寫 66 this.Cursor = Cursors.SizeNWSE; 67 //下面是改變窗體寬和高的代碼,不明白的可以仔細思考一下 68 this.Width = MousePosition.X - this.Left; 69 this.Height = MousePosition.Y - this.Top; 70 } 71 //以下同理 72 if (direction == MouseDirection.Herizontal) 73 { 74 this.Cursor = Cursors.SizeWE; 75 this.Width = MousePosition.X - this.Left; 76 } 77 else if (direction == MouseDirection.Vertical) 78 { 79 this.Cursor = Cursors.SizeNS; 80 this.Height = MousePosition.Y - this.Top; 81 } 82 //即使鼠標按下,但是不在窗口右和下邊緣,那么也不能改變窗口大小 83 else 84 this.Cursor = Cursors.Arrow; 85 } 86 } 87 //定義一個枚舉,表示拖動方向 88 public enum MouseDirection 89 { 90 Herizontal,//水平方向拖動,只改變窗體的寬度 91 Vertical,//垂直方向拖動,只改變窗體的高度 92 Declining,//傾斜方向,同時改變窗體的寬度和高度 93 None//不做標志,即不拖動窗體改變大小 94 } 95 }
重要聲明:本文非本人原創,原文地址如下:
http://wenku.baidu.com/link?url=LUtKs9S9gNTbYvYu2hvR9opuFF4bnSLc-mTMD3TlTPSJa0GhmA2jg13VjspzW3ATK5UNarq1l0rg5XELBh91DWDU_Ivt4oHv8BLMKNvtjve