1. 程式人生 > >C# WinForm控制元件的拖動和縮放的實現

C# WinForm控制元件的拖動和縮放的實現

轉自:http://blog.csdn.net/joyhen/article/details/8572505

C# WinForm控制元件的拖動和縮放是個很有用的功能。實現起來其實很簡單的,主要是設計控制元件的MouseDown、MouseLeave、MouseMove事件,下面的幾個步驟將逐步實現C# WinForm控制元件的拖動和縮放的功能。

  1. 1、定義一個列舉型別,描述游標狀態  
  2. privateenum EnumMousePointPosition    
  3.    {    
  4.     MouseSizeNone   = 0, //'無  
  5.     MouseSizeRight   = 1, //'拉伸右邊框  
  6.     MouseSizeLeft   = 2, //'拉伸左邊框  
  7.     MouseSizeBottom   = 3, //'拉伸下邊框  
  8.     MouseSizeTop   = 4, //'拉伸上邊框  
  9.     MouseSizeTopLeft = 5, //'拉伸左上角  
  10.     MouseSizeTopRight = 6, //'拉伸右上角  
  11.     MouseSizeBottomLeft = 7, //'拉伸左下角  
  12.     MouseSizeBottomRight= 8, //'拉伸右下角  
  13.     MouseDrag    = 9   // '滑鼠拖動  
  14.    }   

  1. 2、定義幾個變數  
  2. constint Band = 5;    
  3.    constint MinWidth=10;    
  4.    constint MinHeight=10;    
  5.    private EnumMousePointPosition m_MousePointPosition;    
  6.    private Point p,p1;   

  1. 3、定義自己的MyMouseDown事件  
  2. privatevoid MyMouseDown(object sender,System.Windows.Forms.MouseEventArgs e)    
  3. {    
  4.  p.X=e.X;    
  5.  p.Y=e.Y;    
  6.  p1.X=e.X;    
  7.  p1.Y=e.Y;       
  8. }   

  1. 4、定義自己的MyMouseLeave事件  
  2. privatevoid MyMouseLeave(object sender, System.EventArgs e)    
  3. {    
  4.  m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;    
  5.  this.Cursor=Cursors.Arrow;    
  6. }   

  1. 5、設計一個函式,確定游標在控制元件不同位置的樣式  
  2. private EnumMousePointPosition MousePointPosition(Size size,System.Windows.Forms.MouseEventArgs e)    
  3. {    
  4.  if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height))     
  5.  {    
  6.   if (e.X < Band)     
  7.   {    
  8.    if (e.Y < Band) {return EnumMousePointPosition.MouseSizeTopLeft;}    
  9.    else
  10.    {    
  11.     if (e.Y > -1 * Band + size.Height)     
  12.     {return EnumMousePointPosition.MouseSizeBottomLeft;}    
  13.     else
  14.     {return EnumMousePointPosition.MouseSizeLeft;}    
  15.    }    
  16.   }    
  17.   else
  18.   {    
  19.    if (e.X > -1 * Band + size.Width)    
  20.    {    
  21.     if (e.Y < Band)    
  22.     {return EnumMousePointPosition.MouseSizeTopRight;}    
  23.     else
  24.     {    
  25.      if (e.Y > -1 * Band + size.Height)    
  26.      {return EnumMousePointPosition.MouseSizeBottomRight;}    
  27.      else
  28.      {return EnumMousePointPosition.MouseSizeRight;}    
  29.     }    
  30.    }    
  31.    else
  32.    {    
  33.     if (e.Y < Band)     
  34.     {return EnumMousePointPosition.MouseSizeTop;}    
  35.     else
  36.     {    
  37.      if (e.Y > -1 * Band + size.Height)     
  38.      {return EnumMousePointPosition.MouseSizeBottom;}    
  39.      else
  40.      {return EnumMousePointPosition.MouseDrag;}    
  41.     }    
  42.    }    
  43.   }    
  44.  }    
  45.  else
  46.  {return EnumMousePointPosition.MouseSizeNone;}    
  47. }   

  1. 6、定義自己的MyMouseMove事件,在這個事件裡,會使用上面設計的函式  
  2.    privatevoid MyMouseMove(object sender,System.Windows.Forms.MouseEventArgs e)    
  3.    {    
  4.     Control lCtrl =(sender as Control);    
  5.     if (e.Button==MouseButtons.Left)    
  6.     {    
  7.      switch (m_MousePointPosition)    
  8.      {    
  9.       case EnumMousePointPosition.MouseDrag:          
  10.        lCtrl.Left =lCtrl.Left+ e.X - p.X;    
  11.        lCtrl.Top =lCtrl.Top+ e.Y - p.Y;    
  12.        break;    
  13.       case EnumMousePointPosition.MouseSizeBottom:    
  14.        lCtrl.Height = lCtrl.Height + e.Y - p1.Y;    
  15.        p1.X=e.X;    
  16.        p1.Y=e.Y; //'記錄游標拖動的當前點  
  17.        break;    
  18.       case EnumMousePointPosition.MouseSizeBottomRight:    
  19.        lCtrl.Width   = lCtrl.Width + e.X - p1.X;    
  20.        lCtrl.Height = lCtrl.Height + e.Y - p1.Y;    
  21.        p1.X=e.X;    
  22.        p1.Y=e.Y; //'記錄游標拖動的當前點  
  23.        break;    
  24.       case EnumMousePointPosition.MouseSizeRight:    
  25.        lCtrl.Width   = lCtrl.Width + e.X - p1.X;          
  26. //       lCtrl.Height = lCtrl.Height + e.Y - p1.Y;  
  27.        p1.X=e.X;    
  28.        p1.Y=e.Y; //'記錄游標拖動的當前點  
  29.        break;    
  30.       case EnumMousePointPosition.MouseSizeTop:    
  31.        lCtrl.Top   = lCtrl.Top + (e.Y - p.Y);    
  32.        lCtrl.Height = lCtrl.Height - (e.Y - p.Y);    
  33.        break;    
  34.       case EnumMousePointPosition.MouseSizeLeft:    
  35.        lCtrl.Left   = lCtrl.Left + e.X - p.X;    
  36.        lCtrl.Width   = lCtrl.Width - (e.X - p.X);    
  37.        break;    
  38.       case EnumMousePointPosition.MouseSizeBottomLeft:    
  39.        lCtrl.Left   = lCtrl.Left + e.X - p.X;    
  40.        lCtrl.Width   = lCtrl.Width - (e.X - p.X);    
  41.        lCtrl.Height = lCtrl.Height+ e.Y - p1.Y;    
  42.        p1.X=e.X;    
  43.        p1.Y=e.Y; //'記錄游標拖動的當前點  
  44.        break;    
  45.       case EnumMousePointPosition.MouseSizeTopRight:    
  46.        lCtrl.Top   = lCtrl.Top + (e.Y - p.Y);    
  47.        lCtrl.Width   = lCtrl.Width + (e.X - p1.X);    
  48.        lCtrl.Height = lCtrl.Height - (e.Y - p.Y);    
  49.        p1.X=e.X;    
  50.        p1.Y=e.Y; //'記錄游標拖動的當前點  
  51.        break;    
  52.       case EnumMousePointPosition.MouseSizeTopLeft:    
  53.        lCtrl.Left   = lCtrl.Left + e.X - p.X;    
  54.        lCtrl.Top   = lCtrl.Top + (e.Y - p.Y);    
  55.        lCtrl.Width   = lCtrl.Width - (e.X - p.X);    
  56.        lCtrl.Height = lCtrl.Height - (e.Y - p.Y);    
  57.        break;    
  58.       default:    
  59.        break;    
  60.      }    
  61.      if (lCtrl.Width<MinWidth) lCtrl.Width=MinWidth;    
  62.      if (lCtrl.Height<MinHeight) lCtrl.Height=MinHeight;          
  63.     }    
  64.     else
  65.     {    
  66.      m_MousePointPosition = MousePointPosition(lCtrl.Size, e);   //'判斷游標的位置狀態  
  67.      switch (m_MousePointPosition)   //'改變游標  
  68.      {    
  69.       case EnumMousePointPosition.MouseSizeNone:    
  70.        this.Cursor = Cursors.Arrow;        //'箭頭  
  71.        break;    
  72.       case EnumMousePointPosition.MouseDrag:    
  73.        this.Cursor = Cursors.SizeAll;      //'四方向  
  74.        break;    
  75.       case EnumMousePointPosition.MouseSizeBottom:    
  76.        this.Cursor = Cursors.SizeNS;       //'南北  
  77.        break;    
  78.       case EnumMousePointPosition.MouseSizeTop:    
  79. 相關推薦

    C# WinForm控制元件實現

    轉自:http://blog.csdn.net/joyhen/article/details/8572505 C# WinForm控制元件的拖動和縮放是個很有用的功能。實現起來其實很簡單的,主要是設計控制元件的MouseDown、MouseLeave、MouseMove

    C# Winform 控制元件大小隨窗體大小等比例

    當你的程式設計能力有了一定提升之後,那你在敲程式碼的時候就得開始想想怎麼將自己的寫的程式碼元件化了。所謂元件化,就是將程式碼中公共模組的程式碼提取出來作為一個方法或函式,使其能夠被其他程式或者他人直接使用。 public Form1() {

    在WPF中的Canvas上實現控制元件

       如題,專案中需要實現使用滑鼠拖動、縮放一個矩形框,WPF中沒有現成的,那就自己造一個輪子:)    造輪子前先看看Windows自帶的畫圖工具中是怎樣做的,如下圖:      在被拖動的矩形框四周有9個小框,可以從不同方向拖動來放大縮小矩形框,另外需要注意的是,還有一

    Android,自定義內容,控制元件製作(可RelativeLayout定製)

    先上效果圖: 一.     製作此控制元件的起源 專案需要一個可以拖動的控制元件,在網上可以找到很多例子,有圖片拖動控制元件,有textview拖動控制元件。但是專案中需要控制元件同時可以動態通過手指調整尺寸,並且控制元件的內容不固定,需要自定義內容,即可以新增任意內容

    C# 公共控制元件之CheckboxCheckedListBox

    Winform的開發基本都是基於控制元件事件的,也就是事件驅動型的。 多選框的放置和值的獲取有很多種,這裡介紹幾個簡單常用的方法 1、直接放置Checkbox,並獲取Checkbox的值 上圖 做法也非常簡單,就是在form中放置多個checkbox,然後迴圈遍歷,檢查其checke

    WinForm版影象編輯小程式(實現影象、旋轉、摳圖)

    WinForm版影象編輯小程式(實現影象拖動、縮放、旋轉、摳圖) 閒暇之餘,開發一個圖片編輯小程式。程式主要特點就是可方便的對多個影象編輯,實現了一些基本的操作。本文主要介紹一下程式的功能、設計思路。 執行程式 下載地址: 百度網盤。https://pan.baidu.com/s/1cs

    C# WinForm控制元件美化擴充套件系列之ImageComboBox_C# 視角_CS程式設計師之窗

    (1)美化下拉按鈕和邊框,前面的文章已經實現。 (2)當ComboBox沒有控制元件選擇項和沒有焦點時顯示提示使用者操作資訊,前面的也文章已經實現。 (3)在下拉列表框的項中顯示圖示,項可以縮排。 (4)在ComboBox控制元件中也顯示圖示。 來看看最終需要

    C# winform 控制元件間執行緒更新問題處理方法

    1、程式入口新增:Control.CheckForIllegalCrossThreadCalls = false; 2、重新整理控制元件上新增Invoke方法:this.Invoke(handler, new object[] { e });

    控制元件後,某些事件引起的佈局重置或位置還原問題

    自定義了一個imageview控制元件,可以隨意拖動和縮放。 遇到了一個棘手的問題,就是每當拖動完控制元件以後,執行某些操作的時候(比如說觸發虛擬鍵盤),該控制元件的位置就會還原到初始位置。 經過嘗試,問題已經解決, 解決方法是:捕捉ACTION_UP動作,當發現這個動作

    安卓控制元件

    /** 此文主要有兩大要點 1.控制元件的拖動 2.控制元件同時實現點選事件與拖動事件時的衝突處理 要點地方都有註釋 */ public class extents Activity{ /** Called when the activity is first create

    Android控制元件實現

    1.今天突然想到做個實現個控制元件拖動效果,就來試試,一查原來還是很簡單的 2.原理就是實現OnTouchLinstener,然後觸控式螢幕幕時改變控制元件的位置,當然了會有人問OnTouch與OnClick有什麼區別,百度搜一下就知道了,懶得說。。 3.廢

    WPF實現控制元件

    實現控制元件拖動的基本原理是對滑鼠位置的捕獲,同時根據滑鼠按鍵的按下、釋放確定控制元件移動的幅度和時機。 簡單示例: 在Grid中有一個Button,通過滑鼠事件改編Button的Margin屬性,

    C#利用控制元件拽技術製作拼圖遊戲

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Tex

    《Dotnet9》系列-開源C# Winform控制元件庫1《HZHControls》強力推薦

    大家好,我是Dotnet9小編,一個從事dotnet開發8年+的程式設計師。我最近在寫dotnet分享文章,希望能讓更多人看到dotnet的發展,瞭解更多dotnet技術,幫助dotnet程式設計師應用dotnet技術更好的運用於工作和學習中去。 文章閱讀導航 一、寫在前面的話 二、HZHContro

    我的Android進階之旅------>Android自定義View來實現解析lrc歌詞並同步滾動、上下歌詞的功能

    前言 最近有個專案有關於播放音樂時候,關於歌詞有以下幾個功能: 1、實現歌詞同步滾動的功能,即歌曲播放到哪句歌詞,就高亮地顯示出正在播放的這個歌詞; 2、實現上下拖動歌詞時候,可以拖動播放器的進度。即可以不停地上下拖動歌詞,

    Qt 無邊框無非客戶區視窗改變大小、滑鼠變形,windows同款,完美實現

    簡單點說,是在windows下實現視窗拖動和改變大小,一種方法是過載mousePressEvent系列全家福函式,然後在mouseMoveEvent中實現邊移滑鼠視窗就一邊重繪。這種方法網上資料很多,見下:這種方法缺點是移動的時候視窗閃爍厲害。摒棄。但該方法給了一個很好的思路

    Android自定義View來實現解析lrc歌詞同步滾動、上下歌詞等功能

    http://blog.csdn.net/ouyang_peng/article/details/50813419 前言 最近有個專案有關於播放音樂時候,關於歌詞有以下幾個功能:  1、實現歌詞同步滾動的功能,即歌曲播放到哪句

    UEditor控制元件圖片無法正常

    問題: ueditor下插入圖片,不能正常調節縮放大小 原因: box-sizing樣式被設定成border-box 解決方法: 在ueditor.min.css中加入如下程式碼: .edui-container *{-webkit-bo

    C#WinForm開發系列之CheckBox控制元件全選取消全選以及checkedListBox的基礎使用介紹

    一.研究了一下C# CheckBox控制元件的全選和反選問題,這裡研究了兩種全選的方法: 1.首先,使用3個panel控制元件和8個checkBox控制元件實現了反選和全選的實現介面,panel11的Dock屬性設為Top,panel12的Dock屬性設為Left,pane

    *C#(WPF)--矩陣矩陣動畫(展開,不足動畫效果)

    stop 項目 鼠標 ani sys unlock 控件移動 top art 最近在研發新的項目,遇到了一個桌面模式下的難點--展開動畫。之前動畫這方面沒做過,也許很多人開始做的時候也會遇到相關問題,因此我把幾個重點及實際效果圖總結展示出來: 我的開發環境是在