【问题标题】:Write text on an image在图像上写文字
【发布时间】:2013-08-27 04:12:31
【问题描述】:

我正在开发一个图像编辑器,其中我使用鼠标事件和Graphics.DrawLine()Graphics.DrawRectangle()Graphics.DrawEllipse() 实现了矩形、线条和椭圆绘图功能。

我正在搜索在图像上写文本但找不到任何解决方案,所以我的意思是,每当在任何位置单击图像时,光标都会改变(比如在文本框中写文本),我可以开始在该位置输入。

Graphics.DrawString 方法类似于我正在寻找的方法,但它不支持动态类型

【问题讨论】:

  • “不支持动态”是什么意思????
  • 附注:请避免在帖子正文中使用“感谢信”和标题中的标签。已编辑,欢迎在meta 讨论
  • 我的意思是我必须在图像顶部写入,但该方法只接受一个字符串,但我必须在顶部图像上动态写入(如在记事本中)。 (我将再次避免那些感谢,...我在 c# 中非常新手)。

标签: c# .net


【解决方案1】:

Alex Fr 在他的DrawTools article 中提供了一套出色的绘图工具,这些工具是Draw Tool Redux 的基础。

我还使用来自http://www.codeproject.com/Articles/4390/AlphaBlendTextBox-A-transparent-translucent-textbo的透明文本框

要将文本框控件添加到绘图工具中,您需要创建一个类 ToolText 和 DrawText。

在 ToolText 类中,我显示了一个没有边框的表单“TextDialog”,其中包含文本框:

internal class ToolText : ToolObject
{
public ToolText()
{
    Cursor = new Cursor(GetType(), "Rectangle.cur");
}
public override void OnMouseDown(DrawArea drawArea, MouseEventArgs e)
{
    Point p = drawArea.BackTrackMouse(new Point(e.X, e.Y));
TextDialog td = new TextDialog();
td.Location = new Point(e.X, e.Y + drawArea.Top + td.Height);
    if (td.ShowDialog() ==
    DialogResult.OK)
    {
    string t = td.TheText;
    Color c = td.TheColor;
    Font f = td.TheFont;
    AddNewObject(drawArea, new DrawText(p.X, p.Y, t, f, c));
    }
}

以 DrawRectangle 为基础的 DrawText 类具有几个属性、文本、字体等,并用于绘图实现:

public override void Draw(Graphics g)
{
    Pen pen = new Pen(Color);
    GraphicsPath gp = new GraphicsPath();
    StringFormat format = StringFormat.GenericDefault;
    gp.AddString(_theText, _font.FontFamily, (int)_font.Style, _font.SizeInPoints,
                    new PointF(Rectangle.X, Rectangle.Y), format);
    // Rotate the path about it's center if necessary
    if (Rotation != 0)
    {
        RectangleF pathBounds = gp.GetBounds();
        Matrix m = new Matrix();
        m.RotateAt(Rotation, new PointF(pathBounds.Left + (pathBounds.Width / 2), pathBounds.Top + (pathBounds.Height / 2)),
                    MatrixOrder.Append);
        gp.Transform(m);
    }
    g.DrawPath(pen, gp);
    rectangle.Size = g.MeasureString(_theText, _font).ToSize();
    pen.Dispose();
}

【讨论】:

  • 谢谢。我下载并注意到绘图工具也使用文本对话框来获取用户文本。我可能会采用这种方法,shell 很快就会尝试一下。感谢回复
  • 谢谢大家,我用这个想法创建了一个新表单并询问用户输入,我监控了第一个表单上的点击位置,并在该位置从第二个表单插入了文本。现在最好,直到我们没有更好的选择:)
【解决方案2】:

这是一个非常高级的功能,它不能作为 .NET Framework 的一部分使用。您必须使用鼠标事件处理程序和DrawString() 方法来实现该功能。例如,当用户单击图像时,您可以尝试在图像上创建一个具有透明背景的文本框(不确定透明部分是否容易/可能)并让用户输入文本。不过,这不会为您提供任何格式化功能。

对于完整的所见即所得编辑,您必须寻找执行此操作的现有组件或从头开始编写代码。

编辑: 看看这个类似的问题:

transparent richTextBox

TextBox with a Transparent Background

根据这些,TextBox 控件不支持透明度。

【讨论】:

  • 我实际上已经在寻找这个解决方案(transpaernt textbox),但它似乎也不被支持并且它未能透明。但后来我发现你上面发布的解决方案我认为只支持我的工具箱中没有的用户控件。 stackoverflow.com/questions/5557365/… 。感谢回复
猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 2012-07-04
  • 2020-12-06
  • 1970-01-01
  • 2015-11-21
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多