MFC提供了一个名为DDX_CBIndex
的函数来获取当前所选ComboBox项的索引。但在大多数情况下,我对索引不感兴趣,而是希望得到32位应用程序提供的值,这是我在调用GetItemData
时得到的。因此,我始终必须覆盖OnOk
并使用GetCurSel
和GetItemData
来检索此值。
是否有一种更优雅的方式来获取/设置CComboBox项目而不依赖于索引,但取决于应用程序提供的32位值?
谢谢!
答案 0 :(得分:4)
我对这个问题有一个部分解决方案,但是使用了@taspeotis的建议,我写了这个,这看起来效果很好。
template <class T>
void DDX_CBData(CDataExchange* pDX, int nIDC, T& data)
{
HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
if (pDX->m_bSaveAndValidate)
{
int index = static_cast<int>(::SendMessage(hWndCtrl, CB_GETCURSEL, 0, 0L));
data = (index == CB_ERR ? NULL : reinterpret_cast<T>(::SendMessage(hWndCtrl, CB_GETITEMDATA, index, 0L)));
}
else
{
int count = static_cast<int>(::SendMessage(hWndCtrl, CB_GETCOUNT, 0, 0L));
for (int i = 0; i != count; ++i)
{
if (reinterpret_cast<T>(::SendMessage(hWndCtrl, CB_GETITEMDATA, i, 0L)) == data)
{
::SendMessage(hWndCtrl, CB_SETCURSEL, i, 0L);
return;
}
}
::SendMessage(hWndCtrl, CB_SETCURSEL, -1, 0L);
}
}
答案 1 :(得分:2)
为什么不编写一个实现,然后在DoDataExchange
中使用它?例如,MyDDX_CBUserData
?