拖動無邊框窗體


【實例說明】
 一般情況下,窗體都包含標題欄、菜單欄、工具欄和狀態欄等區域,當拖動窗體時直接在標題欄中按住鼠標左鍵不放即可實現拖動操作。

 當做浮動窗體時,如果包含窗體邊框,那么界面給使用者的感覺將很不友好,因此浮動窗體沒有邊框,但對於這種沒有邊框的窗體,該如何進行拖放操作呢?

 本實例將帶領讀者一起來制作一個拖動無邊框窗體的程序。

 

【關鍵技術】
 本實例實現時主要用到了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】

 

 


免責聲明!

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



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