形状用户控件的绘图文本

Drawing Text of shaped user control

class starbutton : UserControl
{
    [Bindable(true)]
    [EditorBrowsable(EditorBrowsableState.Always)]
    [Browsable(false)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public override string Text { get { return base.Text; } set { base.Text = value; this.Invalidate(); } }

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics graphics = e.Graphics;
        SolidBrush brush2 = new SolidBrush(Color.Green);
        Point[] points =
        { 
            new Point(ClientSize.Width / 2, 0), 
            new Point(0, ClientSize.Height/4), 
            new Point(0, ClientSize.Height), 
            new Point(ClientSize.Width, ClientSize.Height)
        };
        graphics.FillPolygon(brush2, points);
        base.OnPaint(e);
    }
}

我创建了一个自定义用户控件来制作一个使用形状的按钮。我设法做到了,但我添加了一个 属性 以便它可以在形状上显示文本,但它没有显示文本。为什么不显示文字?

您在 OnPaint 实现中只绘制了奇怪的多边形,没有渲染任何文本。

添加渲染文本的代码(即在绘制多边形后使用 TextRenderer.DrawText

TextRenderer.DrawText(e.Graphics, Text , this.Font, 
    new Point(10, 10), SystemColors.ControlText);

创建形状控件的另一个想法是塑造它的区域。

我按照以下规范创建了这个控件:

  • Inherited from Button(我看到你命名为StartButton,所以我实现它继承自Button,如果你只想拥有[=14=,你可以继承label ])
  • Text 自动呈现其他内容
  • 具有 TextAlign 属性 因此其文本可以像其他控件文本一样按照标准对齐方式绘制。
  • 绿色多边形之外的区域不再属于控件,点击该区域不受控件处理。
  • 绿色多边形之外的区域非常透明,后面的一切都会被看到。
  • 有关区域的设计时间行为与 运行 时间相同。

代码:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace MyUserControls
{
    public class StartButton : Button
    {
        public StartButton()
        {
            this.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
            this.FlatAppearance.BorderSize = 0;
            this.BackColor = System.Drawing.Color.Green;
            this.TextAlign = System.Drawing.ContentAlignment.BottomLeft; 
            this.Size = new Size(100, 100); 
        }
        protected override void OnPaint(PaintEventArgs pevent)
        {
            this.UpdateRegion();
            base.OnPaint(pevent);
        }
        protected void UpdateRegion()
        {
            var path = new GraphicsPath();
            Point[] points =
            { 
                new Point(ClientSize.Width / 2, 0), 
                new Point(0, ClientSize.Height/4), 
                new Point(0, ClientSize.Height), 
                new Point(ClientSize.Width, ClientSize.Height)
            };
            path.AddPolygon(points);
            this.Region = new Region(path);
        }
    }
}

截图: