如何像在绘图程序中一样通过鼠标拖动来调整动态创建的文本框的大小

本文关键字:调整 拖动 鼠标 动态 创建 文本 程序 绘图 何像 一样 | 更新日期: 2023-09-27 17:53:49

我在PictureBox中创建了一个文本框,在运行时单击鼠标。现在我想用鼠标拖动来调整它的大小。有什么简单的方法可以做到这一点吗?

这是我到目前为止的代码:

public partial class Form1 : Form
    {
        public static TextBox PTB; //declaring text box to be created
        public static bool textOption; //stores the state of button , i.e whether or not text box button is clicked before or not
        public Form1()
        {
            InitializeComponent();
            this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
        }
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            if (textOption == true)//if user selected option to draw text box
            {
                MouseEventArgs eM = (MouseEventArgs)e; //create an instance of mouse event
                PTB = new TextBox();//dynamically creating text box
                PTB.Location = new System.Drawing.Point(eM.X, eM.Y);//settign position of textbox where mouse was clicked
                PTB.Name = "textBox1";
                PTB.Size = new System.Drawing.Size(100, 20);//size of text box
                this.pictureBox1.Controls.Add(PTB);//adding the textbox to the picture box
            }
        }

如何像在绘图程序中一样通过鼠标拖动来调整动态创建的文本框的大小

更新

对不起,我完全误解了你的问题。

原因可能是你似乎有这样的印象,绘画程序有文本框坐在他们的画布上。他们没有。他们画文字的方式和画直线或圆的方式一样。

另外:调整文本框的大小不会改变字体大小,如果这是你想要的。

最后:TextBox永远不会是透明的,它总是位于PictureBox上,看起来就像一个TextBox。不像油漆程序中的任何东西…

但是:如果你真的想调整文本框的大小,这里有一些提示:

  • 你需要一些方法来显示用户他们是在正确的位置通过改变光标到正确的图标
  • 你需要存储鼠标向下的点(注意:它将在文本框内!),并跟踪鼠标移动的增量。只要按下按钮,所有报告的e.Location仍然在文本框的坐标中。
  • 使用增量(不是绝对值)来增加文本框的大小。
  • 真的很难在顶部和左侧调整大小。(因为它会涉及到同时移动),所以最好不要尝试!
  • 一定要包括搬家,这很容易,而且足以满足你的所有需求。

不,这比增加字体大小困难得多。200-300行代码,上次我这么做了…

但你可能会找到另一个更简单的答案;在Google上查找"用鼠标调整控件的大小".

我把旧的答案留在原地,即使它不是你想要的。


关于放置文本时改变字体大小的旧答案:

这并不难,但你需要做对;它基本上与绘制矩形相同有一个实时预览。你需要这些东西:四个事件,一个或两个点,一个大小和一个字体变量。

事件如下:

  • MouseDown
  • MouseMove
  • MouseUp
  • Paint

你需要存储一个放置点(在MouseDown事件中)和一个你在MouseMove中更新的大小。

从这个大小你可以计算出你可以在矩形中容纳的最大字体大小。

MouseUp上你完成了事情。

Paint事件中,您在当前字体大小的下点绘制字符串。

MouseMove中,您调用PictureBox上的Invalidate来触发Paint事件

MouseMouve你应该检查Button是左边的一个。

对于额外好的UI,您还可以检查键盘的space,并使用它来移动DownPoint.

Click事件是相当无用的,btw..

下面是一个简单的代码示例:

Point mDown = Point.Empty;
float fSize = 12f;
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    using (Font font = new Font("Consolas", fSize))
        e.Graphics.DrawString("Hello World", font, Brushes.Black, mDown);
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    mDown = e.Location;
    pictureBox1.Invalidate();
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    fSize = Math.Abs(e.Y - mDown.Y) / 2f + 1;
    pictureBox1.Invalidate();
}

我漏掉了MouseUp。在这里,你可以将绘制字符串的最终状态(字体,位置等)存储在某个地方,或者通过绘制到Bitmap等来保存它。

我也没有做一个完整的矩形计算,但确定字体大小通过简单地缩放y移动一点…你可以用一点毕达哥拉斯来改进;-)

调整窗口大小的能力是天生的行为,由Windows内置的默认窗口过程提供。你所要做的就是给控件一个可调整大小的边框。其他一切都是免费的,你会得到正确的光标和拖动一个角或边缘调整控件的大小。

using System;
using System.Windows.Forms;
class ResizeableTextBox : TextBox {
    protected override CreateParams CreateParams {
        get {
            var cp = base.CreateParams;
            cp.Style |= 0x840000;  // Turn on WS_BORDER + WS_THICKFRAME
            return cp;
        }
    }
}

此示例将在MouseDown事件上创建TextBox并开始调整大小,TextBox的最终大小将在MouseUp事件上释放鼠标按钮的位置。它也可以让你创建多个文本框。

我知道这可能不是你想要的,但这可能是一个开始。

private int _textBoxCounter;
private TextBox _textBoxCurrentResizing;
public Form1()
{
    InitializeComponent();
    pictureBox1.MouseDown += PictureBox1OnMouseDown;
    pictureBox1.MouseUp += PictureBox1OnMouseUp;
    pictureBox1.MouseMove += PictureBox1OnMouseMove;
}
public Point RelativeMousePosition { get { return PointToClient(MousePosition); } }
private void PictureBox1OnMouseMove(object sender, MouseEventArgs mouseEventArgs)
{
    ResizeTextBox();
}
private void PictureBox1OnMouseUp(object sender, MouseEventArgs mouseEventArgs)
{
    EndResizeTextBox();
}
private void PictureBox1OnMouseDown(object sender, MouseEventArgs mouseEventArgs)
{
    var tb = CreateTextBox();
    StartResizeTextBox(tb);
}
private TextBox CreateTextBox()
{
    var tb = new TextBox
    {
        Location = RelativeMousePosition,
        Size = new Size(100, 20),
        Multiline = true,
        Name = "textBox" + _textBoxCounter++,
    };
    pictureBox1.Controls.Add(tb);
    return tb;
}
private void StartResizeTextBox(TextBox tb)
{
    _textBoxCurrentResizing = tb;
}
private void ResizeTextBox()
{
    if (_textBoxCurrentResizing == null) return;
    var width = Math.Abs(_textBoxCurrentResizing.Left - RelativeMousePosition.X);
    var height = Math.Abs(_textBoxCurrentResizing.Top - RelativeMousePosition.Y);
    _textBoxCurrentResizing.Size = new Size(width, height);
}
private void EndResizeTextBox()
{
    _textBoxCurrentResizing = null;
}