подсказки Tooltip для строк Combobox

Тема в разделе "WASM.WIN32", создана пользователем Andrey_59, 5 апр 2024.

  1. Andrey_59

    Andrey_59 Member

    Публикаций:
    0
    Регистрация:
    20 фев 2021
    Сообщения:
    81
    Здравствуйте! Я не могу понять, как наладить взаимодействие tooltip и combobo-а, а именно, выводить пояснения tooltip над строками из списка combabox-а.
    Не знаю, как внутри toolbar-а это дело реализовано, если установлен стиль TBSTYLE_TOOLTIPS, но хочется что-то подобное реализовать и для строк combabox-а. Пока получается вывести пояснение только для combobox и то, только, если явно задать строку при регистрации элемента для tooltip-а. Но как для строк это делать, не ясно. Процедуру combabox-а я подменил, как рекомендуют, для отслеживания сообщений мыши. И что дальше происходит, после того как combobox получил сообщение от мыши, если я правильно понимаю, отправляем его в tooltip, а tooltip отправляет родителю сообщение TTN_NEEDTEXT или не так?
    Короче говоря лучше покажу, как я предоставляю информацию tooltip-у...
    Код (C++):
    1. hTtip = CreateWindowEx(0L, TOOLTIPS_CLASS, NULL,
    2.                                    WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
    3.                                    CW_USEDEFAULT, 0,
    4.                                    CW_USEDEFAULT, 0,
    5.                                    hwnd, (HMENU)NULL, hInstance, NULL);
    6. //Для окна самого combobox-а
    7. //hwnd - в данном случае дескриптор окна на котором я расположил                          
    8. //combobox(решил, возможно, так будет легче разобраться и создал cobobox на основном окне, пока //не на tool bar-е).                      
    9. TTTOOLINFO ti = {0};
    10. ti.cbSize = sizeof(TTTOOLINFO);
    11. ti.uFlags = TTF_CENTERTIP | TTF_IDISHWND | TTF_SUBCLASS;
    12. ti.hwnd   = hwnd;
    13. ti.uId    = hCombo;  //
    14. ti.hInst  = hInstance;  //Здесь установил NULL
    15. ti.lpszText = LPSTR_TEXTCALLBACK; //Здесь задал явно строку, а иначе никак не получалось хоть что-то внятное отобразить.
    16. SendMessage(hTtip, TTM_ADDTOOL, 0, (LPARAM)&ti);
    17. //Далее делаю тоже самое, но для редактора combobox-а.
    18. HWND hEdit = GetWindow(hCombo, GW_CHILD);
    19. ZeroMemory(&ti, sizeof(TTTOOLINFO));
    20. ti.cbSize = sizeof(TTTOOLINFO);
    21. ti.uFlags = TTF_CENTERTIP | TTF_IDISHWND | TTF_SUBCLASS;
    22. ti.hwnd   = hwnd;
    23. ti.uId    = hEdit;
    24. ti.hInst  = hInstance;
    25. ti.lpszText = LPSTR_TEXTCALLBACK;
    26. SendMessage(hTtip, TTM_ADDTOOL, 0, (LPARAM)&ti);
    27. //Строки расположены в редакторе combobox-а и вот тут возникает вопрос, а как tooltip  //настроить на них на строки...
    Есть хоть какие-нибудь идеи на этот счёт?

    Может быть, нужно вычислить координаты для каждой строки combobox-а и настраивать tooltip для каждой строки как-то так:
    Код (C++):
    1. ZeroMemory(&ti, sizeof(TTTOOLINFO));
    2. ti.cbSize = sizeof(TTTOOLINFO);
    3. ti.uFlags = TTF_CENTERTIP | TTF_SUBCLASS;
    4. ti.hwnd   = hwnd;
    5. ti.uId    = IDT_STRING1;
    6. ti.hInst  = hInstance;
    7. ti.lpszText = LPSTR_TEXTCALLBACK; //тогда здесь нужно задать явно строку или нет.
    8. ti.cRect    = rcRectForString1;  //Каким-то образом вычисленные координаты для строки.
    9. //.....
    10. SendMessage(hTtip, TTM_ADDTOOL, 0, (LPARAM)&ti);
     
  2. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    39
    Я делаю так
    Код (C):
    1. HWND CreateToolTip(HWND hDlg, int nIDButton, int nIDText, PTCH pszText)
    2. {
    3.    int cchBuffer = 0;
    4.    cchBuffer = LoadString(g_hInstance, nIDText, pszText, 0);
    5.    LoadString(g_hInstance, nIDText, pszText, cchBuffer + 1);
    6.  
    7.    HWND hWndTool = nullptr, hWndTip = nullptr;
    8.  
    9.    hWndTool = GetDlgItem(hDlg, nIDButton);
    10.  
    11.    TOOLINFO ToolInfo = { sizeof(TOOLINFO) };
    12.  
    13.    ToolInfo.hwnd = hDlg;
    14.    ToolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    15.    ToolInfo.uId = (SIZE_T)hWndTool;
    16.    ToolInfo.lpszText = pszText;
    17.  
    18.    hWndTip = CreateWindow(TOOLTIPS_CLASS, 0, WS_POPUP | TTS_ALWAYSTIP | TTS_BALLOON,
    19.       CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hDlg, 0, g_hInstance, 0);
    20.  
    21.    SendMessage(hWndTip, TTM_ADDTOOL, 0, (LPARAM)&ToolInfo);
    22.  
    23.    SendMessage(hWndTip, TTM_SETMAXTIPWIDTH, 0, SHRT_MAX); // SHRT_MAX  UCHAR_MAX
    24.    SendMessage(hWndTip, TTM_SETDELAYTIME, TTDT_AUTOPOP, SHRT_MAX);
    25.    SendMessage(hWndTip, TTM_SETDELAYTIME, TTDT_INITIAL, 200);
    26.    SendMessage(hWndTip, TTM_SETDELAYTIME, TTDT_RESHOW, 200);
    27.  
    28.   return hWndTip;
    29. }
    Затем в коде передаю в эту функцию дескриптор окна (диалога), идентификатор привязанного к этому окну контрола, и номер строки из ресурсов
    Код (C):
    1. TCHAR strBuffer[MAX_PATH] = { 0 };
    2. CreateToolTip(hDlg, 4024, 10039, strBuffer);
     
    Research нравится это.
  3. Andrey_59

    Andrey_59 Member

    Публикаций:
    0
    Регистрация:
    20 фев 2021
    Сообщения:
    81
    Ничего что я спрашивал не про кнопку, а про строки в combobox-е, строки, которые находятся в выпадающем списке combobox-а, а это несколько другая последовательность действий.
     
  4. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    39
    ничего что и кнопка и комбокс это окно (контрол)?
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.721
    k3rnl,
    а Вы случаем не politoto?
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Вам подсказали вариант решения. Вы попробовали его ?
     
  7. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    39
    Нет.
    На киберфоруме я был с 2011 года, потом возник конфликт с несколькими новенькими пользователями (предполагаю это был один и тот же человек, который ранее периодически производил на меня нападки (в силу своей тупости и зависти), но был заблокирован).
    Администрация форума встала на их сторону. После этого я там больше не появляюсь.
     
    Mikl___ нравится это.