Winform拖拽改變無邊框窗體大小

大家在進行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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章