C#之設置無邊框后如何移動窗體(轉)


轉載:http://www.cnblogs.com/techmango/archive/2012/03/31/2427523.html

 

第一種,利用windows的消息機制來實現:

首先﹐.定義鼠標左鍵按下時的Message標識﹔其次﹐在Form1_MouseDown方法﹐讓操作系統誤以為是按下標題欄。

1.定義鼠標左鍵按下時的Message標識

1    private const int WM_NCLBUTTONDOWN = 0XA1;   //.定義鼠標左鍵按下
2    private const int HTCAPTION     = 2;

2.讓操作系統誤以為是按下標題欄

1 private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
2    {   
3     //為當前的應用程序釋放鼠標鋪獲
4     ReleaseCapture();
5     //發送消息﹐讓系統誤以為在標題欄上按下鼠標
6     SendMessage((int)this.Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);
7    }

3.申明程序中所Windows的API函數

1    [DllImport("user32.dll",EntryPoint="SendMessageA")]
2    private static extern int SendMessage(int hwnd,int wMsg,int wParam,int lParam);
3 
4    [DllImport("user32.dll")]
5    private static extern int ReleaseCapture();

 

第二種,通過自定鼠標左鍵按下時產生的事件:

 * 首先將窗體的邊框樣式修改為None,讓窗體沒有標題欄
 * 實現這個效果使用了三個事件:鼠標按下、鼠標彈起、鼠標移動
 * 鼠標按下時更改變量isMouseDown標記窗體可以隨鼠標的移動而移動
 * 鼠標移動時根據鼠標的移動量更改窗體的location屬性,實現窗體移動
 * 鼠標彈起時更改變量isMouseDown標記窗體不可以隨鼠標的移動而移動
 */

1 private bool isMouseDown = false;
2 private Point FormLocation;     //form的location
3 private Point mouseOffset;      //鼠標的按下位置

 

1 private void Form1_MouseDown(object sender, MouseEventArgs e)
2 {
3     if (e.Button == MouseButtons.Left)
4     {
5         isMouseDown = true;
6         FormLocation = this.Location;
7         mouseOffset = Control.MousePosition;
8     }
9 }

 

1 private void Form1_MouseUp(object sender, MouseEventArgs e)
2 {
3     isMouseDown = false;
4 }

 

 1 private void Form1_MouseMove(object sender, MouseEventArgs e)
 2 {
 3     int _x = 0;
 4     int _y = 0;
 5     if (isMouseDown)
 6     {
 7         Point pt = Control.MousePosition;
 8         _x = mouseOffset.X - pt.X;
 9         _y = mouseOffset.Y - pt.Y;
10 
11         this.Location = new Point(FormLocation.X - _x, FormLocation.Y - _y);
12     }
13 }

 


免責聲明!

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



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