前提・実現したいこと
チェックボックスのチェックイベントにより、ダイアログ画面とチェックボックスの背景色を切り替えるプログラムを作りたいと思っています。
発生している問題・エラーメッセージ
チェックボックスをチェックしてもチェックボックスの背景色は変わるのですが、
画面の背景色は変わりませんでした。
該当のソースコード
ObjColorChangeという名前のMFCプロジェクトをダイアログ型で作成。 ウィザードでだいたい作っていますが、追加行は //追加: 追加ブロックは //以下追加 と記述しています。 [ObjColorChangeDlg.h] // #pragma once // CObjColorChangeDlg ダイアログ class CObjColorChangeDlg : public CDialogEx { // コンストラクション public: CBrush m_brGreen; //追加:グリーンの背景色ブラシ CBrush m_brPink; //追加:ピンクの背景色ブラシ CBrush *m_brUse; //追加:使用背景色ブラシ CObjColorChangeDlg(CWnd* pParent = nullptr); // 標準コンストラクター // ダイアログ データ #ifdef AFX_DESIGN_TIME enum { IDD = IDD_OBJCOLORCHANGE_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート // 実装 protected: HICON m_hIcon; // 生成された、メッセージ割り当て関数 virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);//追加:コントロールへの描画メッセージハンドラ afx_msg void OnBnClickedCheck1();//追加:チェックボックスクリック時イベントハンドラ BOOL m_bCheck1;//追加:チェックボックスのValueの変数 public: CButton m_cCheck1;//追加:チェックボックス変数 }; [ObjColorChangeDlg.cpp] // #include "pch.h" #include "framework.h" #include "ObjColorChange.h" #include "ObjColorChangeDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CObjColorChangeDlg ダイアログ CObjColorChangeDlg::CObjColorChangeDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_OBJCOLORCHANGE_DIALOG, pParent) , m_bCheck1(FALSE) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CObjColorChangeDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Check(pDX, IDC_CHECK1, m_bCheck1); DDX_Control(pDX, IDC_CHECK1, m_cCheck1); } BEGIN_MESSAGE_MAP(CObjColorChangeDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CTLCOLOR() ON_BN_CLICKED(IDC_CHECK1, &CObjColorChangeDlg::OnBnClickedCheck1) END_MESSAGE_MAP() // CObjColorChangeDlg メッセージ ハンドラー BOOL CObjColorChangeDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 // Framework は、この設定を自動的に行います。 SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 // TODO: 初期化をここに追加します。 //以下追加 //起動時とみチェック時用に緑色のブラシ、チェック時用にピンクのブラシを作成する. m_brGreen.CreateSolidBrush(RGB(0, 255, 0));//緑色のブラシ m_brPink.CreateSolidBrush(RGB(234, 145, 152));// ピンクのブラシ m_brUse=&m_brGreen;//起動時は緑色のブラシを使用 return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } // ダイアログに最小化ボタンを追加する場合、アイコンを描画するための // 下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、 // これは、Framework によって自動的に設定されます。 void CObjColorChangeDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 描画のデバイス コンテキスト SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // クライアントの四角形領域内の中央 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // アイコンの描画 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } // ユーザーが最小化したウィンドウをドラッグしているときに表示するカーソルを取得するために、 // システムがこの関数を呼び出します。 HCURSOR CObjColorChangeDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } HBRUSH CObjColorChangeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { //以下コメントアウト //HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); //// TODO: ここで DC の属性を変更してください。 //// TODO: 既定値を使用したくない場合は別のブラシを返します。 //return hbr; //以下追加 switch (nCtlColor) { case CTLCOLOR_DLG: return (HBRUSH)*m_brUse;//使用背景ブラシを返す case CTLCOLOR_STATIC://CheckBoxはCTLCOLOR_STATIC型 return (HBRUSH)*m_brUse;//使用背景ブラシを返す default: break; } return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);//該当コントロール以外は既定のブラシ } void CObjColorChangeDlg::OnBnClickedCheck1() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 //以下追加 UpdateData(TRUE); if (m_bCheck1) { m_brUse = &m_brPink;//チェック時はピンクを使用背景ブラシとする。 } else { m_brUse = &m_brGreen;//未チェック時は緑を使用背景ブラシとする。 } }
補足情報(FW/ツールのバージョンなど)
Visual C++ 2017, プロジェクト作成開始時にMFCアプリを選択。
チェック時にチェックボックスの背景のみピンクになっているが、ダイアログ画面の背景もピンクになって欲しい。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/22 15:57 編集
2021/02/24 02:48
2021/02/24 03:05
2021/02/24 03:10
2021/02/24 04:16