質問するログイン新規登録

回答編集履歴

1

MFCでの動作確認。改修案を追記。

2021/02/23 06:20

投稿

dodox86
dodox86

スコア9427

answer CHANGED
@@ -1,3 +1,35 @@
1
+ **追記しました:**
2
+
3
+ こちらが直接の回答です。改めてVisual Studio 2012/MFCで確認しました。
4
+
5
+ チェックボックスのチェックをON/OFFしたとき、チェックマークの変更によりチェックボックス自体は自ら再描画しますが、ダイアログボックスの方はそうではない為に再描画が行われず、その為に背景色が変わらないのが原因です。ですのでチェックボックスのイベントハンドラーでブラシを切り替えるとき、ダイアログボックスの描画領域を`Invalidate()`で無効化することで再描画されるようになります。
6
+
7
+ `CObjColorChangeDlg::OnBnClickedCheck1()`を以下のように修正して試してみてください。チェック状態に変化があればダイアログボックスの描画領域全体を[CWnd::Invalidate](https://docs.microsoft.com/ja-jp/cpp/mfc/reference/cwnd-class?view=msvc-160#invalidate)で無効化し、再描画を促します。尚、チェックボックスのクリック時、つまり切替時に`InvalidateRect`を呼び出すと言う点で、私の先の回答と一致しています。
8
+
9
+ ```C++
10
+ void CObjColorChangeDlg::OnBnClickedCheck1()
11
+ {
12
+ // UpdateData()で更新する前に、保存
13
+ BOOL pre = m_bCheck1;
14
+
15
+ UpdateData(TRUE);
16
+ if (m_bCheck1) {
17
+ m_brUse = &m_brPink;//チェック時はピンクを使用背景ブラシとする。
18
+ }
19
+ else {
20
+ m_brUse = &m_brGreen;//未チェック時は緑を使用背景ブラシとする。
21
+ }
22
+
23
+ if (pre != m_bCheck1) {
24
+ // チェック状態に変更があれば、ダイアログボックス全体を無効化
25
+ Invalidate();
26
+ }
27
+ }
28
+ ```
29
+ ---
30
+ **以下は当初の回答です:**
31
+ (Windows 10/Visual Studio 2019で確認)
32
+
1
33
  ダイアログボックスの持つコントロールの背景色の描画に使われる`WM_CTLCOLOR`メッセージは過去のWindowsで送受されたメッセージで、現行のものではコントロールの種別ごと、`WM_CTLCOLORBTN`や`WM_CTLCOLORSTATIC`などに細分化されています。MFCの場合は過去バージョンの互換性も考慮した結果、`WM_CTLCOLOR`のメッセージハンドラーである`OnCtlColor`が作成できているのだと思います。
2
34
 
3
35
  加えてダイアログボックスの背景色用にも[WM_CTLCOLORDLG](https://docs.microsoft.com/ja-jp/windows/win32/dlgbox/wm-ctlcolordlg) メッセージと言うものがあり、これを利用することでダイアログボックスの背景色を変えることができます。以下はMFCではないWindows APIを直に使ったサンプルコードです。ダイアログボックスが持つチェックボックス(ID=IDC_CHECK1)のチェックをON/OFFするごとにチェックボックスとダイアログボックスの背景色を切り替えます。これを参考にMFCバージョンの質問者さんのコードに適用することで、ご要望の動きができると思います。