Download presentation
Presentation is loading. Please wait.
1
控制項定位與自動縮放 建國科技大學 資管系 饒瑞佶
2
Windows Form控制項排版問題 控制視窗最大化 邊界控制視窗任意大小 如果調整視窗大小 控制項沒跟著變化
3
如何解決? 透過控制項的Anchor屬性
4
Anchor屬性 這樣表示控制項的左邊與上方距離視窗的距離要維持固定 如果改成下面這個設定呢?
5
多個物件時 如果只設定Anchor,物件並不會依據視窗大小自動等比例縮放 但物件間的相對位置沒有改變
先設定視窗的Minimum size屬性,以免視窗太小,物件擠成一堆
6
可以維持相對關係同時端點自動縮放 Left Top right Top right Top right Left Top Top left
7
Dock 簡易分成五種停駐方式 Anchor與Dock只能擇一使用
8
調整Dock物件順序 檢視其他視窗文件大綱 直接拖拉調整 針對Dock在同一區的物件調整順序
9
靠程式解決控制項自動縮放問題 建立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; // 原始字體大小 }
10
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); }
11
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))); }
12
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); }
13
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); }
14
表單中使用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();
15
如果是動態產生物件 也可以自動縮放,但是每個物件一定需要設定name屬性 public Form3() {
InitializeComponent(); _form_resize = new clsResize(this); //this.Load += _Load; this.Resize += _Resize; } 新動態物件加入後再呼叫 _form_resize._get_initial_size();
Similar presentations