【實例說明】
一般情況下,窗體都包含標題欄、菜單欄、工具欄和狀態欄等區域,當拖動窗體時直接在標題欄中按住鼠標左鍵不放即可實現拖動操作。
當做浮動窗體時,如果包含窗體邊框,那么界面給使用者的感覺將很不友好,因此浮動窗體沒有邊框,但對於這種沒有邊框的窗體,該如何進行拖放操作呢?
本實例將帶領讀者一起來制作一個拖動無邊框窗體的程序。
【關鍵技術】
本實例實現時主要用到了Windows的兩個API函數,即ReleaseCapture和SendMessage,下面分別對它們進行講解。
(1)ReleaseCapture函數
該函數用來釋放被當前線程中某個窗口捕獲的光標。語法格式如下:
1 [DllImport("user32.dll")] 2 public static extern bool ReleaseCapture();//用來釋放被當前線程中某個窗口捕獲的光標
說明:程序中使用系統API函數時,首先需要在命名空間區域添加System.Runtime.InteropServices命名空間。
(2)SendMessage函數
該函數用來向指定的窗體發送Windows消息。語法格式如下:
1 [DllImport("user32.dll")] 2 public static extern bool SendMessage(IntPtr hwdn,int wMsg,int mParam,int lParam);//向指定的窗體發送Windows消息
注意:詳細參數及注釋請見文件代碼中標注。
【設計過程】
(1)打開Visual Studio,創建一個WinForm應用程序,命名為DragNoFrameForm。
(2)更改默認窗體Form1的Name屬性為Frm_Main,並將該窗體的FormBorderStyle屬性設置為None。
(3)程序主要代碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Windows.Forms; 5 using System.Runtime.InteropServices; 6 7 namespace DragNoFrameForm 8 { 9 public partial class Frm_Main : Form 10 { 11 public Frm_Main() 12 { 13 InitializeComponent(); 14 } 15 16 #region 本程序中用到的API函數 17 [DllImport("user32.dll")] 18 public static extern bool ReleaseCapture();//用來釋放被當前線程中某個窗口捕獲的光標 19 20 /// <summary> 21 /// 向指定的窗體發送Windows消息 22 /// </summary> 23 /// <param name="hwdn">表示發送西歐阿西的目的窗口的句柄</param> 24 /// <param name="wMsg">表示被發送的消息</param> 25 /// <param name="mParam">取決於被發送的消息,表示附加的消息信息</param> 26 /// <param name="lParam">取決於被發送的消息,表示附加的消息信息</param> 27 /// <returns>表示處理是否成功</returns> 28 [DllImport("user32.dll")] 29 public static extern bool SendMessage(IntPtr hwdn,int wMsg,int mParam,int lParam); 30 #endregion 31 32 #region 本程序中需要聲明的變量 33 public const int WM_SYSCOMMAND = 0x0112;//該變量表示將向Windows發送的消息類型 34 public const int SC_MOVE = 0xF010;//該變量表示發送消息的附加消息 35 public const int HTCAPTION = 0x0002;//該變量表示發送消息的附加消息 36 #endregion 37 38 private void ExitContext_Click(object sender, EventArgs e) 39 { 40 Application.Exit();//退出本程序 41 } 42 43 private void Frm_Main_MouseDown(object sender, MouseEventArgs e) 44 { 45 ReleaseCapture();//用來釋放被當前線程中某個窗口捕獲的光標 46 SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);//向Windows發送拖動窗體的消息 47 } 48 } 49 }
【來自:http://www.cnblogs.com/LonelyShadow】