Создаю 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 стандартным способом — через 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);
}
}