2017-10-25 1 views
6

2種類のコンボボックス(WC_COMBOBOXおよびWC_COMBOBOXEX)が作成され、それぞれにツールチップが添付されている以下のコードを検討してください。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; 
} 

答えて

5

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); 
関連する問題