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 = true17       }
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 }
View Code

重要聲明:本文非本人原創,原文地址如下:

http://wenku.baidu.com/link?url=LUtKs9S9gNTbYvYu2hvR9opuFF4bnSLc-mTMD3TlTPSJa0GhmA2jg13VjspzW3ATK5UNarq1l0rg5XELBh91DWDU_Ivt4oHv8BLMKNvtjve

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM