1. 程式人生 > >C#視窗控制元件大小隨視窗大小而改變

C#視窗控制元件大小隨視窗大小而改變

自己寫了個類,可以實現視窗大小發生改變時,視窗內的控制元件大小也隨之改變(等比例),

不過呼叫要有點小技巧,後面再說,類的程式碼如

    /// <summary>
    /// 視窗控制元件大小變化隨視窗等比變化
    /// </summary>
    public class MyResize
    { /// <summary>
      /// 記錄改變前視窗的大小
      /// </summary>
        Size originalSize;
        /// <summary>
        /// 記錄改變前視窗的大小
        /// </summary>
        public Size OriginalSize { get => originalSize; set => originalSize = value; }
        /// <summary>
        /// 在水平方向上的比例
        /// </summary>
        float Xratio = 1;
        /// <summary>
        /// 在垂直方向上的比例
        /// </summary>
        float Yratio = 1;

        /// <summary>
        /// MyResize類例項化
        /// </summary>
        public MyResize(Form f)
        {
            OriginalSize = f.Size;
        }
        private MyResize()
        {
            ///不允許無參構造
        }
        /// <summary>
        /// 根據視窗大小,自動調整控制元件大小,不支援容器的子控制元件!
        /// </summary>
        /// <param name="f1">要調整的視窗</param>
        /// <returns></returns>
        public void Resize(Form f1)
        {
            Xratio = (float)f1.Size.Width / (float)originalSize.Width;
            Yratio = (float)f1.Size.Height / (float)originalSize.Height;
            foreach (Control a in f1.Controls)
            {
                a.Size = new Size((int)(a.Size.Width * Xratio), (int)(a.Size.Height * Yratio));
                a.Location = new Point((int)(a.Location.X * Xratio), (int)(a.Location.Y * Yratio));
            }
            originalSize = f1.Size;
        }
呼叫的話,宣告應該要宣告全域性的,但例項化要在函式內,一般可以在建構函式中,也可以在視窗的Load事件中都行,但宣告的時候不能直接例項化(當然,如果你能在方法外使用this關鍵字的話可能就可以),下面是一個呼叫的例子:


TP:為了方便使用,我將它弄成了類庫(雖然只是有個類 — . —)。