C# WinForm表單 控制項隨視窗大小變化而比例改變 [自動透過程式碼調整UI元件大小&起始位置(定位點)&字型大小]

C# WinForm表單 控制項隨視窗大小變化而比例改變 [自動透過程式碼調整UI元件大小&起始位置(定位點)&字型大小]

C# WinForm表單 控制項隨視窗大小變化而比例改變 [自動透過程式碼調整UI元件大小&起始位置(定位點)&字型大小]


資料來源:
https://dotblogs.com.tw/davidtalk/2018/06/03/182559
https://www.itread01.com/content/1547625088.html


Code

namespace CS_test
{
    //VS2022 修改軟體版本的方法:
        //專案 屬性 -> 套件 -> 一般 -> 套件版本
    public partial class main : Form
    {
        //---
        //C# WinForm 控制項隨視窗大小變化而比例改變_start00
        // ~ https://dotblogs.com.tw/davidtalk/2018/06/03/182559
        // ~ https://www.itread01.com/content/1547625088.html
        //---C# WinForm 控制項隨視窗大小變化而比例改變_end00

        //---
        //C# WinForm 控制項隨視窗大小變化而比例改變_start01
        private float m_X;//當前窗體的寬度
        private float m_Y;//當前窗體的高度
        private bool m_isLoaded;  // 是否已設定各控制的尺寸資料到Tag屬性
        //---C# WinForm 控制項隨視窗大小變化而比例改變_end01

        //---
        //C# WinForm 控制項隨視窗大小變化而比例改變_start02
        //將控制項的寬,高,左邊距,頂邊距和字體大小暫存到tag屬性中
        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);
            }
        }
        //---C# WinForm 控制項隨視窗大小變化而比例改變_end02

        //---
        //C# WinForm 控制項隨視窗大小變化而比例改變_start03
        //根據窗體大小調整控制項大小
        private void SetControls(float newx, float newy, Control cons)
        {
            if (m_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);
                    }
                }
            }
        }
        //---C# WinForm 控制項隨視窗大小變化而比例改變_end03

        public main()
        {
            InitializeComponent();
            //---
            //C# WinForm 控制項隨視窗大小變化而比例改變_start05
            m_isLoaded = false;//
            //---C# WinForm 控制項隨視窗大小變化而比例改變_end05
        }

        private void main_Load(object sender, EventArgs e)
        {
            //---
            //C# WinForm 控制項隨視窗大小變化而比例改變_start04
            m_X = this.Width;//獲取窗體的寬度
            m_Y = this.Height;//獲取窗體的高度
            m_isLoaded = true;// 已設定各控制項的尺寸到Tag屬性中
            SetTag(this);//調用方法
            //---C# WinForm 控制項隨視窗大小變化而比例改變_end04
        }

        private void main_Shown(object sender, EventArgs e)//第一次顯示表單
        {
            //---
            //C# WinForm 控制項隨視窗大小變化而比例改變_start06
            this.WindowState = FormWindowState.Maximized;
            //---C# WinForm 控制項隨視窗大小變化而比例改變_end06
        }

        private void main_SizeChanged(object sender, EventArgs e)
        {
            //---
            //C# WinForm 控制項隨視窗大小變化而比例改變_start07
            if (m_isLoaded)
            {
                float newx = (this.Width) / m_X;
                float newy = (this.Height) / m_Y;
                SetControls(newx, newy, this);
            }
            //---C# WinForm 控制項隨視窗大小變化而比例改變_end07
        }
    }
}

One thought on “C# WinForm表單 控制項隨視窗大小變化而比例改變 [自動透過程式碼調整UI元件大小&起始位置(定位點)&字型大小]

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *