読者です 読者をやめる 読者になる 読者になる

C#の継承を試すために、モニタチェッカーをバージョンアップ。

メインフォーム

namespace Color_Bar
{
    public partial class Form2 : Form
    {
        private ColorDrowerIterator FDrower;
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.WindowState = FormWindowState.Maximized;
            FDrower = new ColorDrowerIterator(this);
        }

        private void Form2_MouseClick(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case System.Windows.Forms.MouseButtons.Left:
                    FDrower.next(this);
                    break;
                case System.Windows.Forms.MouseButtons.Right:
                    FDrower.prev(this);
                    break;
            }
        }

        private void Form2_KeyUp(object sender, KeyEventArgs e)
        {
            // anyキー入力で終了
            Application.Exit();
        }
    }
}


描画処理クラスのイテレータ
(以下、デフォルト以外のusingのみ表示)

using System.Windows.Forms;
using Color_Bar.DrowPattern;

namespace Color_Bar
{
    class ColorDrowerIterator
    {
        private List<IDrowPattern> FDrowerList;
        private int Findex = 0;

        public ColorDrowerIterator(Form aForm = null)
        {
            FDrowerList = new List<IDrowPattern>();
            FDrowerList.Add(new Color_Bar.DrowPattern.DrowSolidGreen());
            FDrowerList.Add(new Color_Bar.DrowPattern.DrowSolidRed());
            FDrowerList.Add(new Color_Bar.DrowPattern.DrowSolidBlue());
            FDrowerList.Add(new Color_Bar.DrowPattern.DrowSolidWhite());
            FDrowerList.Add(new Color_Bar.DrowPattern.DrowSolidBlack());
            FDrowerList.Add(new Color_Bar.DrowPattern.DrowSolid50Gray());
            FDrowerList.Add(new Color_Bar.DrowPattern.DrowSolid20Gray());
            FDrowerList.Add(new Color_Bar.DrowPattern.DrowSolid80Gray());
            FDrowerList.Add(new Color_Bar.DrowPattern.DrowImageMonoStripe());

            this.first(aForm);
        }

        /// <summary>
        /// インデックスを先頭に移動して、IDrowPatternを返す。
        /// aFormが指定されていたら、返す前にaFormを引数にしてIDrowPatternを呼び出す。
        /// </summary>
        /// <param name="aForm">描画対象のフォーム</param>
        /// <returns>リスト先頭のIDrowPattern</returns>
        public IDrowPattern first(Form aForm = null)
        {
            Findex = 0;
            return this.CallCurrentInterface(aForm);
        }

        /// <summary>
        /// インデックスを末尾に移動して、IDrowPatternを返す。
        /// aFormが指定されていたら、返す前にaFormを引数にしてIDrowPatternを呼び出す。
        /// </summary>
        /// <param name="aForm">描画対象のフォーム</param>
        /// <returns>リスト末尾のIDrowPattern</returns>
        public IDrowPattern last(Form aForm = null)
        {
            Findex = FDrowerList.Count - 1;
            return this.CallCurrentInterface(aForm);
        }

        /// <summary>
        /// インデックスを次のアイテムに移動して、IDrowPatternを返す。リスト末尾に達したら先頭に戻る。
        /// aFormが指定されていたら、返す前にaFormを引数にしてIDrowPatternを呼び出す。
        /// </summary>
        /// <param name="aForm">描画対象のフォーム</param>
        /// <returns>リストの次のIDrowPattern</returns>
        public IDrowPattern next(Form aForm = null)
        {
            Findex++;
            if (Findex < FDrowerList.Count) {
                return this.CallCurrentInterface(aForm);
            } else {
                return this.first(aForm);
            }
        }

        /// <summary>
        /// インデックスを前のアイテムに移動して、IDrowPatternを返す。リスト先頭に達したら末尾に移動。
        /// aFormが指定されていたら、返す前にaFormを引数にしてIDrowPatternを呼び出す。
        /// </summary>
        /// <param name="aForm">描画対象のフォーム</param>
        /// <returns>リストの次のIDrowPattern</returns>
        public IDrowPattern prev(Form aForm = null)
        {
            Findex--;
            if (Findex < 0) {
                return this.last(aForm);
            } else {
                return this.CallCurrentInterface(aForm);
            }
        }

        /// <summary>
        /// 現在のインデックスが示すIDrowPatternに対してaFormを引数に呼び出す。
        /// aFormがnullなら、なにもせず現在のインデックスが示すIDrowPatternを返す。
        /// </summary>
        /// <param name="aForm">IDrowPattern</param>
        private IDrowPattern CallCurrentInterface(Form aForm = null)
        {
            IDrowPattern tmpDP = value;

            if (aForm == null) {
                return tmpDP;    
            }

            tmpDP.DrawPattern(aForm);
            return tmpDP;
        }

        /// <summary>
        /// インデックスが示すIDrowPatternを取得。
        /// </summary>
        public IDrowPattern value
        {
            get
            {
                return FDrowerList[Findex];
            }
        }
    }
}

描画インターフェイス

using System.Windows.Forms;

namespace Color_Bar.DrowPattern
{
    interface IDrowPattern
    {
        void DrawPattern(Form aForm);
    }
}

ソリッドパターンの実装

using System.Windows.Forms;
using System.Drawing;

namespace Color_Bar.DrowPattern
{
    abstract class DrawSolidBase : IDrowPattern
    {
        /// <summary>
        /// フォームの背景色を指定したカラーコードに設定
        /// </summary>
        /// <param name="aForm"></param>
        public void DrawPattern(Form aForm)
        {
            // 背景イメージが設定されているとBackColorが見えないので、背景を削除する
            aForm.BackgroundImage = null;
            aForm.BackColor = Color.FromArgb(0xFF, Color.FromArgb(this.getColorCode()));
        }

        abstract protected Int32 getColorCode();
    }
    
    class DrowSolidRed : DrawSolidBase
    {
        protected override Int32 getColorCode()
        {
            return 0xFF0000;
        }
    }

    class DrowSolidGreen : DrawSolidBase
    {
        protected override Int32 getColorCode()
        {
            return 0x00FF00;
        }
    }

    class DrowSolidBlue : DrawSolidBase
    {
        protected override Int32 getColorCode()
        {
            return 0x0000FF;
        }
    }

    class DrowSolidWhite : DrawSolidBase
    {
        protected override Int32 getColorCode()
        {
            return 0xFFFFFF;
        }
    }

    class DrowSolidBlack : DrawSolidBase
    {
        protected override Int32 getColorCode()
        {
            return 0x000000;
        }
    }

    class DrowSolid50Gray : DrawSolidBase
    {
        protected override Int32 getColorCode()
        {
            return 0x808080;
        }
    }

    class DrowSolid20Gray : DrawSolidBase
    {
        protected override Int32 getColorCode()
        {
            return 0x333333;
        }
    }

    class DrowSolid80Gray : DrawSolidBase
    {
        protected override Int32 getColorCode()
        {
            return 0xCCCCCC;
        }
    }
}


自由描画パターンの実装

using System.Windows.Forms;
using System.Drawing;

namespace Color_Bar.DrowPattern
{
    abstract class DrawImageBase : IDrowPattern
    {
        /// <summary>
        /// ビットマップを生成して図形をドローしたあと、フォームの背景に設定
        /// </summary>
        /// <param name="aForm"></param>
        public void DrawPattern(Form aForm)
        {
            Bitmap img = new Bitmap(aForm.Width, aForm.Height);
            this.doDrowImage(aForm, img);
            aForm.BackgroundImage = img;
        }

        abstract protected void doDrowImage(Form aForm, Bitmap aimg);
    }

    class DrowImageMonoStripe : DrawImageBase
    {
        /// <summary>
        /// 1ドット幅の白黒ストライプを描画
        /// </summary>
        /// <param name="aForm"></param>
        /// <param name="aimg"></param>
        protected override void doDrowImage(Form aForm, Bitmap aimg)
        {
            Graphics g = Graphics.FromImage(aimg);

            g.FillRectangle(Brushes.White, g.VisibleClipBounds);

            for(int x = 1; x < aForm.Width; x += 2) {
                g.DrawLine(Pens.Black, x, 0, x, aForm.Height);
            }
        }
    }
}

後は(本当の)カラーバーでもモノクロバーでも好きに実装してくださいという感じ。