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); } } } }
後は(本当の)カラーバーでもモノクロバーでも好きに実装してくださいという感じ。