Как сделать текст метки масштабируемым в приложении Winforms
Я ищу способ сделать текст в масштабе метки, способный поместиться во весь родительский контейнер. Единственный способ, который я могу придумать,-получить размер контейнера при изменении размера окна, а затем соответственно увеличить или уменьшить размер шрифта, но это ограничит его возможности.
интересно, есть ли лучший способ сделать это, что может работать больше как свойство привязки в приложении Winforms.
2 ответов
Я знал, что ответ скрыт где-то в графическом объекте и событии paint, играя с этими 2 ключевыми словами, решил мою проблему. Вот решение, которое сработало в моем конкретном случае.
Я просто изменяю размер шрифта на событии paint для моей метки следующим образом:
private void myLabel_Paint(object sender, PaintEventArgs e)
{
float fontSize = NewFontSize(e.Graphics, parentContainer.Bounds.Size, myLabel.Font, myLabel.Text);
Font f = new Font("Arial", fontSize, FontStyle.Bold);
myLabel.Font = f;
}
где как функция NewFontSize выглядит так:
public static float NewFontSize(Graphics graphics, Size size, Font font, string str)
{
SizeF stringSize = graphics.MeasureString(str, font);
float wRatio = size.Width / stringSize.Width;
float hRatio = size.Height / stringSize.Height;
float ratio = Math.Min(hRatio, wRatio);
return font.Size * ratio;
}
Я также нашел эту статью полезный http://www.switchonthecode.com/tutorials/csharp-tutorial-font-scaling
Это немного расширяет принятый ответ и работает для меня:
сначала я определил свое "золотое сечение", настроив обычную метку в дизайнере с размером шрифта, который хорошо выглядит с меткой.Свойство Height установлено на 100. Здесь я получил шрифт emSize 48.0 F.
затем в переопределении OnPaint, если отношение 100.0 / 48.0 изменения тогда просто один раз отрегулируйте шрифт и сохраните новое соотношение (таким образом, нам не нужно делать новый шрифт каждый раз, когда элемент управления рисует).
он отлично работает, чтобы просто положить его в Панель инструментов, когда вы закончите вместе с обычной меткой.
public partial class LabelWithFontScaling : Label
{
public LabelWithFontScaling()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.SuspendLayout();
this.Name = "label1";
this.Size = new System.Drawing.Size(250, 100);
this.ResumeLayout(false);
}
float mRatio = 1.0F;
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
float ratio = e.ClipRectangle.Height / 100.0F;
if ((ratio > 0.1) && (ratio != mRatio))
{
mRatio = ratio;
base.Font = new Font(Font.FontFamily, 48.0F * ratio, Font.Style);
}
}