如何在CComboBox控件中正确使用DDX(数据交换)?

时间:2011-03-23 10:02:28

标签: windows winapi mfc combobox

MFC提供了一个名为DDX_CBIndex的函数来获取当前所选ComboBox项的索引。但在大多数情况下,我对索引不感兴趣,而是希望得到32位应用程序提供的值,这是我在调用GetItemData时得到的。因此,我始终必须覆盖OnOk并使用GetCurSelGetItemData来检索此值。

是否有一种更优雅的方式来获取/设置CComboBox项目而不依赖于索引,但取决于应用程序提供的32位值?

谢谢!

2 个答案:

答案 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