欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實現(xiàn)移動窗體的兩種共方法

 更新時間:2024年09月12日 10:50:32   作者:火星papa  
在C#Form窗體設(shè)計中,如果我們不需要使用默認邊框設(shè)計自己個性化的窗體,這時候你會發(fā)現(xiàn)拖動窗體的功能就沒有了,這里需要自己構(gòu)建方法讓用戶可以拖動整個窗體,下面就介紹兩種方法來實現(xiàn),需要的朋友可以參考下

引言

在C#Form窗體設(shè)計中,如果我們不需要使用默認邊框設(shè)計自己個性化的窗體(FromBorderStyle=none時),這時候你會發(fā)現(xiàn)拖動窗體的功能就沒有了,這里需要自己構(gòu)建方法讓用戶可以拖動整個窗體,這里我們使用前輩的方法實現(xiàn)和描述一下。即可以通過窗體中的控件事件來控制拖動整個窗體,也可以通過系統(tǒng)API 捕獲鼠標拖動窗體,下面就介紹這兩方法。

一、通過控件事件移動窗體

1、創(chuàng)建窗體界面

在項目中添加窗體,我這里添加一個窗體test1,并添加一個label作為操作目標,添加上自己的文字,顏色突顯一下。

2、添加控件事件

通過屬性欄中的事件添加三個事件,分別是鼠標的MouseDown、MouseMove以及MouseUp事件。

3、添加代碼

在窗體代碼中添加代碼,詳見下面代碼和注釋。

        //鼠標是否拖動標志
        private bool isDragging = false;
        //鼠標按下時的位置
        private Point downPosition;
        //鼠標按下時的窗體位置
        private Point lastFormPosition;
        
        /// <summary>
        /// 鼠標按下事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label_MouseDown(object sender, MouseEventArgs e)
        {
            //判斷是否為鼠標左鍵按下
            if (e.Button == MouseButtons.Left)
            {
                //置標志為true
                isDragging = true;
                //保存當前鼠標坐標
                downPosition = Cursor.Position;
                //保存當前窗體坐標
                lastFormPosition = this.Location;
            }
        }
        /// <summary>
        ///  鼠標移動事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label_MouseMove(object sender, MouseEventArgs e)
        {
            //判斷鼠標左鍵是否按下
            if (isDragging)
            {
                // 計算鼠標移動的偏移量
                int moveX = Cursor.Position.X - downPosition.X;
                int moveY = Cursor.Position.Y - downPosition.Y;

                // 更新窗體的位置
                this.Location = new Point(lastFormPosition.X + moveX, lastFormPosition.Y + moveY);
            } 
        }
        /// <summary>
        /// 鼠標松開事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label_MouseUp(object sender, MouseEventArgs e)
        {
            //如果是鼠標左鍵松開,則修改標志為false
            if (e.Button == MouseButtons.Left)
            {
                isDragging = false;
            }
        }

二、通過windowsAPI移動窗體

1、 構(gòu)建窗體和添加事件

構(gòu)建窗體和添加事件同上一個個方法,我就不詳細說明了,只是添加事件的主題更換成窗體test1。

2、代碼展示

構(gòu)建窗體和添加事件通過鼠標移動事件中,調(diào)用windows系統(tǒng)API的SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam)函數(shù),可以看到除控件外的部分都可以用來拖動整個窗體。

   private const int HT_CAPTION = 0x2;//窗體標題
   private const int WM_NCLBUTTONDOWN = 0xA1;//鼠標點擊的是非客戶區(qū)

   [DllImport("user32.dll")]
   public static extern bool ReleaseCapture();
   [DllImport("user32.dll")]
   public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

   /// <summary>
   /// 窗體鼠標移動事件
   /// </summary>
   /// <param name="sender"></param>
   /// <param name="e"></param>
   private void test1_MouseMove(object sender, MouseEventArgs e)
   {
       if (e.Button == MouseButtons.Left)
       {
           //釋放鼠標捕獲
           ReleaseCapture();
           //非客戶區(qū)鼠標的拖動窗體消息
           SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
       } 
   }

三、其它方式

也可以直接通過系統(tǒng)鉤子, WndProc(ref Message m)重載實現(xiàn)。代碼如下:

 internal static int WM_NCHITTEST = 0x84;
 internal static IntPtr HTCLIENT = (IntPtr)0x1;
 internal static IntPtr HTCAPTION = (IntPtr)0x2;
 internal static int WM_NCLBUTTONDBLCLK = 0x00A3;
 protected override void WndProc(ref Message m)
 {
     if (m.Msg == WM_NCLBUTTONDBLCLK)
     {
         return;
     }
     if (m.Msg == WM_NCHITTEST)
     {
         base.WndProc(ref m);
         if (m.Result == HTCLIENT)
         {
             m.HWnd = this.Handle;
             m.Result = HTCAPTION;
         }
         return;
     }
     base.WndProc(ref m);
 }

到此這篇關(guān)于C#移動窗體的兩種共方法的文章就介紹到這了,更多相關(guān)C#移動窗體內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c# DataTable與不同結(jié)構(gòu)實體類轉(zhuǎn)換的方法實例

    c# DataTable與不同結(jié)構(gòu)實體類轉(zhuǎn)換的方法實例

    這篇文章主要介紹了c#的DataTable與不同結(jié)構(gòu)實體類轉(zhuǎn)換的方法實例,在大數(shù)據(jù)量的情況下很實用,大家可以參考使用
    2013-11-11
  • C#中backgroundWorker類的用法詳解

    C#中backgroundWorker類的用法詳解

    這篇文章主要介紹了C#使用backgroundWorker實現(xiàn)多線程的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C# ArrayList、HashSet、HashTable、List、Dictionary的區(qū)別詳解

    C# ArrayList、HashSet、HashTable、List、Dictionary的區(qū)別詳解

    這篇文章主要介紹了C# ArrayList、HashSet、HashTable、List、Dictionary的區(qū)別的相關(guān)知識點內(nèi)容,有需要朋友們參考下。
    2019-08-08
  • C#中的并發(fā)編程與.NET任務(wù)并行庫的使用示例和常見問題

    C#中的并發(fā)編程與.NET任務(wù)并行庫的使用示例和常見問題

    在現(xiàn)代軟件開發(fā)中,.NET Framework通過引入任務(wù)并行庫(TPL)和并發(fā)集合類型,簡化了并發(fā)復(fù)雜性,提高程序的性能、可維護性和可擴展性,并發(fā)集合設(shè)計上允許多線程安全訪問,此外,TPL通過Task類簡化異步操作,正確使用這些工具可避免死鎖和競爭條件等常見問題
    2024-09-09
  • C# Word 類庫的深入理解

    C# Word 類庫的深入理解

    本篇文章是對C#中的Word類庫進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C#中DataGridView常用操作實例小結(jié)

    C#中DataGridView常用操作實例小結(jié)

    這篇文章主要介紹了C#中DataGridView常用操作,以實例形式總結(jié)了DataGridView綁定下拉列表、設(shè)置默認值、判斷復(fù)選框是否選中等技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • C#使用回溯法解決背包問題實例分析

    C#使用回溯法解決背包問題實例分析

    這篇文章主要介紹了C#使用回溯法解決背包問題,實例分析了背包問題的描述及C#解決方法,需要的朋友可以參考下
    2015-04-04
  • WCF入門教程之Windows通訊接口

    WCF入門教程之Windows通訊接口

    這篇文章介紹了WCF入門教程之Windows通訊接口,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • WPF 自定義雷達圖開發(fā)實例教程

    WPF 自定義雷達圖開發(fā)實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發(fā)實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • C# 泛型深入理解介紹

    C# 泛型深入理解介紹

    在上一個專題中介紹了C#2.0 中引入泛型的原因以及有了泛型后所帶來的好處,然而上一專題相當于是介紹了泛型的一些基本知識的,對于泛型的性能為什么會比非泛型的性能高卻沒有給出理由,所以在這個專題就中將會介紹原因和一些關(guān)于泛型的其他知識
    2012-11-11

最新評論