ウィンドゥサイズに合わせてコントロールをリサイズする方法

// -----------------------------------------------------------------
/// <summary>
/// フォームのリサイズクラス。
/// </summary>
public class CFormResizer
{
    // -----------------------------------------------------------------
    // フィールド

    /// <summary>
    /// 
    /// </summary>
    protected Form form = null;
    
    private Size base_form_size; // フォームの初期サイズ

    private Dictionary<string, Rectangle> control_rect_hash
        
        = new Dictionary<string, Rectangle>(); // 各コントロールの初期位置とサイズ


    // -----------------------------------------------------------------
    // プロパティ

    // -----------------------------------------------------------------

    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="form_"></param>
    public CFormResizer(Form form_)
    {

        form = form_;
        
        // ------------

        form_.Resize += form_Resize;

        // ------------
        // 初期サイズを記録

        base_form_size = form_.ClientSize;

        // ------------
        // 各コントロールの表示矩形を記録する。

        Queue<Control> queue = new System.Collections.Generic.Queue<Control>();

        // -----------

        queue.Enqueue(form);

        // -----------

        while (queue.Count > 0)
        {
            // -----------

            Control cur_control = queue.Dequeue();

            // -----------

            control_rect_hash.Add(cur_control.Name,cur_control.Bounds);

            // -----------

            foreach (Control cur_child in cur_control.Controls)
            {
                queue.Enqueue(cur_child);
            }

            // -----------
        }

        // ------------
    }

    // -----------------------------------------------------------------
    /// <summary>
    /// Form Resize
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void form_Resize(object sender, EventArgs e)
    {

        // ------------

        if (base_form_size.Width == 0 || base_form_size.Height == 0)
        {
            return; // 初期サイズが設定されていない場合は処理しない
        }

        // ------------

        float width_ratio  = (float) form.ClientSize.Width  / base_form_size.Width;
        float height_ratio = (float) form.ClientSize.Height / base_form_size.Height;

        // ------------
        // 各コントロールをリサイズする。

        Queue<Control> queue = new System.Collections.Generic.Queue<Control>();

        // -----------

        foreach (Control cur_child in form.Controls)
        {
            queue.Enqueue(cur_child);
        }

        // -----------

        while (queue.Count > 0)
        {

            // -----------

            Control cur_control = queue.Dequeue();

            // -----------

            Rectangle base_rect = control_rect_hash[cur_control.Name];

            // -----------

            int new_x      = (int)(base_rect.Left * width_ratio);
            int new_y      = (int)(base_rect.Top * height_ratio);
            int new_width  = (int)(base_rect.Width * width_ratio);
            int new_height = (int)(base_rect.Height * height_ratio);

            // -----------

            cur_control.SetBounds(new_x, new_y, new_width, new_height);

            // -----------

            foreach (Control cur_child in cur_control.Controls)
            {
                queue.Enqueue(cur_child);
            }

            // -----------
        }

        // ------------
    }

    // -----------------------------------------------------------------
}

// -----------------------------------------------------------------

いいなと思ったら応援しよう!

コメント

ログイン または 会員登録 するとコメントできます。
ウィンドゥサイズに合わせてコントロールをリサイズする方法|古井和雄
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1