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

时间:2015-06-05 17:22:14

标签: c# winforms

我在运行时点击鼠标,在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
            }
        }

3 个答案:

答案 0 :(得分:2)

<强>更新

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

原因可能是你似乎认为Paint程序的TextBoxes位于画布上。他们没有。他们绘制文字的方式与绘制线条或圆圈等的方式相同。

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

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

但是:如果您确实想要调整TextBox的大小,请参考以下几点:

  • 您需要通过将光标更改为右侧图标
  • 来向用户显示他们位于正确位置的某种方式
  • 您需要存储鼠标按下点(注意:它将在TextBox内部!)并跟踪MouseMove中的增量。只要按钮关闭,所有rported e.Location仍将位于TextBox坐标中。
  • 使用增量(不是绝对值)来增加TextBox的大小。
  • 非常努力在左右两侧调整大小。 (因为它会涉及同时移动),所以最好不要尝试!
  • 包括移动,这很容易,足以满足您的所有需求。

不,这比增加字体大小要难得多。 200-300行代码,我最后一次这样做..

但你可能会发现另一个更简单的答案;在Google ..

上查找“使用鼠标winforms调整大小c#”

我将旧的答案留在原处,即使它不是你想要的......

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

这不是很难但你需要把它弄好;它基本上与drawing a Rectangle相同  有实时预览。你需要这些东西:四个事件,一个或两个点,一个大小和一个字体变量..

事件是:

  • MouseDown
  • MouseMove
  • MouseUp
  • Paint

您需要存储展示位置(在MouseDown事件中)以及您在MouseMove中更新的尺寸。

从该尺寸开始,您可以计算出可以放入矩形的最大字体大小。

MouseUp上你完成了事情。

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

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

MouseMouve

,您应该检查Button是否为左侧。

对于额外的优秀用户界面,您还可以检查space的键盘并使用它来移动DownPoint ..

Click事件相当无用,顺便说一下..

这是一个让您入门的最小代码示例:

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运动缩小一点来确定字体大小。你可以通过一点点毕达哥拉斯来改善; - )

答案 1 :(得分:2)

调整窗口大小的能力是天生的行为,由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;
        }
    }
}

答案 2 :(得分:0)

此示例将在TextBox事件上创建MouseDown并开始调整大小,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;
}