对齐按钮内的中间文本字符串

时间:2018-01-26 15:01:13

标签: c# winforms user-controls

我正在为一个小项目做一些自定义控制。我创建了一个像这样的TP1CustomFlatButton:

Image for TP1CustomFlatButton

如果我在TP1CustomFlatButton的底部添加带有文字的标签,对我来说很容易。我不想处理该标签的事件,因此我使用事件onPaint来绘制文本。我跟着微软的turtorial,我得到了自定义平面按钮,就像我附上的图片一样。我想要的是使文本对齐中心位于TP1CustomFlatButton的底部。

这是我的TP1CustomFlatButton代码:

// constructor
public TP1CustomFlatButton()
{
    this.FlatStyle = FlatStyle.Flat;
    this.FlatAppearance.BorderSize = 0;
    this.BackColor = Color.MediumSeaGreen;
    this.ForeColor = Color.White;
    this.Text = "TP1CustomButton";
}

protected override void OnPaint(PaintEventArgs pevent)
{
    pevent.Graphics.FillRectangle(new SolidBrush(this.BackColor), new Rectangle(0, 0, this.Width, this.Height));
    TextFormatFlags flags = TextFormatFlags.Bottom;

    //render text
    TextRenderer.DrawText(pevent.Graphics, this.Text, this.Font, new Point((int)(this.Width - Text.Length)/2,this.Height), this.ForeColor, flags);

    //draw image
    Image img = this.BackgroundImage;

    //create rectangle to display image
    Rectangle imgRec = new Rectangle(this.Width - 32 /3, this.Height - 32/ 3, 32, 32);
    if(img!=null)
        pevent.Graphics.DrawImage(img, imgRec);
} 

我真的对坐标X和Y感到困惑。正如你所看到的那样,我试图将“SETTINGS”文本字符串对齐TP1CustomFlatButton底部的中心。我花了5个小时来阅读有关Windows窗体中控件的坐标和位置的更多信息。但是现在我真的很累。

希望有人可以为我的自定义控件提供任何建议或解决方案。

2 个答案:

答案 0 :(得分:1)

您需要使用MeasureString()方法来计算中间值。
还可以看到我为了找到中间所做的更改(在drawPoint字段中计算)。

根据您的代码查看我的示例:

public TP1CustomFlatButton()
{
    this.FlatStyle = FlatStyle.Flat;
    this.FlatAppearance.BorderSize = 0;
    this.BackColor = Color.MediumSeaGreen;
    this.ForeColor = Color.White;
    this.Text = "middle";
}

protected override void OnPaint(PaintEventArgs pevent)
{
    pevent.Graphics.FillRectangle(new SolidBrush(this.BackColor), new Rectangle(0, 0, this.Width, this.Height));
    TextFormatFlags flags = TextFormatFlags.Bottom;

    //render text
    String drawString = this.Text;
    SizeF size = pevent.Graphics.MeasureString(drawString, this.Font);
    Point drawPoint = new Point((int)this.Size.Width / 2 - (int)size.Width / 2,this.Height);
    TextRenderer.DrawText(pevent.Graphics, this.Text, this.Font, drawPoint, this.ForeColor, flags);

    //draw image
    Image img = this.BackgroundImage;

    //create rectangle to display image
    Rectangle imgRec = new Rectangle(this.Width - 32 / 3, this.Height - 32 / 3, 32, 32);

    if (img != null)
        pevent.Graphics.DrawImage(img, imgRec);

}

<强>输出:
enter image description here

答案 1 :(得分:0)

尝试按以下方式更改TextFormatFlags:

TextFormatFlags flags = TextFormatFlags.Bottom | TextFormatFlags.VerticalCenter;

另外,请查看此link