控制項定位與自動縮放 建國科技大學 資管系 饒瑞佶
Windows Form控制項排版問題 控制視窗最大化 邊界控制視窗任意大小 如果調整視窗大小 控制項沒跟著變化
如何解決? 透過控制項的Anchor屬性
Anchor屬性 這樣表示控制項的左邊與上方距離視窗的距離要維持固定 如果改成下面這個設定呢?
多個物件時 如果只設定Anchor,物件並不會依據視窗大小自動等比例縮放 但物件間的相對位置沒有改變 先設定視窗的Minimum size屬性,以免視窗太小,物件擠成一堆
可以維持相對關係同時端點自動縮放 Left Top right Top right Top right Left Top Top left
Dock 簡易分成五種停駐方式 Anchor與Dock只能擇一使用
調整Dock物件順序 檢視其他視窗文件大綱 直接拖拉調整 針對Dock在同一區的物件調整順序
靠程式解決控制項自動縮放問題 建立clsResize 類別 public class clsResize { List<System.Drawing.Rectangle> _arr_control_storage = new List<System.Drawing.Rectangle>(); private bool showRowHeader = false; public clsResize(Form _form_) form = _form_; // 要進行縮放的form _formSize = _form_.ClientSize; // form的原始大小 _fontsize = _form_.Font.Size; // 原始字體大小 }
private float _fontsize { get; set; } private System.Drawing.SizeF _formSize {get;set; } private Form form { get; set; } public void _get_initial_size() //取得原始物件大小// { var _controls = _get_all_controls(form); foreach (Control control in _controls) // 輪詢所有物件 _arr_control_storage.Add(control.Bounds); // 儲存物件大小 // 如果有使用datagridview if (control.GetType() == typeof(DataGridView)) _dgv_Column_Adjust(((DataGridView)control), showRowHeader); }
public void _resize() //Set the resize { double _form_ratio_width = (double)form.ClientSize.Width /(double)_formSize.Width; double _form_ratio_height = (double)form.ClientSize.Height / (double)_formSize.Height; var _controls = _get_all_controls(form); int _pos = -1; foreach (Control control in _controls) // 進行縮放比例計算 _pos += 1;//increment by 1; System.Drawing.Size _controlSize = new System.Drawing.Size((int)(_arr_control_storage[_pos].Width * _form_ratio_width), (int)(_arr_control_storage[_pos].Height * _form_ratio_height)); //大小比例 System.Drawing.Point _controlposition = new System.Drawing.Point((int) (_arr_control_storage[_pos].X * _form_ratio_width),(int) (_arr_control_storage[_pos].Y * _form_ratio_height));//位置計算 // 設定邊界 control.Bounds = new System.Drawing.Rectangle(_controlposition, _controlSize); // datagridview專用 if (control.GetType() == typeof(DataGridView)) _dgv_Column_Adjust(((DataGridView)control), showRowHeader); //字體大小 control.Font = new System.Drawing.Font(form.Font.FontFamily, (float)(((Convert.ToDouble(_fontsize) * _form_ratio_width) / 2) + ((Convert.ToDouble(_fontsize) * _form_ratio_height) / 2))); }
private void _dgv_Column_Adjust(DataGridView dgv, bool _showRowHeader) // Datagridview 用 { int intRowHeader = 0; const int Hscrollbarwidth = 5; if (_showRowHeader) intRowHeader = dgv.RowHeadersWidth; else dgv.RowHeadersVisible = false; for (int i = 0; i < dgv.ColumnCount; i++) if (dgv.Dock == DockStyle.Fill) //in case the datagridview is docked dgv.Columns[i].Width = ((dgv.Width - intRowHeader) / dgv.ColumnCount); dgv.Columns[i].Width = ((dgv.Width - intRowHeader - Hscrollbarwidth) / dgv.ColumnCount); }
private static IEnumerable<Control> _get_all_controls(Control c) { return c.Controls.Cast<Control>().SelectMany(item => _get_all_controls(item)).Concat(c.Controls.Cast<Control>()).Where(control => control.Name != string.Empty); }
表單中使用clsResize類別 clsResize _form_resize; public Form1() { InitializeComponent(); _form_resize = new clsResize(this); this.Load += _Load; this.Resize += _Resize; } private void _Resize(object sender, EventArgs e) _form_resize._resize(); private void _Load(object sender, EventArgs e) _form_resize._get_initial_size();
如果是動態產生物件 也可以自動縮放,但是每個物件一定需要設定name屬性 public Form3() { InitializeComponent(); _form_resize = new clsResize(this); //this.Load += _Load; this.Resize += _Resize; } 新動態物件加入後再呼叫 _form_resize._get_initial_size();