C#--無邊框窗體實現拖動、最大化、最小化、關閉(轉)


窗體在設置為無邊框模式(設置方法:FormBorderStyle=None),默認是無法隨意拖動的,也沒有最大化、最小化、關閉等按鈕。

1) 選中要去除邊框的窗體,按F4調出窗體屬性。

2)在屬性框中找到FormBorderStyle選擇none。

 

一、實現窗體拖動

方法一:調用API

using System.Runtime.InteropServices;     [DllImport("user32.dll")]    public static extern bool ReleaseCapture();    [DllImport("user32.dll")]    public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);    public const int WM_SYSCOMMAND = 0x0112;    public const int SC_MOVE = 0xF010;    public const int HTCAPTION = 0x0002;      //添加窗體的MouseDown事件,並編寫如下代碼    private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)    {      ReleaseCapture();      SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);    }

方法二:通過窗體MouseDown、MouseMove、MouseUp事件實現窗體移動

        Point mouseOff;//鼠標移動位置變量        bool leftFlag;//標簽是否為左鍵         private void Form1_MouseDown(object sender, MouseEventArgs e)        {            if (e.Button == MouseButtons.Left)            {                mouseOff = new Point(-e.X, -e.Y); //得到變量的值                leftFlag = true;                  //點擊左鍵按下時標注為true;            }        }         private void Form1_MouseMove(object sender, MouseEventArgs e)        {            if (leftFlag)            {                Point mouseSet = Control.MousePosition;                mouseSet.Offset(mouseOff.X, mouseOff.Y);  //設置移動后的位置                Location = mouseSet;            }        }         private void Form1_MouseUp(object sender, MouseEventArgs e)        {            if (leftFlag)            {                leftFlag = false;//釋放鼠標后標注為false;            }        }

方法三:通過panel的MouseDown、MouseMove事件實現窗體移動

        private Point mPoint;         /// <summary>        /// 鼠標按下        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void panel1_MouseDown(object sender, MouseEventArgs e)        {            mPoint = new Point(e.X, e.Y);        }         /// <summary>        /// 鼠標移動        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void panel1_MouseMove(object sender, MouseEventArgs e)        {            if (e.Button == MouseButtons.Left)            {                this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);            }        }

總結:

    (1)實現窗體的拖動,一般是點擊窗體的頭部移動窗體,所以如果窗體頭部的最上層是什么控件就編寫什么控件的MouseDown、MouseMove、MouseUp事件;

    (2)以上3種方法,第2種和第3種的效果一樣,值得注意的是,在拖動窗體時第1種方法不會出現窗體重疊,而第2、3種方法在拖動時會出現窗體重疊;

     簡單的無邊框窗體移動的源碼

二、實現最大化、最小化、關閉

     通過在窗體上放置label或button,然后注冊相應的點擊事件,在事件中實現功能。

1、最大化

        //窗體最大化        private void label1_Click(object sender, EventArgs e)        {            this.WindowState = FormWindowState.Maximized;        }

2、最小化

        //窗體最小化        private void label2_Click(object sender, EventArgs e)        {            this.WindowState = FormWindowState.Minimized;        }

3、關閉

        //關閉窗體        private void label3_Click(object sender, EventArgs e)        {            this.Close();        }

 

三、近似的博客

感謝以下博友:

1、https://blog.csdn.net/lpveneno/article/details/53507112;

2、https://www.cnblogs.com/JiYF/p/9053596.html;
————————————————
版權聲明:本文為CSDN博主「zwb_578209160」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zwb_578209160/article/details/104193476


免責聲明!

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



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