5

かなりの時間を費やした後、この関数を検索します。

誰かが私にそうするための最良の方法を教えてくれたらいいのにと思いました。ウィンドウフォームコントロール(ラベル/ボタン)のサイズに基づいてフォントサイズを動的に調整できる機能はありますか?

これは私がオンラインで調査した後に持っているものですが、残念ながら、これらのコードは、コントロールのサイズが変更される実行時に多くの例外を与えます。

public void textAdjustment()
    {
        try
        {
            while (this.label.Width < System.Windows.Forms.TextRenderer.MeasureText(this.label.Text,
               new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Width)
            {
                this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size - 1.0f, this.label.Font.Style);
            }
            if (this.label.Width > System.Windows.Forms.TextRenderer.MeasureText(this.label.Text, new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Width)
            {
                this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size + 0.1f, this.tableLabel.Font.Style);
            }
            if (this.label.Height < System.Windows.Forms.TextRenderer.MeasureText(this.label.Text, new Font(this.label.Font.FontFamily, this.label.Font.Size, this.label.Font.Style)).Height)
            {
                this.label.Font = new Font(this.label.Font.FontFamily, this.label.Font.Size - 0.6f, this.label.Font.Style);
            }
        }
        catch (Exception e)
        {
            this.label.Font = Control.DefaultFont;
        }
    }

私はこれに取り組む方法が正しいとは思いませんが、実行時にコントロールサイズを増減しても、フォントサイズベースを調整する方法を知っている人はいますか?個人的には、この投稿は他の人にも参考になるとても良い投稿になると思います。

4

1 に答える 1

4

これは非常に厄介な種類のコードであり、フォントの適切なサイズはコントロールのサイズとあまり相関していません。また、一般的なことではありません。UIは、どのウィンドウサイズでも読みやすく、一貫している必要があります。それ以外の場合、どのような種類の例外が表示されているかは非常に不明確です。明らかな間違いは、ラベルのAutoSizeプロパティをオフにするのを忘れて、ラベルの高さを十分に高くしないことです。遊ぶためのいくつかのコードは、ラベルにのみ適していることに注意してください。このコードを貼り付ける前に、フォームに1つドロップしてください。

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        label1.AutoSize = false;
        label1.Size = new Size(100, 60);
        label1.Text = "Autosize this";
        label1.Anchor = AnchorStyles.Left | AnchorStyles.Right;
        label1.Resize += new EventHandler(label1_Resize);
    }

    void label1_Resize(object sender, EventArgs e) {
        using (var gr = label1.CreateGraphics()) {
            Font font = label1.Font;
            for (int size = (int)(label1.Height * 72 / gr.DpiY); size >= 8; --size) {
                font = new Font(label1.Font.FontFamily, size, label1.Font.Style);
                if (TextRenderer.MeasureText(label1.Text, font).Width <= label1.ClientSize.Width) break;
            }
            label1.Font = font;
        }
    }

    protected override void OnLoad(EventArgs e) {
        label1_Resize(this, EventArgs.Empty);
        base.OnLoad(e);
    }
}

改善が必要です。MeasureText()メソッドは、Labelコントロールが使用するTextFormatFlagsを使用する必要があります。しかし、これは投稿されたとおりに十分に機能しました。

于 2012-07-31T06:45:06.863 に答える