當改變視窗大小時,其中控制項依比例縮放。
當程序在不同解析度設備上使用時,可避免控制項超出視窗顯示畫面外造成操作上困難。
2019.1.22 如果視窗是子視窗時,會發生調用時指定視窗的母視窗時會觸發視窗的Resize事件,造成尚未SetTag(設定控制項尺寸)就要使用,而產生異常。故增加設定是否執行SetTag程序後才可Resize控制項的判斷。
5 步驟:
- 定義全局變數
private float X;//當前窗體的寬度 private float Y;//當前窗體的高度 bool isLoaded; // 是否已設定各控制的尺寸資料到Tag屬性
- 功能函數SetTag
將控制項的寬,高,左邊距,頂邊距和字體大小暫存到tag屬性中/// <summary> /// 將控制項的寬,高,左邊距,頂邊距和字體大小暫存到tag屬性中 /// </summary> /// <param name="cons">遞歸控制項中的控制項</param> private void SetTag(Control cons) { foreach (Control con in cons.Controls) { con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size; if (con.Controls.Count > 0) SetTag(con); } }
- 功能函數SetControls
根據窗體大小調整控制項大小private void SetControls(float newx, float newy, Control cons) { if (isLoaded) { //遍歷窗體中的控制項,重新設置控制項的值 foreach (Control con in cons.Controls) { string[] mytag = con.Tag.ToString().Split(new char[] { ':' });//獲取控制項的Tag屬性值,並分割後存儲字元串數組 float a = System.Convert.ToSingle(mytag[0]) * newx;//根據窗體縮放比例確定控制項的值,寬度 con.Width = (int)a;//寬度 a = System.Convert.ToSingle(mytag[1]) * newy;//高度 con.Height = (int)(a); a = System.Convert.ToSingle(mytag[2]) * newx;//左邊距離 con.Left = (int)(a); a = System.Convert.ToSingle(mytag[3]) * newy;//上邊緣距離 con.Top = (int)(a); Single currentSize = System.Convert.ToSingle(mytag[4]) * newy;//字體大小 con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit); if (con.Controls.Count > 0) { SetControls(newx, newy, con); } } } }
- 在窗體的Load事件中添加
private void FrmF3D_Load(object sender, EventArgs e) { X = this.Width;//獲取窗體的寬度 Y = this.Height;//獲取窗體的高度 isLoaded = true;// 已設定各控制項的尺寸到Tag屬性中 SetTag(this);//調用方法 }
- 構建函式中設定控制尚未載入
public FrmF3D() { InitializeComponent(); isLoaded = false; }
- 視窗顯示時設定為最大
private void FrmF3D_Shown(object sender, EventArgs e) { this.WindowState = FormWindowState.Maximized; }
20180802: 如果要在頁面開啟後設定為最大,可以在 Form.Shown 事件中設定,不要在頁面屬性中設定為最大,要等所有控制項載入後再設定。
this.WindowState = FormWindowState.Maximized;