C#でコントロールの拡大縮小を一括変更

まず、拡大縮小の責務を持つインターフェースを定義します。


namespace UserClass
{
    public interface IControlResizable
    {
        int pWidth { get; set; }
        int pHeight { get; set; }
        float pFontSize { get; set; }
        int pTop { get; set; }
        int pLeft { get; set; }
        int OrgHeight { get; set; }
        int OrgWidth { get; set; }
        float OrgFontsize { get; set; }
        int OrgTop { get; set; }
        int OrgLeft { get; set; }
        float TuneRatio { get; set; }

        // 拡大縮小の比率の元となる原寸大を設定する
        void InitSize();

        // このメソッドで拡大縮小する。ratioは、比率のチューニング用で、通常は1.0のままでOK
        void ChangeViewRatio(int ratio);
    }
}

次に、上のインターフェースをコントロールに継承させます。

まずは、Buttonコントロール


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using 波佐見弁利v2.UserClass;

namespace UserClass
{
    public class MyButtonKnowsOrgSize : Button, IControlResizable
    {
        private ControlResizableAdapter adapt_ = null;
        public MyButtonKnowsOrgSize() : base()
        {
            //フォーカスをとらない
            this.SetStyle(ControlStyles.Selectable, false);

            // ControlResizableAdapterアダプタークラスに、拡大縮小機能を委譲する(任せる)
            this.adapt_ = new ControlResizableAdapter(this);
        }

        public void ChangeViewRatio(int ratio)
        {
            // 拡大縮小メソッドを、ControlResizableAdapterアダプタークラスに委譲する(任せる)
            this.adapt_.ChangeViewRatio(ratio);
        }
        public void InitSize()
        {
            // 初期化メソッドを、ControlResizableAdapterアダプタークラスに委譲する(任せる)
            this.adapt_.InitSize();
        }

        public float TuneRatio
        {
            get
            {
                return this.adapt_.tuneratio;
            }
            set
            {
                this.adapt_.tuneratio = value;
            }
        }

        public int OrgHeight { get; set; }
        public int OrgWidth { get; set; }
        public float OrgFontsize { get; set; }
        public int OrgTop { get; set; }
        public int OrgLeft { get; set; }
        public int pHeight
        {
            get
            {
                return this.Height;
            }
            set
            {
                this.Height = value;
            }
        }
        public int pWidth
        {
            get
            {
                return this.Width;
            }
            set
            {
                this.Width = value;
            }
        }
        public float pFontSize
        {
            get
            {
                return this.Font.Size;
            }
            set
            {
                this.Font = new System.Drawing.Font("MS UI Gothic", value, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
            }
        }
        public int pTop
        {
            get
            {
                return this.Top;
            }
            set
            {
                this.Top = value;
            }
        }
        public int pLeft
        {
            get
            {
                return this.Left;
            }
            set
            {
                this.Left = value;
            }
        }
    }
}

次の例として、チェックボックス


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using 波佐見弁利v2.UserClass;

namespace UserClass
{
    public class MyCheckBoxKnowsOrgSize : CheckBox, IControlResizable
    {
        private ControlResizableAdapter adapt_ = null;
        public MyCheckBoxKnowsOrgSize() : base()
        {
            //フォーカスをとらない
            this.SetStyle(ControlStyles.Selectable, false);

            // ControlResizableAdapterアダプタークラスに委譲する(任せる)
            this.adapt_ = new ControlResizableAdapter(this);
        }

        public void ChangeViewRatio(int ratio)
        {
            // 拡大縮小を、ControlResizableAdapterアダプタークラスに委譲する(任せる)
            this.adapt_.ChangeViewRatio(ratio);
        }
        public void InitSize()
        {
            // 初期化を、ControlResizableAdapterアダプタークラスに委譲する(任せる)
            this.adapt_.InitSize();
        }

        public float TuneRatio
        {
            get
            {
                return this.adapt_.tuneratio;
            }
            set
            {
                this.adapt_.tuneratio = value;
            }
        }

        public int OrgHeight { get; set; }
        public int OrgWidth { get; set; }
        public float OrgFontsize { get; set; }
        public int OrgTop { get; set; }
        public int OrgLeft { get; set; }
        public int pHeight
        {
            get
            {
                return this.Height;
            }
            set
            {
                this.Height = value;
            }
        }
        public int pWidth
        {
            get
            {
                return this.Width;
            }
            set
            {
                this.Width = value;
            }
        }
        public float pFontSize
        {
            get
            {
                return this.Font.Size;
            }
            set
            {
                this.Font = new System.Drawing.Font("MS UI Gothic", value, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
            }
        }
        public int pTop
        {
            get
            {
                return this.Top;
            }
            set
            {
                this.Top = value;
            }
        }
        public int pLeft
        {
            get
            {
                return this.Left;
            }
            set
            {
                this.Left = value;
            }
        }
    }
}

なお、IControlResizableのメソッドは、各コントロールで共通の処理なので、ControlResizableAdapterアダプタクラスに委譲しています。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using メールのみ.UserClass;

namespace UserClass
{
    public class ControlResizableAdapter
    {
        private IControlResizable ctl_ = null;
        public float tuneratio = 1.0F;

        // IControlResizableというインターフェースとして受け取る
        public ControlResizableAdapter(IControlResizable ctl)
        {
            this.ctl_ = ctl;
        }

        public void InitSize()
        {
            // IControlResizableのもつプロパティを利用する
            this.ctl_.OrgWidth = this.ctl_.pWidth;
            this.ctl_.OrgHeight = this.ctl_.pHeight;
            this.ctl_.OrgFontsize = this.ctl_.pFontSize;
            this.ctl_.OrgTop = this.ctl_.pTop;
            this.ctl_.OrgLeft = this.ctl_.pLeft;
        }
        public void ChangeViewRatio(int ratio)  //ratio: 50-200
        {
            // IControlResizableのもつプロパティを利用する
            this.ctl_.pHeight = (int)((this.ctl_.OrgHeight * ratio / 100) * this.tuneratio);
            this.ctl_.pWidth = (int)((this.ctl_.OrgWidth * ratio / 100) * this.tuneratio);
            this.ctl_.pFontSize = (float)((this.ctl_.OrgFontsize * ratio / 100) * this.tuneratio);
            this.ctl_.pTop = (int)((this.ctl_.OrgTop * ratio / 100) * this.tuneratio);
            this.ctl_.pLeft = (int)((this.ctl_.OrgLeft * ratio / 100) * this.tuneratio);
        }
    }
}

では、main側ではどうやって実行するかといいますと、以下のように、this.ControlsコレクションにLINQの拡張メソッドOfType()を使って、IControlResizableインターフェースを継承したコントロールを全て抜き出して、各個拡大縮小を実行しています。


            // LINQのOfTypeメソッドで、CotrolsコレクションからIControlResizableインターフェースを持つコントロールだけ抜き出す。
            foreach (IControlResizable ctl in this.Controls.OfType())
            {
                //各IControlResizableをインターフェースを持つコントロールを拡大縮小する
                ctl.ChangeViewRatio(ratio);
            }