OVH Cloud OVH Cloud

Tooltip

4 réponses
Avatar
worried
Salut !

J'ai un contrôle listbox. Lorsque la souris passe dessus les éléments, je
voudrais que le nom de ceux-ci s'affichent dans un tooltip, par exemple, si le
nom de l'élément n'apparaît pas intégralement dans la listbox.

Le problème est que je ne trouve pas d'exemple de code simple (juste du C, pas
de .NET, de VB ou de MFC) qui illustre cela. On ne peux pas dire que les
exemples du MSDN concernant les tooltips soient très explicites non plus.

Faut-il sous-classer le contrôle listbox pour le message wm_mousemove ?
Quelqu'un a-t-il un exemple ?

Merci.
--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/

4 réponses

Avatar
Sundowne
'jour
j'utilise ceci

Private Sub ListView1_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
Dim ItmX As ListItem
Dim mo As Single

mo = X - (ListView1.ColumnHeaders(1).Width * Screen.TwipsPerPixelX)
If mo < 0 Then mo = X
Set ItmX = ListView1.HitTest(mo, Y)
If Not (ItmX Is Nothing) Then
ListView1.ToolTipText = ItmX.Text & " = " & ItmX.SubItems(1)
Exit Sub
End If
ListView1.ToolTipText = ""
End Sub

La sub détecte le mousemove sur la 1ére colonne dans mon cas.
Peut-être aura tu quelques adaptations à faire , mais le principe est
finalement simple.
@+


"worried" a écrit dans le message de
news:

Salut !

J'ai un contrôle listbox. Lorsque la souris passe dessus les éléments, je
voudrais que le nom de ceux-ci s'affichent dans un tooltip, par exemple,


si le
nom de l'élément n'apparaît pas intégralement dans la listbox.

Le problème est que je ne trouve pas d'exemple de code simple (juste du C,


pas
de .NET, de VB ou de MFC) qui illustre cela. On ne peux pas dire que les
exemples du MSDN concernant les tooltips soient très explicites non plus.

Faut-il sous-classer le contrôle listbox pour le message wm_mousemove ?
Quelqu'un a-t-il un exemple ?

Merci.
--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/


Avatar
patrox
Utilise le message LB_ITEMFROMPOINT suite a un MouseMove ensuite affiche ton
tool tip.

pat.


"worried" a écrit dans le message news:


Salut.

Tu m'as mal lu. Je ne souhaite pas de code VB mais du C. En VB tes


contrôles ont
des propriétés qu'ils n'ont pas en C :-). Par exemple, ma listbox n'a pas


de
tooltip associé. Bref, ça n' a rien à voir et souvent, il est difficile de
passer d'un code VB à C.

Le problème est simple. Si je crée un tooltip et que j'ajoute la listbox


comme
tool, je n'ai qu'un tooltip pour toute la listbox, je veux dire, c'est la


zone
entière de la listbox qui est prise en compte, donc comment prendre en


compte
quand la souris bouge dessus ? Impossible de trouver un code valable sur


le Net
concernant les add-in tooltips ou les tracking tooltips ! Même pas dans


les ngs
!

Donc, je passe par la ruse suivante. Je découpe la listbox en plusieurs


zones
rectangulaires que j'ajoute comme tool à mon tooltip. Problème, ils ne


recoivent
pas de message puisque la listbox les recouvre. le seul moyen que le


tooltip
recoive wm_mousemove est de sous-classer wm_mousemove pour la listbox. En


ce cas,
comment intimer l'odre au tooltip d'afficher quelque chose.


TTM_RELAYEVENT
semble n'avoir aucun effet.

En fait le chapitre tooltip du msdn est misérable. Truffé d'erreur et


vraiment
pas explicite. J'ai bien trouvé des exemples en c++, mais c'est avec MFC


et 500
lignes de code ou plus...




--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/


Avatar
Alexandre
Salut, voila comment je fais en VC++ MFC : Tu dérive une class listbox en
MyListBox par exemple :

Dans le .CPP:

Dans le BEGIN_MESSAGE_MAP ajoute :
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)



int CMyListBox::OnToolHitTest(CPoint point, TOOLINFO* pTI) const

{

int row;

RECT cellrect;

BOOL tmp = FALSE;

row = ItemFromPoint(point,tmp); //we call the ItemFromPoint function to
determine the row,

//note that in NT this function may fail use the ItemFromPointNT member
function

if ( row == -1 )

return -1;

//set up the TOOLINFO structure. GetItemRect(row,&cellrect);

GetItemRect(row,&cellrect);

pTI->rect = cellrect;

pTI->hwnd = m_hWnd;

pTI->uId = (UINT)((row)); //The 'uId' is assigned a value according to the
row value.

pTI->lpszText = LPSTR_TEXTCALLBACK; //Send a TTN_NEEDTEXT messages

return (int)pTI->uId;

}

BOOL CMyListBox::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )

{

POINT pt;

CRect rect;

GetCursorPos(&pt);

GetWindowRect(&rect);

// need to handle both ANSI and UNICODE versions of the message

TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;

TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;

CString strTipText;

// Tu peux remplir strTipText avec le texte que tu veux afficher en fonction
de l'id de l'item

// Par exemple :

CString num;

num.Format("Item numero : %i",nID);

strTipText=num;





#ifndef _UNICODE

if (pNMHDR->code == TTN_NEEDTEXTA)

lstrcpyn(pTTTA->szText, strTipText, 80);

else

_mbstowcsz(pTTTW->szText, strTipText, 80);

#else

if (pNMHDR->code == TTN_NEEDTEXTA)

_wcstombsz(pTTTA->szText, strTipText, 80);

else

lstrcpyn(pTTTW->szText, strTipText, 80);

#endif

*pResult = 0;

return TRUE;

}



Dans le .h , les prototypes :

virtual int OnToolHitTest(CPoint point, TOOLINFO* pTI) const;

BOOL OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult );
Avatar
Alexandre
J'ai oublié, ajoute ca dans le cpp pour utiliser les tooltips :

void CMyListBox::PreSubclassWindow()

{

EnableToolTips(TRUE);

CListBox::PreSubclassWindow();

}