質問: Visual Stduio 2017 MFCにて、 チェックボックスを複数設置し、 for文にて、チェックが入っているチェックボックスの背景色を任意時間、変更したいです。 イメージ CheckBox_1 ・・・ チェックあり CheckBox_2 ・・・ チェックなし CheckBox_3 ・・・ チェックあり for文にて、以下の処理を繰り返す 背景色 CheckBox_1 青(3秒間待機)→ デフォルト → 青(3秒間待機)→ デフォルト → ・・・ CheckBox_2 デフォルト → デフォルト → デフォルト → デフォルト → ・・・ CheckBox_3 デフォルト → 緑(3秒間待機) → デフォルト → 緑(3秒間待機)→ ・・・ OnCtlColor を用いて試みましたが、 行いたいような各チェックボックスの背景色を変更する事が出来ませんでした。 申し訳ありませんが、 アドバイスを頂けないでしょうか?
回答: ざっくりとですが1秒毎にチカチカするチェックボックス例です。 * タイマーでON/OFF状態値を更新しつつ`Invalidate`で表示更新 * `OnCtrlColor`で状態に応じ背景色(ブラシ)を切り替え ``` class CxxxDlg : public CDialog { CBrush m_brBk; // チェックボックスの強調時の背景色 int m_nBr; // ON/OFF状態値 UINT m_uTimer; // ON/OFFタイマー CButton m_chk1;// DDXでチェックボックスに紐づけた変数 ``` ``` BOOL CxxxDlg::OnInitDialog() { m_nBr = 0; m_brBk.CreateSolidBrush(RGB(255, 0, 0)); // 背景(赤) m_uTimer = SetTimer( 123, 1000, NULL); // OnDestroyなりでKillTimerしてください。 void CxxxDlg::OnTimer(UINT_PTR nIDEvent) { if( nIDEvent == 123){ m_nBr++; Invalidate(); } HBRUSH CxxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); if(pWnd->GetSafeHwnd() == m_chk1.GetSafeHwnd()){ if(m_nBr % 2){ return (HBRUSH)m_brBk; } } return hbr; } ```