C# winform 运行时可以调整大小和位置的文本框

1.使用鼠标控制位置:在任意位置点击左键拖动

2.使用鼠标控制大小:在控件右下角待变为‘调整光标’是可以调整大小

3.使用键盘控制位置:alt + 方向键

4.使用键盘控制大小:ctrl + 方向键


using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;


namespace AppGenCode.Printer
{


  public enum EnumAdjust
  {
    Nothing =0,
    Size = 1,
    Postion = 2
  }


  public partial class AdjustTextBox : TextBox
  {
    public AdjustTextBox()
    {
      InitializeComponent();
      InitCtrl();
    }


    public AdjustTextBox(IContainer container)
    {
      container.Add(this);
      InitializeComponent();
      InitCtrl();
    }


    private bool m_isMoving = false;
    private Point m_offset = new Point(0,0);
    private Size m_intSize = new Size(0, 0);
    private EnumAdjust m_adjust = EnumAdjust.Nothing;
    private int m_x, m_y, m_w, m_h = 0;


    private Rectangle RecAdjustSize
    {
      get { return new Rectangle(this.Width-15,this.Height-15,15,15);}
    }
    private Rectangle RecAdjustPostion
    {
      get { return new Rectangle(0, 0, this.Width, this.Height); }
    }


    private void InitCtrl()
    {
      this.Text = "asdf1234";
      this.Multiline = true;
      this.BorderStyle = BorderStyle.FixedSingle;
      this.ReadOnly = true;
    }
    #region 鼠标事件
    protected override void OnMouseDown(MouseEventArgs e)
    {
      m_isMoving = true;
      m_offset = new Point(e.X, e.Y);
      m_intSize.Width = this.Width;
      m_intSize.Height = this.Height;


      if (RecAdjustSize.Contains(e.X, e.Y)) //调整大小
      {
        this.Cursor = Cursors.SizeNWSE;
        m_adjust = EnumAdjust.Size;
      }
      else if (RecAdjustPostion.Contains(e.X, e.Y)) //调整位置
      {
        this.Cursor = Cursors.SizeAll;
        m_adjust = EnumAdjust.Postion;
      }
      else
      {
        m_adjust = EnumAdjust.Nothing;
      }
      base.OnMouseDown(e);
    }
    protected override void OnMouseUp(MouseEventArgs mevent)
    {
      Cursor = Cursors.Default;
      m_isMoving = false;
      
      base.OnMouseUp(mevent);
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
      CursorCtrl(e.X, e.Y);
      m_x = this.Left;
      m_y = this.Top;
      m_w = this.Width;
      m_h = this.Height;
      if (m_isMoving)
      {
        switch (m_adjust)
        {
          case EnumAdjust.Size:
            m_w = m_intSize.Width + (e.X - m_offset.X);
            m_h = m_intSize.Height + (e.Y - m_offset.Y);
            break;
          case EnumAdjust.Postion:
            m_x = Location.X + (e.X - m_offset.X);
            m_y = Location.Y + (e.Y - m_offset.Y);
            break;
        }
        BackColor = Color.Red;
        this.SetBounds(m_x, m_y, m_w, m_h);
      }
      base.OnMouseMove(e);
    }
    #endregion


    #region 键盘事件


    protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
    {
      base.OnPreviewKeyDown(e);
      if (e.Alt) //调整大小
      {
        switch (e.KeyCode)
        {
          case Keys.Left:
            this.Width -= 5;
            break;
          case Keys.Right:
            this.Width += 5;
            break;
          case Keys.Down:
            this.Height += 5;
            break;
          case Keys.Up:
            this.Height -= 5;
            break;
        }
        return;
      }
      if (e.Control)
      {
        switch (e.KeyCode) //调整位置
        {
          case Keys.Left:
            this.Left -= 5;
            break;
          case Keys.Right:
            this.Left += 5;
            break;
          case Keys.Up:
            this.Top -= 5;
            break;
          case Keys.Down:
            this.Top += 5;
            break;
        }
      }
    }
    #endregion


    private void CursorCtrl(int x,int y)
    {
      if (!m_isMoving && RecAdjustSize.Contains(x,y))
      {
        this.Cursor = Cursors.SizeNWSE;
        return;
      }
      this.Cursor = Cursors.Default;
    }
  }
}


草青工作室:http://blog.csdn.net/xxj_jing
原文地址:http://blog.csdn.net/xxj_jing/article/details/8594946




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值