我有一系列显示文件名的按钮。如果我在文件名宽度大于可用像素数时设置Text属性,则文本“换行”,而如果显示的文本是LeftMiddle,则显示为LeftTop。因此,我只显示尽可能多的字符(使用PathCompactPathEx()方法)。
然而 - 我怎么知道有多少像素可用?我目前的做法是:
button.Width - button.Image.Width - button.Padding.Horizontal
这并不总是有效,有时文字仍然包装。
有关确定文本可用像素数的正确方法的任何线索是什么?
答案 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宽度
希望这有帮助