在组合框

时间:2016-03-29 14:43:50

标签: winapi combobox mfc

我有一个组合框,我需要拦截选择的更改,同时用户通过鼠标悬停而不用点击来更改选择。这用于显示有关用户悬停的项目的补充信息。

CBN_SELCHANGE无法完成这项工作,因为只有当用户实际通过点击其中一个组合框项目或当按下向上/向下键。

当用户将鼠标悬停在组合框上时,显然不会触发任何消息。

插图

例如:我需要知道用户何时将鼠标从条目2移动到条目33

enter image description here

1 个答案:

答案 0 :(得分:1)

这是基于你提到的c# article的c ++子类:

LRESULT CALLBACK ComboProc(HWND hwnd, UINT msg, WPARAM wParam, 
    LPARAM lParam, UINT_PTR uIdSubClass, DWORD_PTR)
{
    if (msg == WM_CTLCOLORLISTBOX)
    {
        COMBOBOXINFO ci = { sizeof(COMBOBOXINFO) };
        GetComboBoxInfo(hwnd, &ci);
        if (HWND(lParam) == ci.hwndList)
        {
            int pos = SendMessage(ci.hwndList, LB_GETCURSEL, 0, 0);
            OutputDebugStringA(std::to_string(pos).c_str());
            OutputDebugStringA("\n");
        }
    }

    if (msg == WM_NCDESTROY)
    {
        RemoveWindowSubclass(hwnd, ComboProc, uIdSubClass);
    }

    return DefSubclassProc(hwnd, msg, wParam, lParam);
}

...
SetWindowSubclass(hComboBox, ComboProc, 0, 0);

这是在Windows 10上测试的。

这只能在下拉列表中报告悬停选择,它无法更改选择。