visual-c++mfcbooleanddx

Can we map a checkbox to a bool variable in MFC instead of BOOL?


Take this variable mapping in a CDialog:

DDX_Check(pDX, IDC_CHECK_PREVIEW_CURRENT_WEEK, m_bPreviewCurrentWeek);

By design in the IDE it to map to a BOOL variable instead of a bool variable.

I know that under normal circumstances you can just use a bool variable wherever TRUE or FALSE is used. But, when I try changing my member variable to a bool it fails to compile on the DDX_Check routine.

Can we use bool with a checkbox control?


Solution

  • @Jabberwocky's comment reminded me that I have already implemented some custom DDX routines:

    So I delved into the MFC source and modified a copy in my own cpp file:

    void AFXAPI DDX_CheckBool(CDataExchange* pDX, int nIDC, bool& value)
    {
        pDX->PrepareCtrl(nIDC);
        HWND hWndCtrl;
        pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
        if (pDX->m_bSaveAndValidate)
        {
            value = static_cast<bool>(::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L));
            //ASSERT(value >= 0 && value <= 2);
        }
        else
        {
            //if (value < 0 || value > 2)
            //{
            //  TRACE(traceAppMsg, 0, "Warning: dialog data checkbox value (%d) out of range.\n",
            //      value);
            //  value = 0;  // default to off
            //}
            ::SendMessage(hWndCtrl, BM_SETCHECK, static_cast<WPARAM>(value), 0L);
        }
    }
    

    I commented out the validation checks since bool has only one of two values anyway. Shout if you think that was a mistake.

    So I am now able to do this:

    DDX_CheckBool(pDX, IDC_CHECK_SELECT_NAMES, m_bSelectStartingNames);
    

    It works fine.