我在运行时点击鼠标,在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
}
}
答案 0 :(得分:2)
<强>更新强>
对不起,我完全误解了你的问题。
原因可能是你似乎认为Paint程序的TextBoxes位于画布上。他们没有。他们绘制文字的方式与绘制线条或圆圈等的方式相同。
另外:调整TextBox的大小不会改变字体大小,如果这是你想要的。
最后:TextBox永远不会透明,它总是位于PictureBox上,看起来就像TextBox一样。不像Paint程序中的任何东西..
但是:如果您确实想要调整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;
}