C#moveable g.drawstring over picturebox

时间:2016-04-09 22:29:29

标签: c#

我有一些问题。请帮我。 Here is my outline

我试过这段代码

Graphics g = Graphics.FromImage(bmp);
g.DrawString(yazi,
   new Font("Tahoma",Convert.ToInt32(txtboyut.Text)),
   new SolidBrush(renk), 50,50);
pictureBox1.Image = bmp;

我想移动这个drawString,请帮帮我

1 个答案:

答案 0 :(得分:0)

看着你的表格,我可以猜到你想要什么以及你现在缺少什么......

您的代码:

g.DrawString(someText, someFont, someBrush, 50,50);

将始终打印到固定位置。 (它甚至没有显示: - ()

所以要做的第一件事就是创建一个类级变量来保存位置:

Point textLocation = new Point(-123, -321);

对于更干净的代码,我们再添加一个:

readonly Point Invalid = new Point(-123, -321);

稍后我们要测试该位置是否有效,但Point是一个结构且不能null且有{{1}这真的是(0,0),这使得它是一个非常正常的值。所以我们使用一个神奇的数字,但只在这里,并有一个有用的名称; - )

现在我们可以使用新变量来应用文本:

Point.Empty

请注意,我从private void cb_ApplyText_Click(object sender, EventArgs e) { Graphics g = Graphics.FromImage(pictureBox1.Image); g.DrawString(textBox1.Text, new Font("Tahoma", Convert.ToInt32(numericUpDown1.Value)), new SolidBrush(foreColor), textLocation); textLocation = Invalid; pictureBox1.Refresh(); } 获取字体大小。

更有趣:通过致电NumericUpDown,我们轻推Refresh以显示图片中的更改。

另请注意我如何将PictureBox变量设置为testLocation,因此我们在绘制到图像像素后不会将其绘制到曲面上。

现在针对真正的问题:如何使位置动态。为此,您需要对Invalid事件进行编码:

MouseMove

请注意private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (!e.Button.HasFlag(MouseButtons.Left)) return; textLocation = e.Location; pictureBox1.Invalidate(); } 调用:这会触发Invalidate事件,我们需要在当前鼠标位置绘制文本:

Paint

除了检查有效的文本位置外,这里没什么特别的。

现在,在按住鼠标按钮的同时,您可以移动文本,当它的位置正常时,您可以使用按钮将其应用。

请注意另外一个潜在问题: 两个 private void pictureBox1_Paint(object sender, PaintEventArgs e) { if (textLocation != Invalid) e.Graphics.DrawString(textBox1.Text, new Font("Tahoma", Convert.ToInt32(numericUpDown1.Value)), new SolidBrush(foreColor), textLocation); } 来电使用两个不同的 DrawString个对象,这将是只有两者都具有相同的分辨率才有效。 Graphics将具有屏幕的分辨率,但您加载的图像可以具有任何分辨率,甚至没有。

避免问题的最简单方法是更改​​图像的分辨率,直到保存为止;然后重置为加载后必须存储的值..

更新:以下是一个多功能保存方法的示例,您可以选择各种文件格式:

e.Graphics