Как заставить Tool Tip срабатывать на всей площади элемента?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.08.18 20:38
Оценка:
Создаю Tool Tip стандартным способом — через CreateWindow с TOOLTIPS_CLASS. Добавляю несколько элементов управления (Static Text, редактируемый Combo Box, Edit, Rich Edit), указывая их идентификаторами окон (TTF_IDISHWND). На Edit и Rich Edit подсказки всплывают, на Combo Box — только при наведении на кнопку открывания списка, на Static Text — вообще не всплывают.

Указываю элементы координатами прямоугольников — начинает срабатывать на Static Text, перестает на всех остальных. При этом WM_MOUSEMOVE идут при каждом движении мыши внутри элементов. Пробовал и TTF_SUBCLASS, и TTM_RELAYEVENT в цикле обработки сообщений — никакой разницы.

Картина одинаковая в Win 7 (версии comctl32 5.82.7601, 6.16.7601) и Win 10 (5.82.7601 и 6.16.10586).

Можно ли это чудо заставить отображать подсказки при наведении на любую часть элемента управления? Про Static Text где-то встречал оговорку, что с нею не всегда работает, но остальные-то почему косячат?
tooltip ttf_idishwnd static rich combobox ttf_subclass
Re: Как заставить Tool Tip срабатывать на всей площади элемента?
От: Melamed Россия  
Дата: 28.08.18 12:50
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Создаю Tool Tip стандартным способом — через CreateWindow с TOOLTIPS_CLASS. Добавляю несколько элементов управления (Static Text, редактируемый Combo Box, Edit, Rich Edit), указывая их идентификаторами окон (TTF_IDISHWND). На Edit и Rich Edit подсказки всплывают, на Combo Box — только при наведении на кнопку открывания списка, на Static Text — вообще не всплывают.


ЕМ>Указываю элементы координатами прямоугольников — начинает срабатывать на Static Text, перестает на всех остальных. При этом WM_MOUSEMOVE идут при каждом движении мыши внутри элементов. Пробовал и TTF_SUBCLASS, и TTM_RELAYEVENT в цикле обработки сообщений — никакой разницы.


ЕМ>Картина одинаковая в Win 7 (версии comctl32 5.82.7601, 6.16.7601) и Win 10 (5.82.7601 и 6.16.10586).


ЕМ>Можно ли это чудо заставить отображать подсказки при наведении на любую часть элемента управления? Про Static Text где-то встречал оговорку, что с нею не всегда работает, но остальные-то почему косячат?


Для того, чтобы Tool Tip срабатывал в разных частях окна, ему надо для каждой части окна послать сначала сообщение TTM_ADDTOOL, а затем TTM_TRACKACTIVATE

Вот как я организовал обновление Tool Tip в своей программе

void GraphicTable::UpdateToolTip()
{
    SendMessage(m_hToolTip,TTM_ACTIVATE,FALSE,0);
    int nCells = SendMessage(m_hToolTip,TTM_GETTOOLCOUNT,0,0);
    int i;
    TOOLINFO ti;
    ti.hwnd = m_hWnd;
    for(i=0;i<nCells;i++)
    {
        ti.uId = i;
        SendMessage(m_hToolTip,TTM_DELTOOL,0,(LPARAM)&ti);
    }
    if(GetWindowLong(m_hWnd,GWL_STYLE) & GTS_TOOLTIP)
    {
        ti.cbSize = TTTOOLINFO_V1_SIZE;
        ti.uFlags = TTF_SUBCLASS;
        ti.hinst = GetWindowInstance(m_hWnd);
        ti.rect.top = ti.rect.left = 0;
        ti.lpszText = LPSTR_TEXTCALLBACK;
        RECT rc;
        GetClientRect(m_hWnd,&rc);
        int nColumns = rc.right / m_CellSize.cx;
        int nRows = rc.bottom / m_CellSize.cy;
        if(rc.bottom % m_CellSize.cy)
        {
            nRows++;
        }
        nCells = nColumns * nRows;
        if(nCells > m_FileList.size())
        {
            nCells = m_FileList.size();
        }
        rc.right = m_CellSize.cx;
        rc.bottom = m_CellSize.cy;
        int nColumnIndex,nRowIndex; 
        for(i=0;i<nCells;i++)
        {
            nColumnIndex = i % nColumns;
            nRowIndex = i / nColumns;
            ti.rect = rc;
            OffsetRect(&ti.rect, 
                nColumnIndex * m_CellSize.cx, 
                nRowIndex * m_CellSize.cy);
            ti.uId = i;
            SendMessage(m_hToolTip,TTM_ADDTOOL,0,(LPARAM)&ti);
            SendMessage(m_hToolTip,TTM_TRACKACTIVATE,TRUE,(LPARAM)&ti);
        }
        SendMessage(m_hToolTip,TTM_ACTIVATE,TRUE,0);
    }
}
Re[2]: Как заставить Tool Tip срабатывать на всей площади элемента?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 01.09.18 19:06
Оценка:
Здравствуйте, Melamed, Вы писали:

M>Для того, чтобы Tool Tip срабатывал в разных частях окна, ему надо для каждой части окна послать сначала сообщение TTM_ADDTOOL, а затем TTM_TRACKACTIVATE


У меня получилось обойтись добавлением окна редактирования Combo Box, добытого в hwndItem через GetComboBoxInfo. Думал, Tool Tip сам догадается это сделать, ан нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.