質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C#

    7138questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    1838questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

無効のチェックボックスの文字色だけを変更したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 535

aruheno

score 26

お世話になっております。

今回の質問は、上記の通りです。
System.Windows.Formsのチェックボックスです。
Appearanceをbuttonにしているため、ボタンのような外観をしています。

  • 変更したい理由
    アプリケーションを作るにあたって、状態に応じてコントロールを無効にすることがあると思います。
    しかし、コントロールを無効にすると、設定しているForeColor・BackColorに対応した色が表示され、変更することができません。
    この時の文字色が存外イケてなく(背景色はいいのですが)、無効の時は文字色だけを白色にしたいと思っています。
    いろいろ探しましたが、方法が見つからなかったので質問させていただきました。

  • 試したこと

  1. System.Drawing.SystemColors.Controlでシステム色に変えた
    システム色内にイケてるものがありませんでした。
  2. 新しいプロパティを作成した
    コードは以下の通りです。
bool enable = true;

[Browsable(true)]
[Description("コントロールの有効/無効を切り替えます。")]
[Category("動作")]
public bool Enabled2
{            
   get
   {                
      return enable;
   }
   set
   {
      enable = value;
      if(enable)
      {
         //チェックボックスの文字色を元に戻す
         this.AutoCheck = true;                    
      }
      else
      {
         //チェックボックスの文字色を白にする                    
         this.AutoCheck = false;                  
      }
   }
}        


この方法が一番良さそうでしたが、マウスオーバー時にボタンが凹むモーションを止めることができなかったので断念しました。

  • 最後に
    よろしければ、無効状態のチェックボックスの文字色だけ変更する方法、もしくはマウスオーバー時にボタンが凹むモーションを止める方法を教えてください。
    他に良い方法があれば、それも募集しています。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2018/05/28 15:04 編集

    チェックボックス (CheckBox) というのは .NET には Windows Forms, WPF, ASP.NET Web Forms のいずれにもあるのですが? 質問の中身を読めばわかるとは言わないでくださいね。質問者さんが質問の一行目に書けばすぐわかる(=回答者・閲覧者の時間の節約になる)ことなのですから。

    キャンセル

  • aruheno

    2018/05/28 15:07

    すみません。チェックボックスにそれだけの種類があると知りませんでした。調べたらWindowsFormでした。

    キャンセル

回答 2

checkベストアンサー

+2

提示されている課題の解決案を3つ提示できますが、どれもあんまりおすすめできません。他の回答があればそちらをお勧めしたいところです。コード断片の提示が難しいので Github にサンプルを上げました。
https://github.com/atata0319/teratail128353
拡張チェックボックスのクラスが以下の1~3に対応しています。案1以外は Windows API の知識が必要とされるため、.NET Framework の知識だけでは対応が難しいかもしれません。

 1.独自に描画する方法

Appearance が Button の CheckBox を独自に描画するには .NET Framework のクラスライブラリでは機能不足になります。解説がめんどくさいのでサンプルを見てください。
https://github.com/atata0319/teratail128353/blob/master/ExtendedCheckBox/ExtendedCheckBox1.cs

 2.WM_PAINT を処理しない方法

WM_PAINT を処理しないことにより DWM が直前に描画した内容を再現することで実現します。Windows 7 以前の DWM を無効にできる環境では動作しません。
https://github.com/atata0319/teratail128353/blob/master/ExtendedCheckBox/ExtendedCheckBox2.cs

 3.WM_ENABLE を処理しない方法

WM_ENABLE を処理しないことにより、無効状態での描画を阻止することができます。この仕様である期間が長いですが、今後もこの動作である保証はありません。
https://github.com/atata0319/teratail128353/blob/master/ExtendedCheckBox/ExtendedCheckBox3.cs


追記
案1の問題点は以下のようにコントロールと完全に同じ位置に描画するのが結構難しいことにあります。
案1の問題点.png

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/04 14:17

    ありがとうございます。1番目の方法で試しましたが、とても良い感じでした。
    これは他のWindowsFormコントロール(ボタンやテキスト、DateTimePicker等)にも使えそうな気がしますが、どうでしょうか?

    キャンセル

  • 2018/06/04 19:37

    回答に問題点を追記しました。この問題点がそれほど致命的でなければ、他のコントロールもある程度は描画可能になります。ただし、TextBoxRenderer や ButtonRenderer はありますが、DateTimePickerRenderer ってのは見たことないので、描画方法自体が良くわからないことになりそうです。

    キャンセル

  • 2018/06/05 10:51

    ありがとうございます。試しましたが、確かにDateTimePickerはなかったですね。
    こっちは別の方法を探したほうがよさそうです。

    キャンセル

+1

CheckBoxの文字部分を空にして、Labelを横にはってTextとして表示するという形式ではどうでしょうか?
イメージはこんな感じ↓

CheckBox Label
何らかのText

これならCheckBoxを止めてもLabelは生き続けますので設定が簡単です。

public class ColorfulCheckBox
{
public CheckBox CheckBox {get;set;}
public Label Label {get;set;}

// コンストラクタや色を変えるための関数等々も実装 (略)
// EnableもここならわざわざEnable2と宣言する必要はない
}


のようにまとめて管理できるクラスを実装し、あとはLabelのForeColorの項目にColor型のお好みの色を代入できる関数を実装し、CheckBoxのEnableと紐づけすれば上手くいくと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/29 09:28

    申し訳ありません。
    質問に載せ忘れていましたが、チェックボックスのプロパティは
    Appearance = Buttonにしているため、チェックは表示されません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7138questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    1838questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。