C# 实现拖拉控件改变位置与大小的方法

2019-12-30 19:13:45于丽

测试界面:

C#,拖拉控件,改变位置,大小

到目前为止,还只是有边框,下面将实现拖拉功能。

首先来实现,当鼠标放在响应区域的时候,根据不同的位置显示不同的箭头样子。

为此先创建一个枚举,用来记录当前鼠标的位置,等拖拉的时候根据该枚举值做不同的计算。


/// <summary>
/// 鼠标在控件中位置
/// </summary>
enum MousePosOnCtrl
{
 NONE = 0,
 TOP = 1,
 RIGHT = 2,
 BOTTOM = 3,
 LEFT = 4,
 TOPLEFT = 5,
 TOPRIGHT = 6,
 BOTTOMLEFT = 7,
 BOTTOMRIGHT = 8,
}

创建一个方法,用来改变光标的样子以及枚举值


/// <summary>
/// 设置光标状态
/// </summary>
public bool SetCursorShape(int x, int y)
{
 Point point = new Point(x, y);
 if (!ControlRect.Contains(point))
 {
  Cursor.Current = Cursors.Arrow;
  return false;
 }
 else if (smallRects[0].Contains(point))
 {
  Cursor.Current = Cursors.SizeNWSE;
  mpoc = MousePosOnCtrl.TOPLEFT;
 }
 else if (smallRects[1].Contains(point))
 {
  Cursor.Current = Cursors.SizeNESW;
  mpoc = MousePosOnCtrl.TOPRIGHT;
 }
 else if (smallRects[2].Contains(point))
 {
  Cursor.Current = Cursors.SizeNESW;
  mpoc = MousePosOnCtrl.BOTTOMLEFT;
 }
 else if (smallRects[3].Contains(point))
 {
  Cursor.Current = Cursors.SizeNWSE;
  mpoc = MousePosOnCtrl.BOTTOMRIGHT;
 }
 else if (sideRects[0].Contains(point))
 {
  Cursor.Current = Cursors.SizeNS;
  mpoc = MousePosOnCtrl.TOP;
 }
 else if (sideRects[1].Contains(point))
 {
  Cursor.Current = Cursors.SizeWE;
  mpoc = MousePosOnCtrl.LEFT;
 }
 else if (sideRects[2].Contains(point))
 {
  Cursor.Current = Cursors.SizeNS;
  mpoc = MousePosOnCtrl.BOTTOM;
 }
 else if (sideRects[3].Contains(point))
 {
  Cursor.Current = Cursors.SizeWE;
  mpoc = MousePosOnCtrl.RIGHT;
 }
 else
 {
  Cursor.Current = Cursors.Arrow;
 }
 return true;
}

接着就是处理相关的三大事件MouseDown、MouseMove、MouseUp来实现拖拉。如同MoveControl都要增加以下两个字段。


private Point pPoint; //上个鼠标坐标
private Point cPoint; //当前鼠标坐标

/// <summary>
 /// 鼠标按下事件:记录当前鼠标相对窗体的坐标
 /// </summary>
 void FrameControl_MouseDown(object sender, MouseEventArgs e)
 {
  pPoint = Cursor.Position;
 }
 /// <summary>
/// 鼠标移动事件:让控件跟着鼠标移动
/// </summary>
void FrameControl_MouseMove(object sender, MouseEventArgs e)
{
 if (e.Button == MouseButtons.Left)
 {
  this.Visible = false;
  MoveControl.DrawDragBound(baseControl);
  ControlMove();
 }
 else
 {
  this.Visible = true;
  SetCursorShape(e.X, e.Y); //更新鼠标指针样式
 }
}
/// <summary>
/// 鼠标弹起事件:让自定义的边框出现
/// </summary>
void FrameControl_MouseUp(object sender, MouseEventArgs e)
{
 this.baseControl.Refresh(); //刷掉黑色边框
 this.Visible = true;
 CreateBounds();
 Draw();
}