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

发布于 2025-01-28 06:52:33 字数 416 浏览 2 评论 0原文

cdialog中进行此变量映射:

DDX_Check(pDX, IDC_CHECK_PREVIEW_CURRENT_WEEK, m_bPreviewCurrentWeek);

通过在IDE中进行设计,将其映射到bool变量,而不是bool变量。

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

我们可以使用复选框控件使用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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

書生途 2025-02-04 06:52:33

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

它可以正常工作。

@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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文