c++ - 将工具提示添加到 ComboBoxEx 失败

标签 c++ winapi combobox controls tooltip

考虑下面的代码,其中创建了 2 种不同的组合框(WC_COMBOBOX 和 WC_COMBOBOXEX),然后每个都附有工具提示。

WC_COMBOBOX 的工具提示按预期工作,但 WC_COMBOBOXEX 无法显示工具提示。

问题是什么?

BOOL TooltipDlg_OnInitDialog(HWND hWndDialog, HWND hWndFocus, LPARAM lParam)
{
    // Load and register Tooltip, ComboBox, ComboBoxEx control classes
    INITCOMMONCONTROLSEX iccx;
    iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
    iccx.dwICC = ICC_WIN95_CLASSES | ICC_USEREX_CLASSES;
    if (!InitCommonControlsEx(&iccx))
        return FALSE;

    // Create combo boxes
    const int idc_ComboBox = 1000;
    const int idc_ComboBoxEx = 1001;
    {
        // create WC_COMBOBOX
        CreateWindow(WC_COMBOBOX, NULL,
                     WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST,
                     40, 80,
                     100, 20, 
                     hWndDialog, (HMENU)idc_ComboBox, g_hInst,
                     NULL);
        // create WC_COMBOBOXEX
        CreateWindowEx(0, WC_COMBOBOXEX, NULL,
                       WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST,
                       40, 110,
                       100, 20,
                       hWndDialog, (HMENU)(idc_ComboBoxEx), g_hInst, 
                       NULL);
    }

    // Create tooltip
    g_hwndTooltip = CreateWindowEx(0, TOOLTIPS_CLASS, L"", 
                                   TTS_ALWAYSTIP, 
                                   0, 0, 0, 0, 
                                   hWndDialog, 0, g_hInst, 0);

    // attach the tooltip to controls
    {
        TOOLINFO ti;
        ti.cbSize = sizeof(ti);    
        ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS;     

        // attach to idc_ComboBox -- works fine
        ti.uId = (UINT_PTR)GetDlgItem(hWndDialog, idc_ComboBox);
        ti.lpszText = L"This is tooltip for WC_COMBOBOX.";
        SendMessage(g_hwndTooltip, TTM_ADDTOOL, 0, (LPARAM)&ti);

        // attach to idc_ComboBoxEx -- does NOT work: no tooltip displayed
        ti.uId = (UINT_PTR)GetDlgItem(hWndDialog, idc_ComboBoxEx);
        ti.lpszText = L"This is tooltip for WC_COMBOBOXEX.";
        SendMessage(g_hwndTooltip, TTM_ADDTOOL, 0, (LPARAM)&ti);    
    }

    return TRUE;
}

最佳答案

WC_COMBOBOXEX 创建 2 个窗口 - 父组合框控件和子组合框控件,它们的大小与父控件相同,并且所有鼠标消息都发送给这个子控件,而不是父控件。所以需要子类子组合框控件。我们可以通过CBEM_GETCOMBOCONTROL得到它信息。所以代码必须如下所示:

    HWND hwndCBex = CreateWindowEx(0, WC_COMBOBOXEX, ...);
    ti.uId = (UINT_PTR)SendMessage(hwndCBex, CBEM_GETCOMBOCONTROL, 0, 0);
    ti.lpszText = L"This is tooltip for WC_COMBOBOXEX.";
    SendMessage(g_hwndTooltip, TTM_ADDTOOL, 0, (LPARAM)&ti);  

关于c++ - 将工具提示添加到 ComboBoxEx 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46929114/

相关文章:

c++ - 如何将模板实例传递给需要将模板参数传递给基类的函数?

c++ - 如何在 WinAPI 中创建具有视觉样式的平面按钮

javascript - datagrid easyui 中的依赖组合框

python-2.7 - 带有 LIKE 搜索的 Python Tkinter 自动完成组合框?

c++ - vsnprintf_s 调用后是否需要 va_end?

c# - 将 C++ 库移植到 C# 的最佳方法是什么?

winapi - XamlCompiler错误WMC1006 : Cannot resolve Assembly or Windows Metadata file 'Microsoft.Win32.Registry.dll'

winapi - 从 32 位应用程序检查时,Windows 10 bash.exe(Linux 用户空间)不存在

JavaFX StringConverter 不适用于组合框

c++ - 为什么我不能使用速记将标量值分配给类,而是先声明它,然后设置它的值?