C# WinForm實(shí)現(xiàn)窗體上控件自由拖動(dòng)功能示例
本文實(shí)例講述了C# WinForm實(shí)現(xiàn)窗體上控件自由拖動(dòng)功能。分享給大家供大家參考,具體如下:
說明:首先在窗體上放一個(gè)PictrueBox控件,命名為pb1,拖動(dòng)完整代碼如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WinFormDrag { public partial class Form1 : Form { //鼠標(biāo)按下坐標(biāo)(control控件的相對(duì)坐標(biāo)) Point mouseDownPoint = Point.Empty; //顯示拖動(dòng)效果的矩形 Rectangle rect = Rectangle.Empty; //是否正在拖拽 bool isDrag = false; public Form1() { InitializeComponent(); } private void Form1_Paint(object sender, PaintEventArgs e) { if (rect != Rectangle.Empty) { if (isDrag) {//畫一個(gè)和Control一樣大小的黑框 e.Graphics.DrawRectangle(Pens.Black, rect); } else { e.Graphics.DrawRectangle(new Pen(this.BackColor), rect); } } } /// <summary> /// 按下鼠標(biāo)時(shí) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pb1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouseDownPoint = e.Location; //記錄控件的大小 rect = pb1.Bounds; } } /// <summary> /// 移過時(shí) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pb1_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { isDrag = true; //重新設(shè)置rect的位置,跟隨鼠標(biāo)移動(dòng) rect.Location = getPointToForm(new Point(e.Location.X - mouseDownPoint.X, e.Location.Y - mouseDownPoint.Y)); this.Refresh(); } } /// <summary> /// 釋放鼠標(biāo)按鈕時(shí) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pb1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (isDrag) { isDrag = false; //移動(dòng)control到放開鼠標(biāo)的地方 pb1.Location = rect.Location; this.Refresh(); } reset(); } } //重置變量 private void reset() { mouseDownPoint = Point.Empty; rect = Rectangle.Empty; isDrag = false; } //把相對(duì)與control控件的坐標(biāo),轉(zhuǎn)換成相對(duì)于窗體的坐標(biāo)。 private Point getPointToForm(Point p) { return this.PointToClient(pb1.PointToScreen(p)); } } }
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《WinForm控件用法總結(jié)》、《C#窗體操作技巧匯總》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#常見控件用法教程》、《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》及《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#中析構(gòu)函數(shù)、Dispose、Close方法的區(qū)別
本文詳細(xì)對(duì)比了C#中析構(gòu)函數(shù)、Dispose和Close方法的區(qū)別,三者都是釋放資源,本文介紹了他們各自的使用方法和使用場(chǎng)景,希望對(duì)大家有所幫助。2016-04-04C#調(diào)用帶結(jié)構(gòu)體指針Dll的方法
在C#到底該如何安全的調(diào)用這樣的DLL接口函數(shù)呢?本文將詳細(xì)介紹如何調(diào)用各種參數(shù)的方法,對(duì)C#結(jié)構(gòu)體指針DLL相關(guān)知識(shí)感興趣的朋友一起看看吧2021-07-07C#實(shí)現(xiàn)翻轉(zhuǎn)字符串的方法
這篇文章主要介紹了C#實(shí)現(xiàn)翻轉(zhuǎn)字符串的方法,涉及C#操作字符串的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04DevExpress設(shè)置餅狀圖的Lable位置實(shí)例
這篇文章主要介紹了DevExpress設(shè)置餅狀圖的Lable位置的方法,以實(shí)例形式詳細(xì)講述了設(shè)置餅狀圖的Lable位置具體實(shí)現(xiàn)過程,需要的朋友可以參考下2014-10-10c#禁止通過拖動(dòng),雙擊標(biāo)題欄改變窗體大小的方法
今天小編就為大家分享一篇c#禁止通過拖動(dòng),雙擊標(biāo)題欄改變窗體大小的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12