将 CDialog CComboBox 控件映射到枚举 class 对象而不是 int?

Mapping CDialog CComboBox controls to an enum class object instead of int?

这个问题是这个问题的衍生问题 (),我希望我们能有类似的解决方案。

我在我的对话框中有几个实例,我将 enum class 表示为 CComboBox 中的选项下拉列表(而不是使用单选按钮)。

这是一个例子:

enum class ReportMode {
    Meeting = 0,
    Weekly
};

目前我的 CComboBox 映射到 int:

DDX_CBIndex(pDX, IDC_COMBO_REPORT_MODE, m_iReportMode);

我深入研究了 DDX_CBIndex 的 SDK:

void AFXAPI DDX_CBIndex(CDataExchange* pDX, int nIDC, int& index)
{
    pDX->PrepareCtrl(nIDC);
    HWND hWndCtrl;
    pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
    if (pDX->m_bSaveAndValidate)
        index = (int)::SendMessage(hWndCtrl, CB_GETCURSEL, 0, 0L);
    else

        ::SendMessage(hWndCtrl, CB_SETCURSEL, (WPARAM)index, 0L);
}

根据对链接问题的回答,我认为这是正确的:

template<typename E>
void AFXAPI DDX_CBIndexEnum(CDataExchange* pDX, int nIDC, E& value)
{
    pDX->PrepareCtrl(nIDC);
    HWND hWndCtrl;
    pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
    if (pDX->m_bSaveAndValidate)
        value = static_cast<E>(::SendMessage(hWndCtrl, CB_GETCURSEL, 0, 0L));
    else
        ::SendMessage(hWndCtrl, CB_SETCURSEL, static_cast<WPARAM>(value), 0L);
}