我有一些问题。请帮我。 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,请帮帮我
答案 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