ウィンドゥサイズに合わせてコントロールをリサイズする方法
// -----------------------------------------------------------------
/// <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);
}
// -----------
}
// ------------
}
// -----------------------------------------------------------------
}
// -----------------------------------------------------------------

コメント