MFC 提供了一个名为DDX_CBIndex
的函数来获取当前选定的ComboBox 项的索引。但在大多数情况下,我对索引不感兴趣,相反我想获得 32 位应用程序提供的值,这是我在调用 GetItemData
时获得的。因此,我总是必须覆盖 OnOk
并使用 GetCurSel
和 GetItemData
来检索此值。
是否有更优雅的方式来获取/设置 CComboBox 项目而不取决于索引但取决于应用程序提供的 32 位值?
谢谢!
最佳答案
我有一个部分解决这个问题的方法,但是根据@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);
}
}
关于windows - 如何在 CComboBox 控件中正确使用 DDX(数据交换)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5403509/