1

TableLayoutPanel を使用して、フォームのサイズが変更されたときに自動的にサイズを変更したいコントロールを含めています。フォーム自体のサイズが変更されたときに、フォームの子コントロールのサイズをフォームに比例して「スケーリング」する方法を知りたいですか? TableLayoutPanel は含まれているコントロールのサイズを自動的に調整しますが、これらのコントロールは同じフォント サイズを維持します。

4

2 に答える 2

6

これは、私がこれまでに思いついた最良の方法です。2 つの倍率を使用し、すべてのコントロールを繰り返し処理して、スケーリングするものを選択的に選択します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestTableLayoutPanel
{
    public partial class Form2 : Form
    {
        private const float LARGER_FONT_FACTOR = 1.5f;
        private const float SMALLER_FONT_FACTOR = 0.8f;

        private int _lastFormSize;

        public Form2()
        {
            InitializeComponent();

            this.Resize += new EventHandler(Form2_Resize);
            _lastFormSize = GetFormArea(this.Size);
        }

        private int GetFormArea(Size size)
        {
            return size.Height * size.Width;
        }

        private void Form2_Resize(object sender, EventArgs e)
        {

            var bigger = GetFormArea(this.Size) > _lastFormSize;
            float scaleFactor = bigger ? LARGER_FONT_FACTOR : SMALLER_FONT_FACTOR;

            ResizeFont(this.Controls, scaleFactor);

            _lastFormSize = GetFormArea(this.Size);

        }

        private void ResizeFont(Control.ControlCollection coll, float scaleFactor)
        {
            foreach (Control c in coll)
            {
                if (c.HasChildren)
                {
                    ResizeFont(c.Controls, scaleFactor);
                }
                else
                {
                    //if (c.GetType().ToString() == "System.Windows.Form.Label")
                    if (true)
                    {
                        // scale font
                        c.Font = new Font(c.Font.FontFamily.Name, c.Font.Size * scaleFactor);
                    }
                }
            }
        }
    }
}
于 2013-01-14T23:36:19.110 に答える