C〓の中でWinFormコントロールのドラッグとスケーリングの実現コード


C〓WinFormコントロールのドラッグとスケーリングは非常に有用な機能です。実现するのは简単です。主にデザインコントロールのMousedown、MouseLeave、Mousemoveイベントです。以下のいくつかのステップは徐々にCコントロールのドラッグとスケーリングの机能を実现します。
1、列挙の種類を定義し、カーソルの状態を記述する  

private enum EnumMousePointPosition  
  {  
  MouseSizeNone  = 0, //'   
  MouseSizeRight  = 1, //'       
  MouseSizeLeft  = 2, //'       
  MouseSizeBottom  = 3, //'       
  MouseSizeTop  = 4, //'       
  MouseSizeTopLeft = 5, //'       
  MouseSizeTopRight = 6, //'       
  MouseSizeBottomLeft = 7, //'       
  MouseSizeBottomRight= 8, //'       
  MouseDrag  = 9  // '      
  }  
2、いくつかの変数を定義する  

 const int Band = 5;  
  const int MinWidth=10;  
  const int MinHeight=10;  
  private EnumMousePointPosition m_MousePointPosition;  
  private Point p,p1;  
3、自分を定義するMyMousedownイベント   

private void MyMouseDown(object sender,System.Windows.Forms.MouseEventArgs e)  
{  
 p.X=e.X;  
 p.Y=e.Y;  
 p1.X=e.X;  
 p1.Y=e.Y;    
}  
4、自分を定義するMyMouseLeaveイベント  

 private void MyMouseLeave(object sender, System.EventArgs e)  
{  
 m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;  
 this.Cursor=Cursors.Arrow;  
}  
5、関数を設計して、コントロールの異なる位置にカーソルを置くスタイルを決定します。   

private EnumMousePointPosition MousePointPosition(Size size,System.Windows.Forms.MouseEventArgs e)  
{  
  
 if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height))   
 {  
 if (e.X < Band)   
 {  
  if (e.Y < Band) {return EnumMousePointPosition.MouseSizeTopLeft;}  
  else   
  {  
  if (e.Y > -1 * Band + size.Height)   
  {return EnumMousePointPosition.MouseSizeBottomLeft;}  
  else   
  {return EnumMousePointPosition.MouseSizeLeft;}  
  }  
 }  
 else  
 {  
  if (e.X > -1 * Band + size.Width)  
  {  
  if (e.Y < Band)  
  {return EnumMousePointPosition.MouseSizeTopRight;}  
  else   
  {  
   if (e.Y > -1 * Band + size.Height)  
   {return EnumMousePointPosition.MouseSizeBottomRight;}  
   else  
   {return EnumMousePointPosition.MouseSizeRight;}  
  }  
  }  
  else  
  {  
  if (e.Y < Band)   
  {return EnumMousePointPosition.MouseSizeTop;}  
  else  
  {  
   if (e.Y > -1 * Band + size.Height)   
   {return EnumMousePointPosition.MouseSizeBottom;}  
   else   
   {return EnumMousePointPosition.MouseDrag;}  
  }  
  }  
 }  
 }  
 else   
 {return EnumMousePointPosition.MouseSizeNone;}  
}  
6、自分のMyMouseMoveイベントを定義します。このイベントでは、上記のデザインの関数を使用します。    

  private void MyMouseMove(object sender,System.Windows.Forms.MouseEventArgs e)  
  {  
  Control lCtrl =(sender as Control);  
  
  if (e.Button==MouseButtons.Left)  
  {  
   switch (m_MousePointPosition)  
   {  
   case EnumMousePointPosition.MouseDrag:     
    lCtrl.Left =lCtrl.Left+ e.X - p.X;  
    lCtrl.Top =lCtrl.Top+ e.Y - p.Y;  
    break;  
   case EnumMousePointPosition.MouseSizeBottom:  
    lCtrl.Height = lCtrl.Height + e.Y - p1.Y;  
    p1.X=e.X;  
    p1.Y=e.Y; //'            
    break;  
   case EnumMousePointPosition.MouseSizeBottomRight:  
    lCtrl.Width  = lCtrl.Width + e.X - p1.X;  
    lCtrl.Height = lCtrl.Height + e.Y - p1.Y;  
    p1.X=e.X;  
    p1.Y=e.Y; //'            
    break;  
   case EnumMousePointPosition.MouseSizeRight:  
    lCtrl.Width  = lCtrl.Width + e.X - p1.X;     
//    lCtrl.Height = lCtrl.Height + e.Y - p1.Y;  
    p1.X=e.X;  
    p1.Y=e.Y; //'            
    break;  
   case EnumMousePointPosition.MouseSizeTop:  
    lCtrl.Top  = lCtrl.Top + (e.Y - p.Y);  
    lCtrl.Height = lCtrl.Height - (e.Y - p.Y);  
    break;  
   case EnumMousePointPosition.MouseSizeLeft:  
    lCtrl.Left  = lCtrl.Left + e.X - p.X;  
    lCtrl.Width  = lCtrl.Width - (e.X - p.X);  
    break;  
   case EnumMousePointPosition.MouseSizeBottomLeft:  
    lCtrl.Left  = lCtrl.Left + e.X - p.X;  
    lCtrl.Width  = lCtrl.Width - (e.X - p.X);  
    lCtrl.Height = lCtrl.Height+ e.Y - p1.Y;  
    p1.X=e.X;  
    p1.Y=e.Y; //'            
    break;  
   case EnumMousePointPosition.MouseSizeTopRight:  
    lCtrl.Top  = lCtrl.Top + (e.Y - p.Y);  
    lCtrl.Width  = lCtrl.Width + (e.X - p1.X);  
    lCtrl.Height = lCtrl.Height - (e.Y - p.Y);  
    p1.X=e.X;  
    p1.Y=e.Y; //'            
    break;  
   case EnumMousePointPosition.MouseSizeTopLeft:  
    lCtrl.Left  = lCtrl.Left + e.X - p.X;  
    lCtrl.Top  = lCtrl.Top + (e.Y - p.Y);  
    lCtrl.Width  = lCtrl.Width - (e.X - p.X);  
    lCtrl.Height = lCtrl.Height - (e.Y - p.Y);  
    break;  
   default:  
    break;  
   }  
   if (lCtrl.Width<MinWidth) lCtrl.Width=MinWidth;  
   if (lCtrl.Height<MinHeight) lCtrl.Height=MinHeight;     
  
  }  
  else  
  {  
   m_MousePointPosition = MousePointPosition(lCtrl.Size, e);  //'           
   switch (m_MousePointPosition)  //'      
   {  
   case EnumMousePointPosition.MouseSizeNone:  
    this.Cursor = Cursors.Arrow;    //'    
    break;  
   case EnumMousePointPosition.MouseDrag:  
    this.Cursor = Cursors.SizeAll;   //'     
    break;  
   case EnumMousePointPosition.MouseSizeBottom:  
    this.Cursor = Cursors.SizeNS;    //'    
    break;  
   case EnumMousePointPosition.MouseSizeTop:  
    this.Cursor = Cursors.SizeNS;    //'    
    break;  
   case EnumMousePointPosition.MouseSizeLeft:  
    this.Cursor = Cursors.SizeWE;    //'    
    break;  
   case EnumMousePointPosition.MouseSizeRight:  
    this.Cursor = Cursors.SizeWE;    //'    
    break;  
   case EnumMousePointPosition.MouseSizeBottomLeft:  
    this.Cursor = Cursors.SizeNESW;   //'       
    break;  
   case EnumMousePointPosition.MouseSizeBottomRight:  
    this.Cursor = Cursors.SizeNWSE;   //'       
    break;  
   case EnumMousePointPosition.MouseSizeTopLeft:  
    this.Cursor = Cursors.SizeNWSE;   //'       
    break;  
   case EnumMousePointPosition.MouseSizeTopRight:  
    this.Cursor = Cursors.SizeNESW;   //'       
    break;  
   default:  
    break;  
   }  
  }  
  
  }  
7、初期化プロセスを作成し、インタフェースパネル1上のすべてのコントロールをMyMouseDown、MyMouseLeave、MyMousemoveイベントに結びつけ、Form初期化またはForm_ロードする時は先にそれを実行します。  

 private void initProperty()  
{  
 for(int i = 0; i < this.panel1.Controls.Count; i++)   
 {   
 this.panel1.Controls[i].MouseDown+= new System.Windows.Forms.MouseEventHandler(MyMouseDown);  
 this.panel1.Controls[i].MouseLeave+= new System.EventHandler(MyMouseLeave);  
 this.panel1.Controls[i].MouseMove += new System.Windows.Forms.MouseEventHandler(MyMouseMove);  
 }  
  
}  
8、ok、実行前にコントロールをいくつか置いて、プログラムを実行すれば、自由に移動したり、サイズを変えたりできるはずです。 
C〓WinFormコントロールのドラッグとスケーリングの実現はここで終わります。 
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。