C# WinForm 控制項隨視窗大小變化而比例改變

  • 19768
  • 0
  • C#
  • 2019-01-22

當改變視窗大小時,其中控制項依比例縮放。

當程序在不同解析度設備上使用時,可避免控制項超出視窗顯示畫面外造成操作上困難。

2019.1.22 如果視窗是子視窗時,會發生調用時指定視窗的母視窗時會觸發視窗的Resize事件,造成尚未SetTag(設定控制項尺寸)就要使用,而產生異常。故增加設定是否執行SetTag程序後才可Resize控制項的判斷。

5 步驟:

  1. 定義全局變數
    private float X;//當前窗體的寬度
    private float Y;//當前窗體的高度
    bool isLoaded;  // 是否已設定各控制的尺寸資料到Tag屬性

     

  2. 功能函數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);
        }
    }

     

  3. 功能函數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);
    			}
    		}
    	}
    }

     

  4. 在窗體的Load事件中添加
    private void FrmF3D_Load(object sender, EventArgs e)
    {
    	X = this.Width;//獲取窗體的寬度
    	Y = this.Height;//獲取窗體的高度
    	isLoaded = true;// 已設定各控制項的尺寸到Tag屬性中
    	SetTag(this);//調用方法
    }

     

  5. 構建函式中設定控制尚未載入
    public FrmF3D()
    {
    	InitializeComponent();
    	isLoaded = false;
    }

     

  6. 視窗顯示時設定為最大
    private void FrmF3D_Shown(object sender, EventArgs e)
    {
    	this.WindowState = FormWindowState.Maximized;
    }

     

20180802: 如果要在頁面開啟後設定為最大,可以在 Form.Shown 事件中設定,不要在頁面屬性中設定為最大,要等所有控制項載入後再設定。

this.WindowState = FormWindowState.Maximized;