将 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);
}
这个问题是这个问题的衍生问题 (
我在我的对话框中有几个实例,我将 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);
}