我们可以将复选框映射到 MFC 中的 bool 变量而不是 BOOL 吗?

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

把这个变量映射到CDialog:

DDX_Check(pDX, IDC_CHECK_PREVIEW_CURRENT_WEEK, m_bPreviewCurrentWeek);

根据 IDE 中的设计,它映射到 BOOL 变量而不是 bool 变量。

我知道在正常情况下,只要使用 TRUEFALSE 变量就可以使用 bool 变量。但是,当我尝试将我的成员变量更改为 bool 时,它无法在 DDX_Check 例程上编译。

我们可以将 bool 与复选框控件一起使用吗?

@Jabberwocky 的评论提醒我,我已经实现了一些自定义 DDX 例程:

于是我钻研了MFC源码,在自己的cpp文件中修改了一份:

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);
    }
}

我注释掉了验证检查,因为 bool 无论如何只有两个值之一。如果你认为这是一个错误,请大声喊叫。

所以我现在可以这样做了:

DDX_CheckBool(pDX, IDC_CHECK_SELECT_NAMES, m_bSelectStartingNames);

它工作正常。