Вот собственно код и я не могу понять почему он не работает и что нужно сделать чтобы тултип отображался по заданным мной координатам относительно мышки.
if (m_LastToolTipRow!=-1 && m_LastToolTipRow!=-1)
{
// Not using CToolTipCtrl::AddTool() because it redirects the messages to CListCtrl parent
TOOLINFO ti = {0};
ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_IDISHWND | TTF_TRANSPARENT; // Indicate that uId is handle to a control
ti.uId = (UINT_PTR)m_hWnd; // Handle to the control
ti.hwnd = m_hWnd; // Handle to window to receive the tooltip-messages
ti.hinst = AfxGetInstanceHandle();
ti.lpszText = LPSTR_TEXTCALLBACK;
m_OwnToolTipCtrl.SendMessage(TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
m_OwnToolTipCtrl.SendMessage(TTM_TRACKPOSITION, 0, (LPARAM)MAKELPARAM(pt.x + 100, pt.y + 100));
m_OwnToolTipCtrl.SendMessage(TTM_TRACKACTIVATE, true, (LPARAM)&ti);
m_OwnToolTipCtrl.Activate(TRUE);
//Multiline
m_OwnToolTipCtrl.SetMaxTipWidth(256);
//m_OwnToolTipCtrl.SetMaxTipWidth(SHRT_MAX);
}
Здравствуйте, freelsd, Вы писали:
F>Вот собственно код и я не могу понять почему он не работает и что нужно сделать чтобы тултип отображался по заданным мной координатам относительно мышки.
F>F>if (m_LastToolTipRow!=-1 && m_LastToolTipRow!=-1)
F> {
F> // Not using CToolTipCtrl::AddTool() because it redirects the messages to CListCtrl parent
F> TOOLINFO ti = {0};
F> ti.cbSize = sizeof(TOOLINFO);
F> ti.uFlags = TTF_IDISHWND | TTF_TRANSPARENT; // Indicate that uId is handle to a control
F> ti.uId = (UINT_PTR)m_hWnd; // Handle to the control
F> ti.hwnd = m_hWnd; // Handle to window to receive the tooltip-messages
F> ti.hinst = AfxGetInstanceHandle();
F> ti.lpszText = LPSTR_TEXTCALLBACK;
F> m_OwnToolTipCtrl.SendMessage(TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
F> m_OwnToolTipCtrl.SendMessage(TTM_TRACKPOSITION, 0, (LPARAM)MAKELPARAM(pt.x + 100, pt.y + 100));
F> m_OwnToolTipCtrl.SendMessage(TTM_TRACKACTIVATE, true, (LPARAM)&ti);
F> m_OwnToolTipCtrl.Activate(TRUE);
F> //Multiline
F> m_OwnToolTipCtrl.SetMaxTipWidth(256);
F> //m_OwnToolTipCtrl.SetMaxTipWidth(SHRT_MAX);
F> }
F>
1. Для чего тултип? Встроенный для CListCtrl что ли?
2. pt откуда берется?
3. В ti.uFlags = TTF_IDISHWND | TTF_TRANSPARENT добавить TTF_TRACK + может быть надо TTF_ABSOLUTE в случае мышки.
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, freelsd, Вы писали:
F>>Вот собственно код и я не могу понять почему он не работает и что нужно сделать чтобы тултип отображался по заданным мной координатам относительно мышки.
F>>F>>if (m_LastToolTipRow!=-1 && m_LastToolTipRow!=-1)
F>> {
F>> // Not using CToolTipCtrl::AddTool() because it redirects the messages to CListCtrl parent
F>> TOOLINFO ti = {0};
F>> ti.cbSize = sizeof(TOOLINFO);
F>> ti.uFlags = TTF_IDISHWND | TTF_TRANSPARENT; // Indicate that uId is handle to a control
F>> ti.uId = (UINT_PTR)m_hWnd; // Handle to the control
F>> ti.hwnd = m_hWnd; // Handle to window to receive the tooltip-messages
F>> ti.hinst = AfxGetInstanceHandle();
F>> ti.lpszText = LPSTR_TEXTCALLBACK;
F>> m_OwnToolTipCtrl.SendMessage(TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
F>> m_OwnToolTipCtrl.SendMessage(TTM_TRACKPOSITION, 0, (LPARAM)MAKELPARAM(pt.x + 100, pt.y + 100));
F>> m_OwnToolTipCtrl.SendMessage(TTM_TRACKACTIVATE, true, (LPARAM)&ti);
F>> m_OwnToolTipCtrl.Activate(TRUE);
F>> //Multiline
F>> m_OwnToolTipCtrl.SetMaxTipWidth(256);
F>> //m_OwnToolTipCtrl.SetMaxTipWidth(SHRT_MAX);
F>> }
F>>
C>1. Для чего тултип? Встроенный для CListCtrl что ли?
C>2. pt откуда берется?
C>3. В ti.uFlags = TTF_IDISHWND | TTF_TRANSPARENT добавить TTF_TRACK + может быть надо TTF_ABSOLUTE в случае мышки.
Щас полный вариант обработчика дам. Да, мне тултип для листконтрола нужен, чтобы показывал подсказку для отдельной ячейки или рядка. Взял код из примера — все работает, но с TTF_TRACK — никак, пробовал разные варианты.
void CListCtrl_OwnToolTipCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
CPoint pt(GetMessagePos());
ScreenToClient(&pt);
// Find the subitem
LVHITTESTINFO hitinfo = {0};
hitinfo.flags = nFlags;
hitinfo.pt = pt;
SubItemHitTest(&hitinfo);
if (m_LastToolTipCol!=hitinfo.iSubItem || m_LastToolTipRow!=hitinfo.iItem)
{
// Mouse moved over a new cell
m_LastToolTipCol = hitinfo.iSubItem;
m_LastToolTipRow = hitinfo.iItem;
// Remove the old tooltip (if available)
if (m_OwnToolTipCtrl.GetToolCount()>0)
{
m_OwnToolTipCtrl.DelTool(this);
m_OwnToolTipCtrl.Activate(FALSE);
}
// Add the new tooltip (if available)
if (m_LastToolTipRow!=-1 && m_LastToolTipRow!=-1)
{
int nIDTool = 1;
// Not using CToolTipCtrl::AddTool() because it redirects the messages to CListCtrl parent
TOOLINFO ti = {0};
ti.cbSize = sizeof(TOOLINFO);
//ti.uFlags = TTF_IDISHWND | TTF_TRANSPARENT | TTF_ABSOLUTE | TTF_TRACK; // Indicate that uId is handle to a control
ti.uFlags = TTF_IDISHWND | TTF_TRANSPARENT ;
ti.uId = (UINT_PTR)m_hWnd; // Handle to the control
ti.hwnd = m_hWnd; // Handle to window to receive the tooltip-messages
ti.hinst = AfxGetInstanceHandle();
ti.lpszText = LPSTR_TEXTCALLBACK;
m_OwnToolTipCtrl.SetToolInfo(&ti);
m_OwnToolTipCtrl.SendMessage(TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
//m_OwnToolTipCtrl.SendMessage(TTM_TRACKACTIVATE, true, (LPARAM)&ti);
m_OwnToolTipCtrl.SendMessage(TTM_SETDELAYTIME, TTDT_INITIAL, 500);
m_OwnToolTipCtrl.SendMessage(TTM_SETDELAYTIME, TTDT_AUTOPOP, 5000);
//CPoint vt(GetMessagePos());
m_OwnToolTipCtrl.SendMessage(TTM_TRACKPOSITION, 0, (LPARAM)MAKELPARAM(pt.x, pt.y+10 ));
m_OwnToolTipCtrl.SendMessage(TTM_TRACKACTIVATE, true, (LPARAM)&ti);
m_OwnToolTipCtrl.Activate(TRUE);
//Multiline
m_OwnToolTipCtrl.SetMaxTipWidth(256);
//m_OwnToolTipCtrl.SetMaxTipWidth(SHRT_MAX);
}
}
CListCtrl::OnMouseMove(nFlags, point);
}
Здравствуйте, freelsd, Вы писали:
F>Щас полный вариант обработчика дам. Да, мне тултип для листконтрола нужен, чтобы показывал подсказку для отдельной ячейки или рядка. Взял код из примера — все работает, но с TTF_TRACK — никак, пробовал разные варианты.
Насколько я помню, там для CListCtrl иначе надо менять позицию встроенной подсказки. Ловим TTN_SHOW, и в ней делаем SetWindowPos для HWND тултипа на нужную точку.
Нечто вроде такого, в классе CListCtrl
//в карте
ON_NOTIFY(TTN_SHOW, 0, OnTTNShow)
void CMyListCtrl::OnTTNShow(NMHDR* pHDR, LRESULT* pResult)
{
//
HWND hwndTT=pHDR->hwndFrom;//это вроде как встроенный тултип для CListCtrl
::SetWindowPos(hwndTT,...);//переставляем тултип
}
Только я точно не помню, как именно я получал HWND встроенного тултипа. Может там надо было и через LVM_GETTOOLTIPS. Но это в принципе легко проверяемо по класса окна для полученного HWND.
Разве что где-то в документации говорилось, что можно пошалить с именно с
позицией тултипа. Но не с его
размерами. Т.е. передвинуть можно, а изменить размеры подсказки или саму подсказку уже поздняк метаться.
Ну и напоследок можно покопать в сторону LVN_GETINFOTIP, там все придет что нужно (номер строки, ячейки для которой показывается тултип).
PS: а вообще подменять встроенный тултип для CTreeCtrl\CListCtrl еще те танцы с бубнами. Как-то давно делал, чтобы увеличить задержку появления тултипа, дык напрыгался на каждый чих потом в коде. Там видать по уму надо чтоли как-то сабклассить встроенный тултип, и сам CListCtrl, и там баловаться. А то очень связанный код получается такого переделанного CListCtrl, потом его куда-то внедрять отдельно — занятие тяжкое. К примеру: есть у нас сторонний CSuperPuperListCtrl, который наследуется непосредственно от CListCtrl — и куда тут впихнуть в уже готовую иерархию наш модный CListCtrl с тултипом? А по хорошему некуда? Так что только сабклассинг. Геморроя конечно много, зато потом проще использовать будет.
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, freelsd, Вы писали:
F>>Щас полный вариант обработчика дам. Да, мне тултип для листконтрола нужен, чтобы показывал подсказку для отдельной ячейки или рядка. Взял код из примера — все работает, но с TTF_TRACK — никак, пробовал разные варианты.
C>Насколько я помню, там для CListCtrl иначе надо менять позицию встроенной подсказки. Ловим TTN_SHOW, и в ней делаем SetWindowPos для HWND тултипа на нужную точку.
C>Нечто вроде такого, в классе CListCtrl
C>C>//в карте
C>ON_NOTIFY(TTN_SHOW, 0, OnTTNShow)
C>void CMyListCtrl::OnTTNShow(NMHDR* pHDR, LRESULT* pResult)
C>{
C>//
C>HWND hwndTT=pHDR->hwndFrom;//это вроде как встроенный тултип для CListCtrl
C>::SetWindowPos(hwndTT,...);//переставляем тултип
C>}
C>
C>Только я точно не помню, как именно я получал HWND встроенного тултипа. Может там надо было и через LVM_GETTOOLTIPS. Но это в принципе легко проверяемо по класса окна для полученного HWND.
C>Разве что где-то в документации говорилось, что можно пошалить с именно с позицией тултипа. Но не с его размерами. Т.е. передвинуть можно, а изменить размеры подсказки или саму подсказку уже поздняк метаться.
C>Ну и напоследок можно покопать в сторону LVN_GETINFOTIP, там все придет что нужно (номер строки, ячейки для которой показывается тултип).
C>PS: а вообще подменять встроенный тултип для CTreeCtrl\CListCtrl еще те танцы с бубнами. Как-то давно делал, чтобы увеличить задержку появления тултипа, дык напрыгался на каждый чих потом в коде. Там видать по уму надо чтоли как-то сабклассить встроенный тултип, и сам CListCtrl, и там баловаться. А то очень связанный код получается такого переделанного CListCtrl, потом его куда-то внедрять отдельно — занятие тяжкое. К примеру: есть у нас сторонний CSuperPuperListCtrl, который наследуется непосредственно от CListCtrl — и куда тут впихнуть в уже готовую иерархию наш модный CListCtrl с тултипом? А по хорошему некуда? Так что только сабклассинг. Геморроя конечно много, зато потом проще использовать будет.
О спасибо большое за ответ, потому что не знал куда с этим приткнуться. Попробую через OnTTNShow. Я взел исходник из этого примера
http://www.codeproject.com/Articles/28885/CListCtrl-and-Displaying-a-Tooltip (
The CToolTipCtrl Member Variable), устанавливал флаг в TTF_TRACK и как только не пробовал в обработчике CListCtrl_OwnToolTipCtrl::OnMouseMove сделать чтобы все работало. Я так понимаю, копать нужно в другом месте, только нигде доступно ничего не наисано, чтобы можно было прочесть и понять, зато горы мануалов, где в общем-то одно и тоже повторяется. Жесть какая-то, сделать тултип то еще заданьице.