2017-10-25 60 views
6

Należy rozważyć poniższy kod, w którym tworzone są 2 różne typy pól kombinowanych (WC_COMBOBOX i WC_COMBOBOXEX), a następnie do każdej z nich dołączana jest wskazówka narzędzia.Dodawanie etykiety Tooltip do ComboBoxEx kończy się niepowodzeniem.

Wskazówka dla WC_COMBOBOX działa zgodnie z oczekiwaniami, ale WC_COMBOBOXEX nie wyświetla wskazówki narzędzia.

Na czym polega problem?

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; 
} 

Odpowiedz

5

WC_COMBOBOXEX utworzyć 2 okna - rodzic i dziecko kontrola pole kombi, które mają taki sam rozmiar jak rodzica i wszystkie wiadomości myszy iść do tego dziecka, a nie dla rodziców. więc potrzebuję kontrolki combobox dla podklasy. możemy to uzyskać za pośrednictwem wiadomości CBEM_GETCOMBOCONTROL. więc kod musi wyglądać następująco:

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); 
Powiązane problemy