無効のチェックボックスの文字色だけを変更したい
- 評価
- クリップ 1
- VIEW 5,327

退会済みユーザー
お世話になっております。
今回の質問は、上記の通りです。
System.Windows.Formsのチェックボックスです。
Appearanceをbuttonにしているため、ボタンのような外観をしています。
変更したい理由
アプリケーションを作るにあたって、状態に応じてコントロールを無効にすることがあると思います。
しかし、コントロールを無効にすると、設定しているForeColor・BackColorに対応した色が表示され、変更することができません。
この時の文字色が存外イケてなく(背景色はいいのですが)、無効の時は文字色だけを白色にしたいと思っています。
いろいろ探しましたが、方法が見つからなかったので質問させていただきました。試したこと
- System.Drawing.SystemColors.Controlでシステム色に変えた
システム色内にイケてるものがありませんでした。 - 新しいプロパティを作成した
コードは以下の通りです。
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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
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と紐づけすれば上手くいくと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
SurferOnWww
2018/05/28 15:04 編集
チェックボックス (CheckBox) というのは .NET には Windows Forms, WPF, ASP.NET Web Forms のいずれにもあるのですが? 質問の中身を読めばわかるとは言わないでくださいね。質問者さんが質問の一行目に書けばすぐわかる(=回答者・閲覧者の時間の節約になる)ことなのですから。
退会済みユーザー
2018/05/28 15:07
すみません。チェックボックスにそれだけの種類があると知りませんでした。調べたらWindowsFormでした。