Как правильно использовать DDX (Обмен данными) с CComboBox Control? - PullRequest
3 голосов
/ 23 марта 2011

MFC предлагает функцию под названием DDX_CBIndex для получения индекса текущего выбранного элемента ComboBox. Но в большинстве случаев меня не интересует индекс, вместо этого я хочу получить 32-битное значение, предоставляемое приложением, которое я получаю при вызове GetItemData. Поэтому мне всегда приходится переопределять OnOk и использовать GetCurSel и GetItemData для получения этого значения.

Есть ли более элегантный способ получить / установить элемент CComboBox не в зависимости от индекса, а в зависимости от 32-битного значения, предоставленного приложением?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 23 марта 2011

У меня было частичное решение этой проблемы, но, используя предложение @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);
    }
}
2 голосов
/ 23 марта 2011

Почему бы не написать одну реализацию, а затем использовать ее в DoDataExchange? Например, MyDDX_CBUserData?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...