Alex Fr はDrawTools の記事で優れた描画ツールのセットを提供しており、これらのツールはDraw Tool Reduxの基礎として機能します。
また、http: //www.codeproject.com/Articles/4390/AlphaBlendTextBox-A-transparent-translucent-textboの透明テキスト ボックスも使用します。
Textbox コントロールを Drawing Tools に追加するには、クラス 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 クラスは、Text、Font などのいくつかのプロパティを使用して、DrawRectangle から派生し、描画実装用に作成されます。
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();
}