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

标签 windows winapi mfc combobox

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

是否有更优雅的方式来获取/设置 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/

相关文章:

php - Gettext 将始终使用系统默认语言环境

sqlite - 使用MFC的SQLite

c++ - 从 CString 到 char*/TCHAR* 的转换

windows - 警告 - 运行 wevtutil 时无法访问提供程序资源

c# - Message.show() 在另一台计算机桌面上?

windows - Go 无法在 DLL 中查找过程

c++ - 在 C++ 中连接两个 WCHAR_T 数组

c++ - ExtTextOut 文本不断闪烁,并且在设定的时间后文本恢复为默认字体

Windows设备: get "location" string for a given IMFActivate* of a UVC webcam

c++ - 打印 : Wrong bottom margin