Не могу поменять координаты всплывающей подсказки
От: freelsd  
Дата: 23.05.15 04:40
Оценка:
Вот собственно код и я не могу понять почему он не работает и что нужно сделать чтобы тултип отображался по заданным мной координатам относительно мышки.
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);
        }
Re: Не могу поменять координаты всплывающей подсказки
От: Carc Россия http://www.amlpages.com/home.php
Дата: 25.05.15 07:54
Оценка:
Здравствуйте, 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 в случае мышки.
Aml Pages Home
Re[2]: Не могу поменять координаты всплывающей подсказки
От: freelsd  
Дата: 25.05.15 16:51
Оценка:
Здравствуйте, 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);
}
Re[3]: Не могу поменять координаты всплывающей подсказки
От: Carc Россия http://www.amlpages.com/home.php
Дата: 25.05.15 17:20
Оценка:
Здравствуйте, 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 с тултипом? А по хорошему некуда? Так что только сабклассинг. Геморроя конечно много, зато потом проще использовать будет.
Aml Pages Home
Re[4]: Не могу поменять координаты всплывающей подсказки
От: freelsd  
Дата: 26.05.15 03:43
Оценка:
Здравствуйте, 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 сделать чтобы все работало. Я так понимаю, копать нужно в другом месте, только нигде доступно ничего не наисано, чтобы можно было прочесть и понять, зато горы мануалов, где в общем-то одно и тоже повторяется. Жесть какая-то, сделать тултип то еще заданьице.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.