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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Visual Studio

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

Q&A

解決済

2回答

3704閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Visual Studio

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

0グッド

1クリップ

投稿2018/05/28 05:46

編集2018/05/29 00:30

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

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

  • 変更したい理由

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

  • 試したこと
  1. System.Drawing.SystemColors.Controlでシステム色に変えた

システム色内にイケてるものがありませんでした。
0. 新しいプロパティを作成した
コードは以下の通りです。

C#

1bool enable = true; 2 3[Browsable(true)] 4[Description("コントロールの有効/無効を切り替えます。")] 5[Category("動作")] 6public bool Enabled2 7{ 8 get 9 { 10 return enable; 11 } 12 set 13 { 14 enable = value; 15 if(enable) 16 { 17 //チェックボックスの文字色を元に戻す 18 this.AutoCheck = true; 19 } 20 else 21 { 22 //チェックボックスの文字色を白にする 23 this.AutoCheck = false; 24 } 25 } 26}

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

  • 最後に

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/28 06:04 編集

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

退会済みユーザー

2018/05/28 06:07

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

回答2

0

ベストアンサー

提示されている課題の解決案を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/03 16:14

編集2018/06/04 10:35
atata0319

総合スコア881

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/04 05:17

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

2018/06/04 10:37

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

退会済みユーザー

2018/06/05 01:51

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

0

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

CheckBoxLabel
何らかのText

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

C#

1public class ColorfulCheckBox 2{ 3public CheckBox CheckBox {get;set;} 4public Label Label {get;set;} 5 6// コンストラクタや色を変えるための関数等々も実装 (略) 7// EnableもここならわざわざEnable2と宣言する必要はない 8}

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

投稿2018/05/28 13:52

編集2018/05/28 14:00
capra314cabra

総合スコア222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/29 00:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問