我们可以将复选框映射到 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
变量。
我知道在正常情况下,只要使用 TRUE
或 FALSE
变量就可以使用 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);
它工作正常。
把这个变量映射到CDialog
:
DDX_Check(pDX, IDC_CHECK_PREVIEW_CURRENT_WEEK, m_bPreviewCurrentWeek);
根据 IDE 中的设计,它映射到 BOOL
变量而不是 bool
变量。
我知道在正常情况下,只要使用 TRUE
或 FALSE
变量就可以使用 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);
它工作正常。