在图像上书写文字

本文关键字:文字 书写 图像 | 更新日期: 2023-09-27 18:28:54

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

我一直在搜索在图像上写文本,但找不到任何解决方案,所以我的意思是,每当在任何位置点击图像时,光标都会改变(就像在文本框中写文本一样),我可以开始在那个位置打字。

Graphics.DrawString方法与我想要的方法类似,但它不支持动态键入

在图像上书写文字

Alex Fr在他的DrawTools文章中提供了一套出色的绘图工具,这些工具是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));
    }
}

DrawText类以DrawRectangle为基础,具有两个属性,Text、Font等,用于绘图实现:

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();
}

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

对于完整的所见即所得编辑,您必须寻找一个能够做到这一点的现有组件,或者从头开始编写代码。

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

透明richTextBox

具有透明背景的文本框

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