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

C#實(shí)現(xiàn)移動(dòng)窗體的兩種共方法

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

引言

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

一、通過(guò)控件事件移動(dòng)窗體

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

在項(xiàng)目中添加窗體,我這里添加一個(gè)窗體test1,并添加一個(gè)label作為操作目標(biāo),添加上自己的文字,顏色突顯一下。

2、添加控件事件

通過(guò)屬性欄中的事件添加三個(gè)事件,分別是鼠標(biāo)的MouseDown、MouseMove以及MouseUp事件。

3、添加代碼

在窗體代碼中添加代碼,詳見(jiàn)下面代碼和注釋。

        //鼠標(biāo)是否拖動(dòng)標(biāo)志
        private bool isDragging = false;
        //鼠標(biāo)按下時(shí)的位置
        private Point downPosition;
        //鼠標(biāo)按下時(shí)的窗體位置
        private Point lastFormPosition;
        
        /// <summary>
        /// 鼠標(biāo)按下事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label_MouseDown(object sender, MouseEventArgs e)
        {
            //判斷是否為鼠標(biāo)左鍵按下
            if (e.Button == MouseButtons.Left)
            {
                //置標(biāo)志為true
                isDragging = true;
                //保存當(dāng)前鼠標(biāo)坐標(biāo)
                downPosition = Cursor.Position;
                //保存當(dāng)前窗體坐標(biāo)
                lastFormPosition = this.Location;
            }
        }
        /// <summary>
        ///  鼠標(biāo)移動(dòng)事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label_MouseMove(object sender, MouseEventArgs e)
        {
            //判斷鼠標(biāo)左鍵是否按下
            if (isDragging)
            {
                // 計(jì)算鼠標(biāo)移動(dòng)的偏移量
                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>
        /// 鼠標(biāo)松開(kāi)事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label_MouseUp(object sender, MouseEventArgs e)
        {
            //如果是鼠標(biāo)左鍵松開(kāi),則修改標(biāo)志為false
            if (e.Button == MouseButtons.Left)
            {
                isDragging = false;
            }
        }

二、通過(guò)windowsAPI移動(dòng)窗體

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

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

2、代碼展示

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

   private const int HT_CAPTION = 0x2;//窗體標(biāo)題
   private const int WM_NCLBUTTONDOWN = 0xA1;//鼠標(biāo)點(diǎn)擊的是非客戶區(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>
   /// 窗體鼠標(biāo)移動(dòng)事件
   /// </summary>
   /// <param name="sender"></param>
   /// <param name="e"></param>
   private void test1_MouseMove(object sender, MouseEventArgs e)
   {
       if (e.Button == MouseButtons.Left)
       {
           //釋放鼠標(biāo)捕獲
           ReleaseCapture();
           //非客戶區(qū)鼠標(biāo)的拖動(dòng)窗體消息
           SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
       } 
   }

三、其它方式

也可以直接通過(guò)系統(tǒng)鉤子, WndProc(ref Message m)重載實(shí)現(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#移動(dòng)窗體的兩種共方法的文章就介紹到這了,更多相關(guān)C#移動(dòng)窗體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

    C#中backgroundWorker類的用法詳解

    這篇文章主要介紹了C#使用backgroundWorker實(shí)現(xiàn)多線程的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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)知識(shí)點(diǎn)內(nèi)容,有需要朋友們參考下。
    2019-08-08
  • C#中的并發(fā)編程與.NET任務(wù)并行庫(kù)的使用示例和常見(jiàn)問(wèn)題

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

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

    C# Word 類庫(kù)的深入理解

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

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

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

    C#使用回溯法解決背包問(wèn)題實(shí)例分析

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

    WCF入門教程之Windows通訊接口

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

    WPF 自定義雷達(dá)圖開(kāi)發(fā)實(shí)例教程

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

    C# 泛型深入理解介紹

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

最新評(píng)論