如何确定System.Windows.Forms.Button中可用于文本的像素

时间:2009-06-29 16:46:49

标签: .net winforms button

我有一系列显示文件名的按钮。如果我在文件名宽度大于可用像素数时设置Text属性,则文本“换行”,而如果显示的文本是LeftMiddle,则显示为LeftTop。因此,我只显示尽可能多的字符(使用PathCompactPathEx()方法)。

然而 - 我怎么知道有多少像素可用?我目前的做法是:

button.Width - button.Image.Width - button.Padding.Horizontal

这并不总是有效,有时文字仍然包装。

有关确定文本可用像素数的正确方法的任何线索是什么?

3 个答案:

答案 0 :(得分:2)

您可以使用Graphics.MeasureString来确定使用特定字体的特定文本片段所使用的实际像素数。
还有Graphics.MeasureCharacterRanges,我认为它可能更准确的文本对齐,但我个人没有使用它。

答案 1 :(得分:2)

您可以获得的最佳方法是订阅Paint事件(或制作Button后代并覆盖OnPaint),并按以下方式绘制字符串:

private void OnPaint(object sender, PaintEventArgs)
{
    Button SenderButton = (Button)sender;
    Rectangle TextRect = SenderButton.ClientRectangle;
    TextRect.Inflate(-10, -5); // You can use any rectangle you want
    // To avoid internal Button text drawing, assign "" to Button.Text, and use Tag instead
    string Text = (string)SenderButton.Tag;
    e.Graphics.DrawText(e.Graphics, Text, SenderButton.Font, TextRect, SenderButton.ForeColor,
        TextFormatFlags.PathEllipsis | TextFormatFlags.NoPrefix);
}

这是唯一可以保证您再也没有换行的方法。任何宽度测量(包括MeasureString)可能与内部按钮绘制处理不同,因此您将进行包装。

答案 2 :(得分:0)

也许你可以使用monospaced字体作为Courier,如果你确定每个字符的像素宽度,那么你只需要注意不要超过你的TextBox宽度

希望这有帮助