【C#】メニューにハイコントラストテーマを適用する方法

C#
この記事は約20分で読めます。

Windows Form アプリケーションのメニューバーやツールバーにハイコントラストテーマを適用する方法です。.NET6.0 を対象にしています。

適用イメージ

ハイコントラストテーマは黒、白、オレンジ、水色のみの配色になります。

ハイコントラストテーマ

ハイコントラストカラーテーブル

VS Code のハイコントラスト風カラーテーブルです。

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

namespace Test {
    public class HighContrastColorTable : ProfessionalColorTable {

        public HighContrastColorTable() {
            this.UseSystemColors = false;
        }

        // ボタンがオンの場合に使用するグラデーションの開始色を取得します。
        public override Color ButtonCheckedGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ボタンがオンの場合に使用するグラデーションの終了色を取得します。
        public override Color ButtonCheckedGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ボタンがオンの場合に使用するグラデーションの中間色を取得します。
        public override Color ButtonCheckedGradientMiddle { get { return Color.FromArgb(0, 0, 0); } }
        // ボタンがオンの場合に使用する純色を取得します。
        public override Color ButtonCheckedHighlight { get { return Color.FromArgb(0, 0, 0); } }
        // ButtonCheckedHighlight で使用する境界線の色を取得します。
        public override Color ButtonCheckedHighlightBorder { get { return Color.FromArgb(0, 0, 0); } }
        // ButtonPressedGradientBegin、 ButtonPressedGradientMiddle、および ButtonPressedGradientEnd の各色で使用する境界線の色を取得します。
        public override Color ButtonPressedBorder { get { return Color.FromArgb(0, 0, 0); } }
        // ボタンが押されている場合に使用するグラデーションの開始色を取得します。
        public override Color ButtonPressedGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ボタンが押されている場合に使用するグラデーションの終了色を取得します。
        public override Color ButtonPressedGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ボタンが押されている場合に使用するグラデーションの中間色を取得します。
        public override Color ButtonPressedGradientMiddle { get { return Color.FromArgb(0, 0, 0); } }
        // ボタンが押されている場合に使用する純色を取得します。
        public override Color ButtonPressedHighlight { get { return Color.FromArgb(0, 0, 0); } }
        // ButtonPressedHighlight で使用する境界線の色を取得します。
        public override Color ButtonPressedHighlightBorder { get { return Color.FromArgb(0, 0, 0); } }
        // ButtonSelectedGradientBegin、 ButtonSelectedGradientMiddle、および ButtonSelectedGradientEnd の各色で使用する境界線の色を取得します。
        public override Color ButtonSelectedBorder { get { return Color.FromArgb(243, 133, 24); } }
        // ボタンがオンの場合に使用するグラデーションの開始色を取得します。
        public override Color ButtonSelectedGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ボタンがオンの場合に使用するグラデーションの終了色を取得します。
        public override Color ButtonSelectedGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ボタンがオンの場合に使用するグラデーションの中間色を取得します。
        public override Color ButtonSelectedGradientMiddle { get { return Color.FromArgb(0, 0, 0); } }
        // ボタンがオンの場合に使用する純色を取得します。
        public override Color ButtonSelectedHighlight { get { return Color.FromArgb(0, 0, 0); } }
        // ButtonSelectedHighlight で使用する境界線の色を取得します。
        public override Color ButtonSelectedHighlightBorder { get { return Color.FromArgb(0, 0, 0); } }
        // チェック ボタンがオンで、グラデーションが使用される場合に使用する純色を取得します。
        public override Color CheckBackground { get { return Color.FromArgb(111, 195, 223); } }
        // チェック ボタンがオンで、グラデーションが使用されるときに使用する純色を取得します。
        public override Color CheckPressedBackground { get { return Color.FromArgb(111, 195, 223); } }
        // チェック ボタンがオンで、グラデーションが使用される場合に使用する純色を取得します。
        public override Color CheckSelectedBackground { get { return Color.FromArgb(111, 195, 223); } }
        // グリップ (移動ハンドル) のシャドウ効果に使用する色を取得します。
        public override Color GripDark { get { return Color.FromArgb(0, 0, 0); } }
        // グリップ (移動ハンドル) の強調表示効果に使用する色を取得します。
        public override Color GripLight { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripDropDownMenu のイメージのマージンで使用するグラデーションの開始色を取得します。
        public override Color ImageMarginGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripDropDownMenu のイメージのマージンで使用するグラデーションの終了色を取得します。
        public override Color ImageMarginGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripDropDownMenu のイメージのマージンで使用するグラデーションの中間色を取得します。
        public override Color ImageMarginGradientMiddle { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripDropDownMenu に項目が表示される場合にイメージのマージンで使用するグラデーションの開始色を取得します。
        public override Color ImageMarginRevealedGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripDropDownMenu に項目が表示される場合にイメージのマージンで使用するグラデーションの終了色を取得します。
        public override Color ImageMarginRevealedGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripDropDownMenu で項目が表示される場合にイメージのマージンで使用するグラデーションの中間色を取得します。
        public override Color ImageMarginRevealedGradientMiddle { get { return Color.FromArgb(0, 0, 0); } }
        // MenuStrip の境界線の色を取得します。
        public override Color MenuBorder { get { return Color.FromArgb(111, 195, 223); } }
        // ToolStripMenuItem で使用する境界線の色を取得します。
        public override Color MenuItemBorder { get { return Color.FromArgb(111, 195, 223); } }
        // 最上位の ToolStripMenuItem が押されている場合に使用するグラデーションの開始色を取得します。
        public override Color MenuItemPressedGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // 最上位の ToolStripMenuItem が押されている場合に使用するグラデーションの終了色を取得します。
        public override Color MenuItemPressedGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // 最上位の ToolStripMenuItem が押されている場合に使用するグラデーションの中間色を取得します。
        public override Color MenuItemPressedGradientMiddle { get { return Color.FromArgb(0, 0, 0); } }
        // 最上位の ToolStripMenuItem 以外の ToolStripMenuItem が選択され場合に使用する純色を取得します。
        public override Color MenuItemSelected { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripMenuItem が選択された場合に使用するグラデーションの開始色を取得します。
        public override Color MenuItemSelectedGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripMenuItem が選択された場合に使用するグラデーションの終了色を取得します。
        public override Color MenuItemSelectedGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // MenuStrip で使用するグラデーションの開始色を取得します。
        public override Color MenuStripGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // MenuStrip で使用するグラデーションの終了色を取得します。
        public override Color MenuStripGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripOverflowButton で使用するグラデーションの開始色を取得します。
        public override Color OverflowButtonGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripOverflowButton で使用するグラデーションの終了色を取得します。
        public override Color OverflowButtonGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripOverflowButton で使用するグラデーションの中間色を取得します。
        public override Color OverflowButtonGradientMiddle { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripContainer で使用するグラデーションの開始色を取得します。
        public override Color RaftingContainerGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripContainer で使用するグラデーションの終了色を取得します。
        public override Color RaftingContainerGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripSeparator のシャドウ効果に使用する色を取得します。
        public override Color SeparatorDark { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripSeparator の強調表示効果に使用する色を取得します。
        public override Color SeparatorLight { get { return Color.FromArgb(0, 0, 0); } }
        // StatusStrip の上端に使用する境界線の色を取得します。
        public override Color StatusStripBorder { get { return Color.FromArgb(0, 0, 0); } }
        // StatusStrip で使用するグラデーションの開始色を取得します。
        public override Color StatusStripGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // StatusStrip で使用するグラデーションの終了色を取得します。
        public override Color StatusStripGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStrip の下端に使用する境界線の色を取得します。
        public override Color ToolStripBorder { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripContentPanel で使用するグラデーションの開始色を取得します。
        public override Color ToolStripContentPanelGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripContentPanel で使用するグラデーションの終了色を取得します。
        public override Color ToolStripContentPanelGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripDropDown の純色の背景色を取得します。
        public override Color ToolStripDropDownBackground { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStrip の背景で使用するグラデーションの開始色を取得します。
        public override Color ToolStripGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStrip の背景で使用するグラデーションの終了色を取得します。
        public override Color ToolStripGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStrip の背景で使用するグラデーションの中間色を取得します。
        public override Color ToolStripGradientMiddle { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripPanel で使用するグラデーションの開始色を取得します。
        public override Color ToolStripPanelGradientBegin { get { return Color.FromArgb(0, 0, 0); } }
        // ToolStripPanel で使用するグラデーションの終了色を取得します。
        public override Color ToolStripPanelGradientEnd { get { return Color.FromArgb(0, 0, 0); } }
    }
}

カラーテーブル以外での描画

カラーテーブルだけでは制御できない箇所を独自に描画します。具体的には下記処理になります。

  • メニューの文字列を白色で描画します。
  • 各ボタンの矢印を白色で描画します。
using System.Drawing;
using System.Windows.Forms;

namespace Test {
    /// <summary>
    /// ハイコントラスト風テーマ
    /// </summary>
    public class HighContrastRenderer : ToolStripProfessionalRenderer {

        private Color foreColor;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public HighContrastRenderer()
            : this(null) {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="colorTable"></param>
        public HighContrastRenderer(ProfessionalColorTable colorTable)
            : this(SystemColors.ControlText, colorTable) {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="foreColor"></param>
        /// <param name="colorTable"></param>
        public HighContrastRenderer(Color foreColor, ProfessionalColorTable colorTable)
            : base(colorTable) {
            this.foreColor = foreColor;
        }

        /// <summary>
        /// OnRenderMenuItemBackground
        /// </summary>
        /// <param name="e"></param>
        protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) {
            e.Item.ForeColor = this.foreColor;
            base.OnRenderMenuItemBackground(e);
        }

        /// <summary>
        /// OnRenderArrow(矢印描画)
        /// </summary>
        /// <param name="e"></param>
        protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e) {
            if (e.Item.Enabled) {
                e.ArrowColor = Color.White;
            }
            base.OnRenderArrow(e);
        }
    }
}

適用する方法

メニューバー、ツールバー、ステータスバーのすべてに適用されます。適用する Strip の RenderMode は ToolStripRenderMode.ManagerRenderMode にする必要があります。

ToolStripProfessionalRenderer renderer = new HighContrastRenderer(Color.White, new HighContrastColorTable());
renderer.RoundedEdges = false;
ToolStripManager.Renderer = renderer;
ToolStripManager.VisualStylesEnabled = true;

おわりに

ハイコントラストテーマ以外にダークモードテーマも作成しています。

コメント

タイトルとURLをコピーしました