我正在开发一个图像编辑器,其中我使用鼠标事件和使用Graphics.DrawLine()
,Graphics.DrawRectangle()
和实现了矩形、线条和椭圆绘图功能Graphics.DrawEllipse()
。
我正在寻找在图像上写文本但找不到任何解决方案,所以我的意思是每当在任何位置单击图像时,光标都会改变(比如在文本框中写文本),我可以开始在该位置输入。
Graphics.DrawString方法类似于我正在寻找的方法,但它不支持动态类型
我正在开发一个图像编辑器,其中我使用鼠标事件和使用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));
}
}
以 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();
}
这是一个非常高级的功能,它不能作为 .NET Framework 的一部分使用。您必须使用鼠标事件处理程序和DrawString()
方法来实现该功能。例如,当用户单击图像时,您可以尝试在图像上创建一个具有透明背景的文本框(不确定透明部分是否容易/可能)并让用户输入文本。但是,这不会为您提供任何格式化功能。
对于完整的所见即所得编辑,您必须寻找执行此操作的现有组件或从头开始编写代码。
编辑:看看这个类似的问题:
根据这些,TextBox
控件不支持透明度。