绘制形状用户控件的文本

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

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

enter image description here


你永远不会涂上文本。当你重写 OnPaint 方法时,你需要负责绘制所有内容。 - theB
我该如何在上面绘制文本? - DeaDViruS
@DeaDViruS 除了Alexei的好答案之外,我也发布了我的答案作为一个选项。如果您能看一下并发现它有用,我会很高兴。 - Reza Aghaei
2个回答

4

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

添加代码以呈现文本(例如,在绘制多边形后使用TextRenderer.DrawText):

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

2

创建一个形状控件的另一个想法是通过设置其区域来进行形状设计。

我按照以下规格创建了此控件:

  • 继承自Button(我看到你将其命名为StartButton,所以我实现了从Button继承,如果你只想拥有Text,可以从标签中继承)
  • 具有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);
        }
    }
}

截图:

在此输入图片描述


这是一张关于IT技术的截图,展示了一个网页。

谢谢,这也可以运行:),正是我之前想要做的。 - DeaDViruS
1
这并不是很难,也许需要一些数学知识,我认为我能做到。 - Reza Aghaei
如果可能的话,也请画一个圆,因为我尝试过了,但是得到了一个奇怪的形状。 - DeaDViruS
@DeaDViruS 不难,画圆需要使用“Graphics”的“DrawEllipse”方法,而对于星形图案,您需要像之前一样使用“FillPolygon”,但星形图案有点棘手。 - Reza Aghaei
让我们在聊天中继续这个讨论 - DeaDViruS
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接