Bonjour,
est-il possible d'écrire le texte d'un CToolTipCtrl sur plusieurs lignes (cas d'un texte un peu important, une centaine de caractères par exemple)
J'ai essayé avec un \n, mais ça ne marche pas.
merci par avance.
Bonjour,
est-il possible d'écrire le texte d'un CToolTipCtrl sur plusieurs lignes (cas d'un texte un peu important, une centaine de caractères par exemple)
J'ai essayé avec un \n, mais ça ne marche pas.
merci par avance.
salut,
le pb c'est que le tooltipctrl standard ne gere pas le multiligne (sauf si j'ai manqué quelque chose)![]()
pour ma part j'ai ete contraint de le gerer moi même.
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
j'ai trouvé sur codeproject un exemple de classe dérivée de CToolTipCtrl qui gère le multiline dans le OnPaint de la classe.
Je vais essayer ça.
le pb avec ça, c'est que le tooltip apparaît d'abord avec une seule ligne (une demi seconde), puis il est remplacé par le tooltip avec plusieurs lignes de texte.
voici le code utilisé :
.cpp
et le .h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247 // CMyToolTipCtrl.cpp : implementation file // #include "stdafx.h" #include "CMyToolTipCtrl.h" // CMyToolTipCtrl IMPLEMENT_DYNAMIC(CMyToolTipCtrl, CToolTipCtrl) CMyToolTipCtrl::CMyToolTipCtrl() { m_arrowColor=RGB(55, 10, 53); m_bkColor=RGB(255,255,255); m_leftColor=RGB(255, 210, 83); m_frameColor=RGB(155, 110, 53); m_textColor=RGB(0,0,0); } CMyToolTipCtrl::~CMyToolTipCtrl() { } BEGIN_MESSAGE_MAP(CMyToolTipCtrl, CToolTipCtrl) ON_WM_PAINT() ON_WM_ERASEBKGND() ON_WM_NCPAINT() END_MESSAGE_MAP() // CMyToolTipCtrl message handlers void CMyToolTipCtrl::PreSubclassWindow() { // ModifyStyle (WS_BORDER,0, 0); CWnd::PreSubclassWindow(); } void CMyToolTipCtrl::OnPaint() { POINT Pos; GetCursorPos(&Pos); CRect PRect; WindowFromPoint(Pos)->GetWindowRect(PRect); CPaintDC dc(this); // device context for painting CRect Rect,R1; CRect WRect; Orientations Orient=NW; BOOL Over=0,Left=0; Over=Pos.y >(PRect.top+(PRect.bottom-PRect.top)/2); Left=Pos.x <(PRect.left+(PRect.right-PRect.left)/2); if(Over & Left)Orient=NW; else if(Over & !Left)Orient=NE; else if(!Over & Left)Orient=SW; else if(!Over & !Left)Orient=SE; dc.SelectObject(GetFont()); CString Tip=_T(""),TStr=_T(""); GetWindowText(Tip); UINT Width=0; UINT Rows=1; UINT iPos=0; Tip.Replace(_T("\r"),_T("")); while(iPos<(UINT)Tip.GetLength()) { if(Tip.GetAt(iPos)=='\n') { CSize Sz1=dc.GetTextExtent(TStr); Width=(Width > (UINT)Sz1.cx) ? Width : (UINT)Sz1.cx; Rows+=1; TStr=_T(""); } else { TStr+=Tip.GetAt(iPos); } iPos++; } if(TStr.GetLength()) { CSize Sz1=dc.GetTextExtent(TStr); Width=(Width > (UINT)Sz1.cx) ? Width : (UINT)Sz1.cx; } if(Rows==1) { CSize Sz1=dc.GetTextExtent(Tip); Width=(Width > (UINT)Sz1.cx) ? Width : (UINT)Sz1.cx; } Width+=2; GetWindowRect(WRect); TEXTMETRIC TM; dc.GetTextMetrics(&TM); if(Over) { WRect.bottom=PRect.top; WRect.top=WRect.bottom-(Rows*(TM.tmHeight)+4); } else { WRect.top=PRect.bottom; WRect.bottom=WRect.top+(Rows*(TM.tmHeight)+4); } //UINT T=WRect.Width()-(20+Width); WRect.left=Pos.x; WRect.right=WRect.left+20+Width; if(WRect.right>GetSystemMetrics(SM_CXSCREEN)-25) { WRect.OffsetRect(-(WRect.right-(GetSystemMetrics(SM_CXSCREEN)-25)),0); } MoveWindow(&WRect,1); ShowWindow(1); GetClientRect(Rect); dc.FillSolidRect(Rect,m_bkColor); R1=Rect; R1.right=R1.left+15; dc.FillSolidRect(R1,m_leftColor); Rect.left=R1.right+1; dc.SetBkMode(TRANSPARENT); Rect.top+=1; UINT iT=(Rect.Width()-Width)/2; Rect.left+=iT; dc.SetTextColor(m_textColor); if(Rows==1) { dc.DrawText(Tip,Rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE); } else { dc.DrawText(Tip,Rect,DT_TOP|DT_LEFT|DT_WORDBREAK); } Rect.top-=1; Rect.left-=iT; GetClientRect(Rect); // Rect.InflateRect(1,1,1,1); dc.Draw3dRect(Rect,m_frameColor,m_frameColor); CPen Pen,*OldPen=0; Pen.CreatePen(PS_SOLID,1,m_arrowColor); OldPen=dc.SelectObject(&Pen); switch(Orient) { case SE: { CPoint ArrowPt=CPoint(R1.left+2,R1.top+2); POINT Pt[18]= { {ArrowPt.x, ArrowPt.y}, {ArrowPt.x, ArrowPt.y + 6}, {ArrowPt.x + 1, ArrowPt.y + 6}, {ArrowPt.x + 1, ArrowPt.y}, {ArrowPt.x + 6, ArrowPt.y}, {ArrowPt.x + 6, ArrowPt.y + 1}, {ArrowPt.x + 2, ArrowPt.y + 1}, {ArrowPt.x + 2, ArrowPt.y + 4}, {ArrowPt.x + 5, ArrowPt.y + 7}, {ArrowPt.x + 6, ArrowPt.y + 7}, {ArrowPt.x + 3, ArrowPt.y + 4}, {ArrowPt.x + 3, ArrowPt.y + 3}, {ArrowPt.x + 6, ArrowPt.y + 6}, {ArrowPt.x + 7, ArrowPt.y + 6}, {ArrowPt.x + 3, ArrowPt.y + 2}, {ArrowPt.x + 4, ArrowPt.y + 2}, {ArrowPt.x + 7, ArrowPt.y + 5}, {ArrowPt.x + 7, ArrowPt.y + 6} }; dc.Polyline(Pt,18); } break; case SW: { CPoint ArrowPt=CPoint(R1.right - 3, R1.top + 2); POINT Pt[18]= { {ArrowPt.x, ArrowPt.y}, {ArrowPt.x, ArrowPt.y + 6}, {ArrowPt.x - 1, ArrowPt.y + 6}, {ArrowPt.x - 1, ArrowPt.y}, {ArrowPt.x - 6, ArrowPt.y}, {ArrowPt.x - 6, ArrowPt.y + 1}, {ArrowPt.x - 2, ArrowPt.y + 1}, {ArrowPt.x - 2, ArrowPt.y + 4}, {ArrowPt.x - 5, ArrowPt.y + 7}, {ArrowPt.x - 6, ArrowPt.y + 7}, {ArrowPt.x - 3, ArrowPt.y + 4}, {ArrowPt.x - 3, ArrowPt.y + 3}, {ArrowPt.x - 6, ArrowPt.y + 6}, {ArrowPt.x - 7, ArrowPt.y + 6}, {ArrowPt.x - 3, ArrowPt.y + 2}, {ArrowPt.x - 4, ArrowPt.y + 2}, {ArrowPt.x - 7, ArrowPt.y + 5}, {ArrowPt.x - 7, ArrowPt.y + 6} }; dc.Polyline(Pt,18); } break; case NE: { CPoint ArrowPt=CPoint(R1.left+ 3, R1.bottom - 3); POINT Pt[18]= { {ArrowPt.x, ArrowPt.y}, {ArrowPt.x, ArrowPt.y - 6}, {ArrowPt.x + 1, ArrowPt.y - 6}, {ArrowPt.x + 1, ArrowPt.y}, {ArrowPt.x + 6, ArrowPt.y}, {ArrowPt.x + 6, ArrowPt.y - 1}, {ArrowPt.x + 2, ArrowPt.y - 1}, {ArrowPt.x + 2, ArrowPt.y - 4}, {ArrowPt.x + 5, ArrowPt.y - 7}, {ArrowPt.x + 6, ArrowPt.y - 7}, {ArrowPt.x + 3, ArrowPt.y - 4}, {ArrowPt.x + 3, ArrowPt.y - 3}, {ArrowPt.x + 6, ArrowPt.y - 6}, {ArrowPt.x + 7, ArrowPt.y - 6}, {ArrowPt.x + 3, ArrowPt.y - 2}, {ArrowPt.x + 4, ArrowPt.y - 2}, {ArrowPt.x + 7, ArrowPt.y - 5}, {ArrowPt.x + 7, ArrowPt.y - 6} }; dc.Polyline(Pt,18); } break; case NW: { CPoint ArrowPt=CPoint(R1.right- 3, R1.bottom - 3); POINT Pt[18]= { {ArrowPt.x, ArrowPt.y}, {ArrowPt.x, ArrowPt.y - 6}, {ArrowPt.x - 1, ArrowPt.y - 6}, {ArrowPt.x - 1, ArrowPt.y}, {ArrowPt.x - 6, ArrowPt.y}, {ArrowPt.x - 6, ArrowPt.y - 1}, {ArrowPt.x - 2, ArrowPt.y - 1}, {ArrowPt.x - 2, ArrowPt.y - 4}, {ArrowPt.x - 5, ArrowPt.y - 7}, {ArrowPt.x - 6, ArrowPt.y - 7}, {ArrowPt.x - 3, ArrowPt.y - 4}, {ArrowPt.x - 3, ArrowPt.y - 3}, {ArrowPt.x - 6, ArrowPt.y - 6}, {ArrowPt.x - 7, ArrowPt.y - 6}, {ArrowPt.x - 3, ArrowPt.y - 2}, {ArrowPt.x - 4, ArrowPt.y - 2}, {ArrowPt.x - 7, ArrowPt.y - 5}, {ArrowPt.x - 7, ArrowPt.y - 6} }; dc.Polyline(Pt,18); } break; }; dc.SelectObject(OldPen); Pen.DeleteObject(); } BOOL CMyToolTipCtrl::OnEraseBkgnd(CDC* pDC) { return CToolTipCtrl::OnEraseBkgnd(pDC); } void CMyToolTipCtrl::OnNcPaint() { }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #pragma once //Arrow drawing is ported from the FLATGUI version in Delphi. //You are free to use and modify this as long as you don`t claim it . //Copyright : Tomkat(.ro) 2004 class CMyToolTipCtrl : public CToolTipCtrl { DECLARE_DYNAMIC(CMyToolTipCtrl) enum Orientations { NW=1, NE, SW, SE, }; public: CMyToolTipCtrl(); virtual ~CMyToolTipCtrl(); protected: DECLARE_MESSAGE_MAP() virtual void PreSubclassWindow(); private: afx_msg void OnPaint(); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnNcPaint(); private: COLORREF m_bkColor;//=RGB(255,255,255); COLORREF m_leftColor;//=RGB(255, 210, 83); COLORREF m_frameColor;//=RGB(155, 110, 53); COLORREF m_textColor;//=RGB(0,0,0); COLORREF m_arrowColor;//=RGB(0,0,0); };
Une idée ?
le OnPaint se fait "trop tard".
En effet le premier affichage du tooltip est sur une seule ligne, et aprés c'est bon, il est bien multiligne.
Y a-t-il un message à intercepter pour ne pas faire le premiere affichage singleline ?
personne n'a une idée ?
Le code complet se trouve ici :
http://<br /> http://www.codeprojec...ipEx.asp<br />
salut,
le pb est expliqué plus bas sur le site.
rajoute ça a ton code (classwizard).
Note :effectivement le resultat est pas mal du tout .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 LRESULT CToolTipCtrlEx::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO : ajoutez ici votre code spécialisé et/ou l'appel de la classe de base switch ( message ) { case WM_PRINT: // eat this message, tooltips under XP / 2000 use WM_PRINT + WM_PRINTCLIENT to draw return 0; // if we eat this message, the WM_PRINTCLIENT will be skipped and WM_PAINT will be used break; // which is what we expect with our overloaded CToolTipCtrlEx - SLC case WM_PRINTCLIENT: return 0; // we should never get this... but just in case - SLC break; } return CToolTipCtrl::WindowProc( message, wParam, lParam ); }
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
Merci beaucoup,
mais je m'en veux de ne pas avoir regardé les posts plus bas du site![]()
Sinon, pour utiliser un tooltip normal (CToolTipCtrl) et le mettre en multiline (avc des \r ou \n), on peut utiliser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CToolTipCtrl::SetMaxTipWidth(int width)
Je viend d'utiliser ce "patch".
Cela solutionne le problème, mais uniquement en partie, puisque la première apparition du tooltip n'a plus lieu, et ce n'est qu'au 2ème passage de la souris sur le contrôle que le tooltip sera affiché.
tu es sur de ton coup ? ,cette fonction permet de fixer la largeur max du tooltip.Envoyé par olive_le_malin
![]()
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
MSDN:
et si on met des \n ou \r dans le texte du tooltip, ça utilise une autre ligne.The maximum tooltip width value does not indicate a tooltip window's actual width. Rather, if a tooltip string exceeds the maximum width, the control breaks the text into multiple lines, using spaces to determine line breaks. If the text cannot be segmented into multiple lines, it will be displayed on a single line. The length of this line may exceed the maximum tooltip width.
Donc en mettant une taille=500 (on est sûr que c'est + grand que le texte qu'on voudra rentrer), on pourra utiliser des \n ou \r pour faire des retours à la ligne.![]()
C'est peut-être pas prévu pour ça, mais ça marche (en tout cas sous W2000)
Partager