- Timestamp:
- Aug 6, 2000, 4:40:18 PM (25 years ago)
- Location:
- trunk/src/comctl32
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/toolbar.cpp
r3956 r3962 1 /* $Id: toolbar.cpp,v 1.8 2000-08-06 14:40:17 sandervl Exp $ */ 1 2 /* 2 3 * Toolbar control -
trunk/src/comctl32/tooltips.cpp
r3585 r3962 1 /* $Id: tooltips.cpp,v 1. 8 2000-05-22 17:25:12 cbratschiExp $ */1 /* $Id: tooltips.cpp,v 1.9 2000-08-06 14:40:18 sandervl Exp $ */ 2 2 /* 3 3 * Tool tip control … … 8 8 * 9 9 * TODO: 10 * - Unicode support (started). 10 11 * - Custom draw support. 11 12 * … … 15 16 * curtool.exe, deltool.exe, enumtools.exe, getinfo.exe, getiptxt.exe, 16 17 * hittest.exe, needtext.exe, newrect.exe, updtext.exe and winfrpt.exe. 18 * 19 * Timer logic. 20 * 21 * One important point to remember is that tools don't necessarily get 22 * a WM_MOUSEMOVE once the cursor leaves the tool, an example is when 23 * a tool sets TTF_IDISHWND (i.e. an entire window is a tool) because 24 * here WM_MOUSEMOVEs only get sent when the cursor is inside the 25 * client area. Therefore the only reliable way to know that the 26 * cursor has left a tool is to keep a timer running and check the 27 * position every time it expires. This is the role of timer 28 * ID_TIMERLEAVE. 29 * 30 * 31 * On entering a tool (detected in a relayed WM_MOUSEMOVE) we start 32 * ID_TIMERSHOW, if this times out and we're still in the tool we show 33 * the tip. On showing a tip we start both ID_TIMERPOP and 34 * ID_TIMERLEAVE. On hiding a tooltip we kill ID_TIMERPOP. 35 * ID_TIMERPOP is restarted on every relayed WM_MOUSEMOVE. If 36 * ID_TIMERPOP expires the tool is hidden and ID_TIMERPOP is killed. 37 * ID_TIMERLEAVE remains running - this is important as we need to 38 * determine when the cursor leaves the tool. 39 * 40 * When ID_TIMERLEAVE expires or on a relayed WM_MOUSEMOVE if we're 41 * still in the tool do nothing (apart from restart ID_TIMERPOP if 42 * this is a WM_MOUSEMOVE) (ID_TIMERLEAVE remains running). If we've 43 * left the tool and entered another one then hide the tip and start 44 * ID_TIMERSHOW with time ReshowTime and kill ID_TIMERLEAVE. If we're 45 * outside all tools hide the tip and kill ID_TIMERLEAVE. On Relayed 46 * mouse button messages hide the tip but leave ID_TIMERLEAVE running, 47 * this again will let us keep track of when the cursor leaves the 48 * tool. 49 * 50 * 51 * infoPtr->nTool is the tool the mouse was on on the last relayed MM 52 * or timer expiry or -1 if the mouse was not on a tool. 53 * 54 * infoPtr->nCurrentTool is the tool for which the tip is currently 55 * displaying text for or -1 if the tip is not shown. Actually this 56 * will only ever be infoPtr-nTool or -1, so it could be changed to a 57 * BOOL. 58 * 17 59 */ 18 60 19 61 /* 20 - Corel WINE 20000513 level 21 - (WINE 20000130 level) 62 - (WINE 20000801 level) 22 63 */ 23 64 24 65 #include <string.h> 25 66 67 #include "winnls.h" 26 68 #include "winbase.h" 27 69 #include "commctrl.h" … … 34 76 #define ID_TIMERLEAVE 3 /* tool leave timer */ 35 77 78 #ifdef __WIN32OS2__ 79 #define FIXME 80 #define TRACE 81 #define WARN 82 #define ERR 83 #define debugstr_w 84 #endif 36 85 37 86 extern LPSTR COMCTL32_aSubclass; /* global subclassing atom */ … … 45 94 TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 46 95 47 48 static VOID TOOLTIPS_Draw(HWND hwnd, HDC hdc)96 static VOID 97 TOOLTIPS_Refresh (HWND hwnd, HDC hdc) 49 98 { 50 99 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(hwnd); … … 55 104 UINT uFlags = DT_EXTERNALLEADING; 56 105 57 if (infoPtr->nMaxTipWidth > -1) uFlags |= DT_WORDBREAK; 58 if (GetWindowLongA(hwnd,GWL_STYLE) & TTS_NOPREFIX) uFlags |= DT_NOPREFIX; 59 GetClientRect(hwnd,&rc); 106 if (infoPtr->nMaxTipWidth > -1) 107 uFlags |= DT_WORDBREAK; 108 if (GetWindowLongA (hwnd, GWL_STYLE) & TTS_NOPREFIX) 109 uFlags |= DT_NOPREFIX; 110 GetClientRect (hwnd, &rc); 60 111 61 112 /* fill the background */ 62 hBrush = CreateSolidBrush (infoPtr->clrBk);63 FillRect (hdc,&rc,hBrush);64 DeleteObject (hBrush);113 hBrush = CreateSolidBrush (infoPtr->clrBk); 114 FillRect (hdc, &rc, hBrush); 115 DeleteObject (hBrush); 65 116 66 117 /* calculate text rectangle */ 67 rc.left += (2 +infoPtr->rcMargin.left);68 rc.top += (2 +infoPtr->rcMargin.top);69 rc.right -= (2 +infoPtr->rcMargin.right);70 rc.bottom -= (2 +infoPtr->rcMargin.bottom);118 rc.left += (2 + infoPtr->rcMargin.left); 119 rc.top += (2 + infoPtr->rcMargin.top); 120 rc.right -= (2 + infoPtr->rcMargin.right); 121 rc.bottom -= (2 + infoPtr->rcMargin.bottom); 71 122 72 123 /* draw text */ 73 oldBkMode = SetBkMode(hdc,TRANSPARENT); 74 SetTextColor(hdc,infoPtr->clrText); 75 hOldFont = SelectObject(hdc,infoPtr->hFont); 76 DrawTextW(hdc,infoPtr->szTipText,-1,&rc,uFlags); 77 SelectObject(hdc,hOldFont); 78 if (oldBkMode != TRANSPARENT) SetBkMode(hdc,oldBkMode); 79 } 80 81 static VOID TOOLTIPS_GetCallbackText(HWND hwnd,TOOLTIPS_INFO *infoPtr,TTTOOL_INFO *toolPtr) 82 { 83 if (isUnicodeNotify(&infoPtr->header)) 84 { 85 NMTTDISPINFOW ttnmdi; 86 87 /* fill NMHDR struct */ 88 ZeroMemory (&ttnmdi,sizeof(NMTTDISPINFOW)); 89 ttnmdi.hdr.hwndFrom = hwnd; 90 ttnmdi.hdr.idFrom = toolPtr->uId; 91 ttnmdi.hdr.code = TTN_GETDISPINFOW; 92 ttnmdi.lpszText = (WCHAR*)&ttnmdi.szText; 93 ttnmdi.uFlags = toolPtr->uFlags; 94 ttnmdi.lParam = toolPtr->lParam; 95 SendMessageA(toolPtr->hwnd,WM_NOTIFY,(WPARAM)toolPtr->uId,(LPARAM)&ttnmdi); 96 97 if ((ttnmdi.hinst) && (HIWORD((UINT)ttnmdi.lpszText) == 0)) 98 { 99 LoadStringW(ttnmdi.hinst,(UINT)ttnmdi.lpszText,infoPtr->szTipText,INFOTIPSIZE); 100 if (ttnmdi.uFlags & TTF_DI_SETITEM) 101 { 102 toolPtr->hinst = ttnmdi.hinst; 103 toolPtr->lpszText = (LPWSTR)ttnmdi.lpszText; 104 } 105 } else 106 { 107 if (ttnmdi.lpszText != LPSTR_TEXTCALLBACKW) 108 { 109 if (!HIWORD(ttnmdi.lpszText) && (ttnmdi.lpszText != NULL)) 110 { 111 //error 112 infoPtr->szTipText[0] = '\0'; 113 return; 114 } 115 lstrcpynW(infoPtr->szTipText,ttnmdi.lpszText,INFOTIPSIZE); 116 if (ttnmdi.uFlags & TTF_DI_SETITEM) 117 { 118 INT len = lstrlenW(ttnmdi.lpszText); 119 toolPtr->hinst = 0; 120 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc((len+1)*sizeof(WCHAR)); 121 lstrcpyW(toolPtr->lpszText,ttnmdi.lpszText); 122 } 123 } else 124 { 125 //ERR (tooltips, "recursive text callback!\n"); 126 infoPtr->szTipText[0] = '\0'; 127 } 128 } 129 } else 130 { 131 NMTTDISPINFOA ttnmdi; 132 133 /* fill NMHDR struct */ 134 ZeroMemory (&ttnmdi,sizeof(NMTTDISPINFOA)); 135 ttnmdi.hdr.hwndFrom = hwnd; 136 ttnmdi.hdr.idFrom = toolPtr->uId; 137 ttnmdi.hdr.code = TTN_GETDISPINFOA; 138 ttnmdi.lpszText = (CHAR*)&ttnmdi.szText; 139 ttnmdi.uFlags = toolPtr->uFlags; 140 ttnmdi.lParam = toolPtr->lParam; 141 SendMessageA(toolPtr->hwnd,WM_NOTIFY,(WPARAM)toolPtr->uId,(LPARAM)&ttnmdi); 142 143 if ((ttnmdi.hinst) && (HIWORD((UINT)ttnmdi.lpszText) == 0)) 144 { 145 LoadStringW(ttnmdi.hinst,(UINT)ttnmdi.lpszText,infoPtr->szTipText,INFOTIPSIZE); 146 if (ttnmdi.uFlags & TTF_DI_SETITEM) 147 { 148 toolPtr->hinst = ttnmdi.hinst; 149 toolPtr->lpszText = (LPWSTR)ttnmdi.lpszText; 150 } 151 } else 152 { 153 if (ttnmdi.lpszText != LPSTR_TEXTCALLBACKA) 154 { 155 if (!HIWORD(ttnmdi.lpszText) && (ttnmdi.lpszText != NULL)) 156 { 157 //error 158 infoPtr->szTipText[0] = '\0'; 159 return; 160 } 161 lstrcpynAtoW(infoPtr->szTipText,ttnmdi.lpszText,INFOTIPSIZE); 162 if (ttnmdi.uFlags & TTF_DI_SETITEM) 163 { 164 INT len = lstrlenA(ttnmdi.lpszText); 165 toolPtr->hinst = 0; 166 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc((len+1)*sizeof(WCHAR)); 167 lstrcpyAtoW(toolPtr->lpszText,ttnmdi.lpszText); 168 } 169 } else 170 { 171 //ERR (tooltips, "recursive text callback!\n"); 172 infoPtr->szTipText[0] = '\0'; 173 } 174 } 175 } 176 } 177 178 static VOID TOOLTIPS_GetTipText(HWND hwnd,TOOLTIPS_INFO *infoPtr,INT nTool) 124 oldBkMode = SetBkMode (hdc, TRANSPARENT); 125 SetTextColor (hdc, infoPtr->clrText); 126 hOldFont = SelectObject (hdc, infoPtr->hFont); 127 DrawTextW (hdc, infoPtr->szTipText, -1, &rc, uFlags); 128 SelectObject (hdc, hOldFont); 129 if (oldBkMode != TRANSPARENT) 130 SetBkMode (hdc, oldBkMode); 131 } 132 133 134 static VOID 135 TOOLTIPS_GetTipText (HWND hwnd, TOOLTIPS_INFO *infoPtr, INT nTool) 179 136 { 180 137 TTTOOL_INFO *toolPtr = &infoPtr->tools[nTool]; 181 138 182 if ((toolPtr->hinst) && (HIWORD((UINT)toolPtr->lpszText) == 0)) 183 { 184 /* load a resource */ 185 186 LoadStringW(toolPtr->hinst,(UINT)toolPtr->lpszText,infoPtr->szTipText,INFOTIPSIZE); 187 } else if (toolPtr->lpszText) 188 { 189 if (toolPtr->lpszText == LPSTR_TEXTCALLBACKW) 190 TOOLTIPS_GetCallbackText(hwnd,infoPtr,toolPtr); 191 else 192 { 193 /* the item is a usual (unicode) text */ 194 lstrcpynW(infoPtr->szTipText,toolPtr->lpszText,INFOTIPSIZE); 195 } 196 } else 197 { 198 /* no text available */ 199 infoPtr->szTipText[0] = '\0'; 200 } 201 } 202 203 static VOID 204 TOOLTIPS_CalcTipRect (HWND hwnd,TOOLTIPS_INFO *infoPtr,TTTOOL_INFO *toolPtr,LPRECT lpRect) 205 { 206 HDC hdc; 207 HFONT hOldFont; 208 UINT uFlags = DT_EXTERNALLEADING | DT_CALCRECT; 209 RECT rc = {0,0,0,0}; 210 SIZE size; 211 212 if (infoPtr->nMaxTipWidth > -1) 213 { 214 rc.right = infoPtr->nMaxTipWidth; 215 uFlags |= DT_WORDBREAK; 216 } 217 if (GetWindowLongA(hwnd,GWL_STYLE) & TTS_NOPREFIX) uFlags |= DT_NOPREFIX; 218 //TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText)); 219 220 hdc = GetDC(hwnd); 221 hOldFont = SelectObject(hdc,infoPtr->hFont); 222 DrawTextW(hdc,infoPtr->szTipText,-1,&rc,uFlags); 223 SelectObject(hdc,hOldFont); 224 ReleaseDC(hwnd,hdc); 225 226 size.cx = rc.right-rc.left+4+infoPtr->rcMargin.left+infoPtr->rcMargin.right; 227 size.cy = rc.bottom-rc.top+4+infoPtr->rcMargin.bottom+infoPtr->rcMargin.top; 228 229 if (toolPtr->uFlags & TTF_ABSOLUTE) 230 { 231 rc.left = infoPtr->xTrackPos; 232 rc.top = infoPtr->yTrackPos; 233 234 if (toolPtr->uFlags & TTF_ALIGNMASK) 235 { 236 //CB: Odin only (Win32 does something similar but with an undocumented mechanism) 237 238 if (toolPtr->uFlags & TTF_ALIGNLEFT) 239 rc.left -= size.cx; 240 else if (toolPtr->uFlags & TTF_HCENTER) 241 rc.left -= size.cx/2; 242 243 if (toolPtr->uFlags & TTF_ALIGNTOP) 244 rc.top -= size.cy; 245 else if (toolPtr->uFlags & TTF_VCENTER) 246 rc.top -= size.cy/2; 247 248 } else 249 { 250 if (toolPtr->uFlags & TTF_CENTERTIP) 251 { 252 rc.left -= (size.cx/2); 253 rc.top -= (size.cy/2); 254 } 255 } 256 } else 257 { 258 RECT rcTool; 259 260 if (toolPtr->uFlags & TTF_IDISHWND) 261 { 262 GetWindowRect((HWND)toolPtr->uId,&rcTool); //screen coordinates 263 } else 264 { 265 rcTool = toolPtr->rect; 266 MapWindowPoints(toolPtr->hwnd,(HWND)0,(LPPOINT)&rcTool,2); 267 } 268 269 if (toolPtr->uFlags & TTF_CENTERTIP) 270 { 271 if (infoPtr->bTrackActive) 272 { 273 GetCursorPos((LPPOINT)&rc); 274 rc.top += 20; 275 rc.left -= (size.cx / 2); 276 rc.top -= (size.cy / 2); 277 } else 278 { 279 rc.left = (rcTool.left + rcTool.right-size.cx)/ 2; 280 rc.top = rcTool.bottom+2; 281 } 282 283 } else 284 { 285 GetCursorPos((LPPOINT)&rc); 286 rc.top += 20; 287 } 288 289 /* smart placement */ 290 if (infoPtr->bTrackActive) 291 { 292 if ((rc.left + size.cx > rcTool.left) && (rc.left < rcTool.right) && 293 (rc.top + size.cy > rcTool.top) && (rc.top < rcTool.bottom)) 294 rc.left = rcTool.right; 295 } 296 } 297 298 //TRACE (tooltips, "pos %d - %d\n", rect.left, rect.top); 299 300 rc.right = rc.left+size.cx; 301 rc.bottom = rc.top+size.cy; 302 303 AdjustWindowRectEx (&rc,GetWindowLongA(hwnd,GWL_STYLE), 304 FALSE,GetWindowLongA(hwnd,GWL_EXSTYLE)); 305 306 *lpRect = rc; 307 } 139 if ((toolPtr->hinst) && (HIWORD((UINT)toolPtr->lpszText) == 0)) { 140 /* load a resource */ 141 TRACE("load res string %x %x\n", 142 toolPtr->hinst, (int)toolPtr->lpszText); 143 LoadStringW (toolPtr->hinst, (UINT)toolPtr->lpszText, 144 infoPtr->szTipText, INFOTIPSIZE); 145 } 146 else if (toolPtr->lpszText) { 147 if (toolPtr->lpszText == LPSTR_TEXTCALLBACKW) { 148 NMTTDISPINFOA ttnmdi; 149 150 /* fill NMHDR struct */ 151 ZeroMemory (&ttnmdi, sizeof(NMTTDISPINFOA)); 152 ttnmdi.hdr.hwndFrom = hwnd; 153 ttnmdi.hdr.idFrom = toolPtr->uId; 154 ttnmdi.hdr.code = TTN_GETDISPINFOA; 155 ttnmdi.lpszText = (LPSTR)&ttnmdi.szText; 156 ttnmdi.uFlags = toolPtr->uFlags; 157 ttnmdi.lParam = toolPtr->lParam; 158 159 TRACE("hdr.idFrom = %x\n", ttnmdi.hdr.idFrom); 160 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 161 (WPARAM)toolPtr->uId, (LPARAM)&ttnmdi); 162 163 if ((ttnmdi.hinst) && (HIWORD((UINT)ttnmdi.lpszText) == 0)) { 164 LoadStringW (ttnmdi.hinst, (UINT)ttnmdi.lpszText, 165 infoPtr->szTipText, INFOTIPSIZE); 166 if (ttnmdi.uFlags & TTF_DI_SETITEM) { 167 toolPtr->hinst = ttnmdi.hinst; 168 toolPtr->lpszText = (LPWSTR)ttnmdi.lpszText; 169 } 170 } 171 else if (ttnmdi.szText[0]) { 172 MultiByteToWideChar(CP_ACP, 0, ttnmdi.szText, 80, 173 infoPtr->szTipText, INFOTIPSIZE); 174 if (ttnmdi.uFlags & TTF_DI_SETITEM) { 175 INT len = MultiByteToWideChar(CP_ACP, 0, ttnmdi.szText, 176 80, NULL, 0); 177 toolPtr->hinst = 0; 178 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc (len * sizeof(WCHAR)); 179 MultiByteToWideChar(CP_ACP, 0, ttnmdi.szText, 80, 180 toolPtr->lpszText, len); 181 } 182 } 183 else if (ttnmdi.lpszText == 0) { 184 /* no text available */ 185 infoPtr->szTipText[0] = L'\0'; 186 } 187 else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACKA) { 188 MultiByteToWideChar(CP_ACP, 0, ttnmdi.lpszText, -1, 189 infoPtr->szTipText, INFOTIPSIZE); 190 if (ttnmdi.uFlags & TTF_DI_SETITEM) { 191 INT len = MultiByteToWideChar(CP_ACP, 0, ttnmdi.lpszText, 192 -1, NULL, 0); 193 toolPtr->hinst = 0; 194 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc (len * sizeof(WCHAR)); 195 MultiByteToWideChar(CP_ACP, 0, ttnmdi.lpszText, -1, 196 toolPtr->lpszText, len); 197 } 198 } 199 else { 200 ERR("recursive text callback!\n"); 201 infoPtr->szTipText[0] = '\0'; 202 } 203 } 204 else { 205 /* the item is a usual (unicode) text */ 206 lstrcpynW (infoPtr->szTipText, toolPtr->lpszText, INFOTIPSIZE); 207 } 208 } 209 else { 210 /* no text available */ 211 infoPtr->szTipText[0] = L'\0'; 212 } 213 214 // TRACE("%s\n", debugstr_w(infoPtr->szTipText)); 215 } 216 308 217 309 218 static VOID … … 316 225 317 226 if (infoPtr->nMaxTipWidth > -1) { 318 319 227 rc.right = infoPtr->nMaxTipWidth; 228 uFlags |= DT_WORDBREAK; 320 229 } 321 230 if (GetWindowLongA (hwnd, GWL_STYLE) & TTS_NOPREFIX) 322 323 //TRACE("\"%s\"\n", debugstr_w(infoPtr->szTipText));231 uFlags |= DT_NOPREFIX; 232 TRACE("%s\n", debugstr_w(infoPtr->szTipText)); 324 233 325 234 hdc = GetDC (hwnd); … … 329 238 ReleaseDC (hwnd, hdc); 330 239 331 lpSize->cx = rc.right - rc.left + 4 + 332 240 lpSize->cx = rc.right - rc.left + 4 + 241 infoPtr->rcMargin.left + infoPtr->rcMargin.right; 333 242 lpSize->cy = rc.bottom - rc.top + 4 + 334 infoPtr->rcMargin.bottom + infoPtr->rcMargin.top; 335 } 243 infoPtr->rcMargin.bottom + infoPtr->rcMargin.top; 244 } 245 336 246 337 247 static VOID … … 341 251 RECT rect, wndrect; 342 252 SIZE size; 343 HDC hdc;344 253 NMHDR hdr; 345 254 346 255 if (infoPtr->nTool == -1) { 347 //TRACE("invalid tool (-1)!\n");348 256 TRACE("invalid tool (-1)!\n"); 257 return; 349 258 } 350 259 351 260 infoPtr->nCurrentTool = infoPtr->nTool; 352 261 353 // TRACE("Show tooltip pre %d!\n", infoPtr->nTool);262 TRACE("Show tooltip pre %d! (%04x)\n", infoPtr->nTool, hwnd); 354 263 355 264 TOOLTIPS_GetTipText (hwnd, infoPtr, infoPtr->nCurrentTool); 356 265 357 266 if (infoPtr->szTipText[0] == L'\0') { 358 359 360 } 361 362 //TRACE("Show tooltip %d!\n", infoPtr->nCurrentTool);267 infoPtr->nCurrentTool = -1; 268 return; 269 } 270 271 TRACE("Show tooltip %d!\n", infoPtr->nCurrentTool); 363 272 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; 364 273 … … 367 276 hdr.code = TTN_SHOW; 368 277 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 369 370 371 // TRACE("\"%s\"\n", debugstr_w(infoPtr->szTipText));278 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 279 280 TRACE("%s\n", debugstr_w(infoPtr->szTipText)); 372 281 373 282 TOOLTIPS_CalcTipSize (hwnd, infoPtr, &size); 374 //TRACE("size %d - %d\n", size.cx, size.cy);283 TRACE("size %d - %d\n", size.cx, size.cy); 375 284 376 285 if (toolPtr->uFlags & TTF_CENTERTIP) { 377 378 379 380 381 382 383 384 385 386 286 RECT rc; 287 288 if (toolPtr->uFlags & TTF_IDISHWND) 289 GetWindowRect ((HWND)toolPtr->uId, &rc); 290 else { 291 rc = toolPtr->rect; 292 MapWindowPoints (toolPtr->hwnd, (HWND)0, (LPPOINT)&rc, 2); 293 } 294 rect.left = (rc.left + rc.right - size.cx) / 2; 295 rect.top = rc.bottom + 2; 387 296 } 388 297 else { 389 390 391 } 392 393 //TRACE("pos %d - %d\n", rect.left, rect.top);298 GetCursorPos ((LPPOINT)&rect); 299 rect.top += 20; 300 } 301 302 TRACE("pos %d - %d\n", rect.left, rect.top); 394 303 395 304 rect.right = rect.left + size.cx; … … 399 308 wndrect.right = GetSystemMetrics( SM_CXSCREEN ); 400 309 if( rect.right > wndrect.right ) { 401 402 310 rect.left -= rect.right - wndrect.right + 2; 311 rect.right = wndrect.right - 2; 403 312 } 404 313 wndrect.bottom = GetSystemMetrics( SM_CYSCREEN ); … … 406 315 RECT rc; 407 316 408 409 410 411 412 413 } 414 415 317 if (toolPtr->uFlags & TTF_IDISHWND) 318 GetWindowRect ((HWND)toolPtr->uId, &rc); 319 else { 320 rc = toolPtr->rect; 321 MapWindowPoints (toolPtr->hwnd, (HWND)0, (LPPOINT)&rc, 2); 322 } 323 rect.bottom = rc.top - 2; 324 rect.top = rect.bottom - size.cy; 416 325 } 417 326 418 327 AdjustWindowRectEx (&rect, GetWindowLongA (hwnd, GWL_STYLE), 419 328 FALSE, GetWindowLongA (hwnd, GWL_EXSTYLE)); 420 329 421 330 SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, 422 423 331 rect.right - rect.left, rect.bottom - rect.top, 332 SWP_SHOWWINDOW | SWP_NOACTIVATE); 424 333 425 334 /* repaint the tooltip */ 426 hdc = GetDC (hwnd); 427 TOOLTIPS_Draw(hwnd, hdc); 428 ReleaseDC (hwnd, hdc); 335 InvalidateRect(hwnd, NULL, TRUE); 336 UpdateWindow(hwnd); 429 337 430 338 SetTimer (hwnd, ID_TIMERPOP, infoPtr->nAutoPopTime, 0); 339 TRACE("timer 2 started!\n"); 340 SetTimer (hwnd, ID_TIMERLEAVE, infoPtr->nReshowTime, 0); 341 TRACE("timer 3 started!\n"); 431 342 } 432 343 … … 438 349 NMHDR hdr; 439 350 351 TRACE("Hide tooltip %d! (%04x)\n", infoPtr->nCurrentTool, hwnd); 352 440 353 if (infoPtr->nCurrentTool == -1) 441 354 return; 442 355 443 356 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; 444 //TRACE (tooltips, "Hide tooltip %d!\n", infoPtr->nCurrentTool);445 357 KillTimer (hwnd, ID_TIMERPOP); 446 358 … … 449 361 hdr.code = TTN_POP; 450 362 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 451 363 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 452 364 453 365 infoPtr->nCurrentTool = -1; 454 366 455 367 SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, 456 368 SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE); 457 369 } 458 370 … … 463 375 TTTOOL_INFO *toolPtr; 464 376 RECT rect; 465 HDC hdc;377 SIZE size; 466 378 NMHDR hdr; 467 379 468 if (infoPtr->nTrackTool == -1) 469 { 470 //TRACE (tooltips, "invalid tracking tool (-1)!\n"); 471 return; 472 } 473 474 //TRACE (tooltips, "show tracking tooltip pre %d!\n", infoPtr->nTrackTool); 475 476 TOOLTIPS_GetTipText(hwnd,infoPtr,infoPtr->nTrackTool); 477 478 if (infoPtr->szTipText[0] == '\0') 479 { 480 infoPtr->nTrackTool = -1; 481 return; 482 } 483 484 //TRACE (tooltips, "show tracking tooltip %d!\n", infoPtr->nTrackTool); 380 if (infoPtr->nTrackTool == -1) { 381 TRACE("invalid tracking tool (-1)!\n"); 382 return; 383 } 384 385 TRACE("show tracking tooltip pre %d!\n", infoPtr->nTrackTool); 386 387 TOOLTIPS_GetTipText (hwnd, infoPtr, infoPtr->nTrackTool); 388 389 if (infoPtr->szTipText[0] == L'\0') { 390 infoPtr->nTrackTool = -1; 391 return; 392 } 393 394 TRACE("show tracking tooltip %d!\n", infoPtr->nTrackTool); 485 395 toolPtr = &infoPtr->tools[infoPtr->nTrackTool]; 486 396 … … 488 398 hdr.idFrom = toolPtr->uId; 489 399 hdr.code = TTN_SHOW; 490 SendMessageA(toolPtr->hwnd,WM_NOTIFY,(WPARAM)toolPtr->uId,(LPARAM)&hdr); 491 492 //TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText)); 493 494 TOOLTIPS_CalcTipRect(hwnd,infoPtr,toolPtr,&rect); 495 496 SetWindowPos (hwnd,HWND_TOP,rect.left,rect.top, 497 rect.right-rect.left,rect.bottom-rect.top, 498 SWP_SHOWWINDOW | SWP_NOACTIVATE ); 499 500 hdc = GetDC (hwnd); 501 TOOLTIPS_Draw(hwnd, hdc); 502 ReleaseDC (hwnd, hdc); 400 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 401 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 402 403 TRACE("%s\n", debugstr_w(infoPtr->szTipText)); 404 405 TOOLTIPS_CalcTipSize (hwnd, infoPtr, &size); 406 TRACE("size %d - %d\n", size.cx, size.cy); 407 408 if (toolPtr->uFlags & TTF_ABSOLUTE) { 409 rect.left = infoPtr->xTrackPos; 410 rect.top = infoPtr->yTrackPos; 411 412 if (toolPtr->uFlags & TTF_CENTERTIP) { 413 rect.left -= (size.cx / 2); 414 rect.top -= (size.cy / 2); 415 } 416 } 417 else { 418 RECT rcTool; 419 420 if (toolPtr->uFlags & TTF_IDISHWND) 421 GetWindowRect ((HWND)toolPtr->uId, &rcTool); 422 else { 423 rcTool = toolPtr->rect; 424 MapWindowPoints (toolPtr->hwnd, (HWND)0, (LPPOINT)&rcTool, 2); 425 } 426 427 GetCursorPos ((LPPOINT)&rect); 428 rect.top += 20; 429 430 if (toolPtr->uFlags & TTF_CENTERTIP) { 431 rect.left -= (size.cx / 2); 432 rect.top -= (size.cy / 2); 433 } 434 435 /* smart placement */ 436 if ((rect.left + size.cx > rcTool.left) && (rect.left < rcTool.right) && 437 (rect.top + size.cy > rcTool.top) && (rect.top < rcTool.bottom)) 438 rect.left = rcTool.right; 439 } 440 441 TRACE("pos %d - %d\n", rect.left, rect.top); 442 443 rect.right = rect.left + size.cx; 444 rect.bottom = rect.top + size.cy; 445 446 AdjustWindowRectEx (&rect, GetWindowLongA (hwnd, GWL_STYLE), 447 FALSE, GetWindowLongA (hwnd, GWL_EXSTYLE)); 448 449 SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, 450 rect.right - rect.left, rect.bottom - rect.top, 451 SWP_SHOWWINDOW | SWP_NOACTIVATE ); 452 453 InvalidateRect(hwnd, NULL, TRUE); 454 UpdateWindow(hwnd); 503 455 } 504 456 … … 511 463 512 464 if (infoPtr->nTrackTool == -1) 513 465 return; 514 466 515 467 toolPtr = &infoPtr->tools[infoPtr->nTrackTool]; 516 // TRACE (tooltips,"hide tracking tooltip %d!\n", infoPtr->nTrackTool);468 TRACE("hide tracking tooltip %d!\n", infoPtr->nTrackTool); 517 469 518 470 hdr.hwndFrom = hwnd; … … 520 472 hdr.code = TTN_POP; 521 473 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 522 474 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 523 475 524 476 SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, 525 477 SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE); 526 478 } 527 479 … … 534 486 535 487 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 536 537 538 if (!(toolPtr->uFlags & TTF_IDISHWND) && 539 540 541 488 toolPtr = &infoPtr->tools[nTool]; 489 490 if (!(toolPtr->uFlags & TTF_IDISHWND) && 491 (lpToolInfo->hwnd == toolPtr->hwnd) && 492 (lpToolInfo->uId == toolPtr->uId)) 493 return nTool; 542 494 } 543 495 544 496 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 545 546 547 548 549 497 toolPtr = &infoPtr->tools[nTool]; 498 499 if ((toolPtr->uFlags & TTF_IDISHWND) && 500 (lpToolInfo->uId == toolPtr->uId)) 501 return nTool; 550 502 } 551 503 … … 561 513 562 514 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 563 564 565 if (!(toolPtr->uFlags & TTF_IDISHWND) && 566 567 568 515 toolPtr = &infoPtr->tools[nTool]; 516 517 if (!(toolPtr->uFlags & TTF_IDISHWND) && 518 (lpToolInfo->hwnd == toolPtr->hwnd) && 519 (lpToolInfo->uId == toolPtr->uId)) 520 return nTool; 569 521 } 570 522 571 523 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 572 573 574 575 576 524 toolPtr = &infoPtr->tools[nTool]; 525 526 if ((toolPtr->uFlags & TTF_IDISHWND) && 527 (lpToolInfo->uId == toolPtr->uId)) 528 return nTool; 577 529 } 578 530 … … 587 539 INT nTool; 588 540 589 //@@@AH 2000/02/25 make sure we don't get garbage in590 if (!infoPtr)591 {592 dprintf(("Tooltips:GetToolFromPoint: infoPtr == NULL!!!\n"));593 return 0;594 }595 596 541 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 597 598 599 600 601 602 603 604 605 542 toolPtr = &infoPtr->tools[nTool]; 543 544 if (!(toolPtr->uFlags & TTF_IDISHWND)) { 545 if (hwnd != toolPtr->hwnd) 546 continue; 547 if (!PtInRect (&toolPtr->rect, *lpPt)) 548 continue; 549 return nTool; 550 } 606 551 } 607 552 608 553 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 609 610 611 612 613 614 554 toolPtr = &infoPtr->tools[nTool]; 555 556 if (toolPtr->uFlags & TTF_IDISHWND) { 557 if ((HWND)toolPtr->uId == hwnd) 558 return nTool; 559 } 615 560 } 616 561 617 562 return -1; 618 }619 620 621 static INT622 TOOLTIPS_GetToolFromMessage (TOOLTIPS_INFO *infoPtr, HWND hwndTool)623 {624 DWORD dwPos;625 POINT pt;626 627 dwPos = GetMessagePos ();628 pt.x = (INT)LOWORD(dwPos);629 pt.y = (INT)HIWORD(dwPos);630 ScreenToClient (hwndTool, &pt);631 632 return TOOLTIPS_GetToolFromPoint (infoPtr, hwndTool, &pt);633 563 } 634 564 … … 639 569 HWND hwndActive = GetActiveWindow (); 640 570 if (!hwndActive) 641 571 return FALSE; 642 572 if (hwndActive == hwnd) 643 573 return TRUE; 644 574 return IsChild (hwndActive, hwnd); 645 575 } … … 657 587 hwndTool = SendMessageA (hwnd, TTM_WINDOWFROMPOINT, 0, (LPARAM)&pt); 658 588 if (hwndTool == 0) 659 589 return -1; 660 590 661 591 ScreenToClient (hwndTool, &pt); 662 592 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, hwndTool, &pt); 663 593 if (nTool == -1) 664 594 return -1; 665 595 666 596 if (!(GetWindowLongA (hwnd, GWL_STYLE) & TTS_ALWAYSTIP) && bShowTest) { 667 if (!TOOLTIPS_IsWindowActive (GetWindow (hwnd, GW_OWNER))) 668 return -1; 669 } 597 if (!TOOLTIPS_IsWindowActive (GetWindow (hwnd, GW_OWNER))) 598 return -1; 599 } 600 601 TRACE("tool %d\n", nTool); 670 602 671 603 return nTool; … … 676 608 TOOLTIPS_Activate (HWND hwnd, WPARAM wParam, LPARAM lParam) 677 609 { 678 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);610 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 679 611 680 612 infoPtr->bActive = (BOOL)wParam; 681 613 614 if (infoPtr->bActive) 615 TRACE("activate!\n"); 616 682 617 if (!(infoPtr->bActive) && (infoPtr->nCurrentTool != -1)) 683 TOOLTIPS_Hide (hwnd, infoPtr); 684 685 return 0; 686 } 687 688 689 static VOID TOOLTIPS_Subclass(HWND hwnd,TTTOOL_INFO *toolPtr) 690 { 691 if (toolPtr->uFlags & TTF_SUBCLASS) 692 { 693 if (toolPtr->uFlags & TTF_IDISHWND) 694 { 695 LPTT_SUBCLASS_INFO lpttsi = 696 (LPTT_SUBCLASS_INFO)GetPropA((HWND)toolPtr->uId,COMCTL32_aSubclass); 697 if (lpttsi == NULL) 698 { 699 lpttsi = (LPTT_SUBCLASS_INFO)COMCTL32_Alloc(sizeof(TT_SUBCLASS_INFO)); 700 lpttsi->wpOrigProc = 701 (WNDPROC)SetWindowLongA ((HWND)toolPtr->uId, 702 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc); 703 lpttsi->hwndToolTip = hwnd; 704 lpttsi->uRefCount++; 705 SetPropA ((HWND)toolPtr->uId,COMCTL32_aSubclass,(HANDLE)lpttsi); 706 } 707 // else 708 // WARN (tooltips, "A window tool must only be listed once!\n"); 709 } else 710 { 711 LPTT_SUBCLASS_INFO lpttsi = 712 (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 713 if (lpttsi == NULL) 714 { 715 lpttsi = (LPTT_SUBCLASS_INFO)COMCTL32_Alloc(sizeof(TT_SUBCLASS_INFO)); 716 lpttsi->wpOrigProc = 717 (WNDPROC)SetWindowLongA (toolPtr->hwnd, 718 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc); 719 lpttsi->hwndToolTip = hwnd; 720 lpttsi->uRefCount++; 721 SetPropA(toolPtr->hwnd,COMCTL32_aSubclass,(HANDLE)lpttsi); 722 } else lpttsi->uRefCount++; 723 } 724 // TRACE (tooltips, "subclassing installed!\n"); 725 } 726 } 727 728 static VOID TOOLTIPS_Desubclass(TTTOOL_INFO *toolPtr) 729 { 730 if (toolPtr->uFlags & TTF_SUBCLASS) 731 { 732 if (toolPtr->uFlags & TTF_IDISHWND) 733 { 734 LPTT_SUBCLASS_INFO lpttsi = 735 (LPTT_SUBCLASS_INFO)GetPropA((HWND)toolPtr->uId,COMCTL32_aSubclass); 736 if (lpttsi) 737 { 738 SetWindowLongA ((HWND)toolPtr->uId,GWL_WNDPROC,(LONG)lpttsi->wpOrigProc); 739 RemovePropA ((HWND)toolPtr->uId,COMCTL32_aSubclass); 740 COMCTL32_Free(&lpttsi); 741 } 742 // else 743 // ERR (tooltips, "Invalid data handle!\n"); 744 } else 745 { 746 LPTT_SUBCLASS_INFO lpttsi = 747 (LPTT_SUBCLASS_INFO)GetPropA(toolPtr->hwnd,COMCTL32_aSubclass); 748 if (lpttsi) 749 { 750 if (lpttsi->uRefCount == 1) 751 { 752 SetWindowLongA((HWND)toolPtr->uId,GWL_WNDPROC,(LONG)lpttsi->wpOrigProc); 753 RemovePropA((HWND)toolPtr->uId,COMCTL32_aSubclass); 754 COMCTL32_Free(&lpttsi); 755 } else lpttsi->uRefCount--; 756 } 757 // else 758 // ERR (tooltips, "Invalid data handle!\n"); 759 } 760 } 761 } 762 763 static LRESULT 764 TOOLTIPS_AddToolA(HWND hwnd,WPARAM wParam,LPARAM lParam) 765 { 766 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(hwnd); 618 TOOLTIPS_Hide (hwnd, infoPtr); 619 620 return 0; 621 } 622 623 624 static LRESULT 625 TOOLTIPS_AddToolA (HWND hwnd, WPARAM wParam, LPARAM lParam) 626 { 627 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 767 628 LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam; 768 629 TTTOOL_INFO *toolPtr; 769 630 770 if (lpToolInfo == NULL) return FALSE; 771 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) return FALSE; 772 773 // TRACE (tooltips, "add tool (%x) %x %d%s!\n", 774 // hwnd, lpToolInfo->hwnd, lpToolInfo->uId, 775 // (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : ""); 776 777 if (infoPtr->uNumTools == 0) 778 { 779 infoPtr->tools = (TTTOOL_INFO*)COMCTL32_Alloc(sizeof(TTTOOL_INFO)); 780 toolPtr = infoPtr->tools; 781 } else 782 { 783 TTTOOL_INFO *oldTools = infoPtr->tools; 784 INT x; 785 786 toolPtr = NULL; 787 788 //check if toolinfo already exists 789 for (x = 0;x < infoPtr->uNumTools;x++) 790 { 791 if (lpToolInfo->hwnd == infoPtr->tools[x].hwnd && lpToolInfo->uId == infoPtr->tools[x].uId) 792 { 793 //return toolPtr 794 toolPtr = &infoPtr->tools[x]; 795 //free allocated memory 796 TOOLTIPS_Desubclass(toolPtr); 797 if ((toolPtr->hinst) && (toolPtr->lpszText)) 798 { 799 if (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(toolPtr->lpszText); 800 } 801 802 break; 803 } 804 } 805 806 if (toolPtr == NULL) 807 { 808 infoPtr->tools = (TTTOOL_INFO*)COMCTL32_Alloc (sizeof(TTTOOL_INFO)*(infoPtr->uNumTools+1)); 809 memcpy(infoPtr->tools,oldTools,infoPtr->uNumTools*sizeof(TTTOOL_INFO)); 810 COMCTL32_Free(oldTools); 811 toolPtr = &infoPtr->tools[infoPtr->uNumTools]; 812 } 631 if (lpToolInfo == NULL) 632 return FALSE; 633 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 634 return FALSE; 635 636 TRACE("add tool (%x) %x %d%s!\n", 637 hwnd, lpToolInfo->hwnd, lpToolInfo->uId, 638 (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : ""); 639 640 if (infoPtr->uNumTools == 0) { 641 infoPtr->tools = (TTTOOL_INFO*)COMCTL32_Alloc (sizeof(TTTOOL_INFO)); 642 toolPtr = infoPtr->tools; 643 } 644 else { 645 TTTOOL_INFO *oldTools = infoPtr->tools; 646 infoPtr->tools = 647 (TTTOOL_INFO*)COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools + 1)); 648 memcpy (infoPtr->tools, oldTools, 649 infoPtr->uNumTools * sizeof(TTTOOL_INFO)); 650 COMCTL32_Free (oldTools); 651 toolPtr = &infoPtr->tools[infoPtr->uNumTools]; 813 652 } 814 653 … … 822 661 toolPtr->hinst = lpToolInfo->hinst; 823 662 824 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) 825 { 826 // TRACE (tooltips, "add string id %x!\n", (int)lpToolInfo->lpszText);827 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;828 } else if (lpToolInfo->lpszText)829 830 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) 831 { 832 // TRACE (tooltips, "add CALLBACK!\n"); 833 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 834 } else 835 { 836 INT len = lstrlenA (lpToolInfo->lpszText);837 // TRACE (tooltips, "add text \"%s\"!\n", lpToolInfo->lpszText);838 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc((len+1)*sizeof(WCHAR)); 839 lstrcpyAtoW (toolPtr->lpszText, lpToolInfo->lpszText);840 841 } else toolPtr->lpszText = NULL;663 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 664 TRACE("add string id %x!\n", (int)lpToolInfo->lpszText); 665 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 666 } 667 else if (lpToolInfo->lpszText) { 668 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) { 669 TRACE("add CALLBACK!\n"); 670 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 671 } 672 else { 673 INT len = MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, -1, 674 NULL, 0); 675 TRACE("add text \"%s\"!\n", lpToolInfo->lpszText); 676 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc (len * sizeof(WCHAR)); 677 MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, -1, 678 toolPtr->lpszText, len); 679 } 680 } 842 681 843 682 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 844 683 toolPtr->lParam = lpToolInfo->lParam; 845 684 846 685 /* install subclassing hook */ 847 TOOLTIPS_Subclass(hwnd,toolPtr); 686 if (toolPtr->uFlags & TTF_SUBCLASS) { 687 if (toolPtr->uFlags & TTF_IDISHWND) { 688 LPTT_SUBCLASS_INFO lpttsi = 689 (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 690 if (lpttsi == NULL) { 691 lpttsi = 692 (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO)); 693 lpttsi->wpOrigProc = 694 (WNDPROC)SetWindowLongA ((HWND)toolPtr->uId, 695 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc); 696 lpttsi->hwndToolTip = hwnd; 697 lpttsi->uRefCount++; 698 SetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass, 699 (HANDLE)lpttsi); 700 } 701 else 702 WARN("A window tool must only be listed once!\n"); 703 } 704 else { 705 LPTT_SUBCLASS_INFO lpttsi = 706 (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 707 if (lpttsi == NULL) { 708 lpttsi = 709 (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO)); 710 lpttsi->wpOrigProc = 711 (WNDPROC)SetWindowLongA (toolPtr->hwnd, 712 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc); 713 lpttsi->hwndToolTip = hwnd; 714 lpttsi->uRefCount++; 715 SetPropA (toolPtr->hwnd, COMCTL32_aSubclass, (HANDLE)lpttsi); 716 } 717 else 718 lpttsi->uRefCount++; 719 } 720 TRACE("subclassing installed!\n"); 721 } 848 722 849 723 return TRUE; … … 859 733 860 734 if (lpToolInfo == NULL) 861 735 return FALSE; 862 736 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 863 return FALSE; 864 865 // TRACE (tooltips, "add tool (%x) %x %d%s!\n", 866 // hwnd, lpToolInfo->hwnd, lpToolInfo->uId, 867 // (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : ""); 868 869 if (infoPtr->uNumTools == 0) 870 { 871 infoPtr->tools = (TTTOOL_INFO*)COMCTL32_Alloc (sizeof(TTTOOL_INFO)); 872 toolPtr = infoPtr->tools; 873 } else 874 { 875 TTTOOL_INFO *oldTools = infoPtr->tools; 876 INT x; 877 878 toolPtr = NULL; 879 880 //check if toolinfo already exists 881 for (x = 0;x < infoPtr->uNumTools;x++) 882 { 883 if (lpToolInfo->hwnd == infoPtr->tools[x].hwnd && lpToolInfo->uId == infoPtr->tools[x].uId) 884 { 885 //return toolPtr 886 toolPtr = &infoPtr->tools[x]; 887 //free allocated memory 888 TOOLTIPS_Desubclass(toolPtr); 889 if ((toolPtr->hinst) && (toolPtr->lpszText)) 890 { 891 if (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(toolPtr->lpszText); 892 } 893 894 break; 895 } 896 } 897 898 if (toolPtr == NULL) 899 { 900 infoPtr->tools = (TTTOOL_INFO*)COMCTL32_Alloc(sizeof(TTTOOL_INFO)*(infoPtr->uNumTools+1)); 901 memcpy (infoPtr->tools,oldTools,infoPtr->uNumTools*sizeof(TTTOOL_INFO)); 902 COMCTL32_Free(oldTools); 903 toolPtr = &infoPtr->tools[infoPtr->uNumTools]; 904 } 737 return FALSE; 738 739 TRACE("add tool (%x) %x %d%s!\n", 740 hwnd, lpToolInfo->hwnd, lpToolInfo->uId, 741 (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : ""); 742 743 if (infoPtr->uNumTools == 0) { 744 infoPtr->tools = (TTTOOL_INFO*)COMCTL32_Alloc (sizeof(TTTOOL_INFO)); 745 toolPtr = infoPtr->tools; 746 } 747 else { 748 TTTOOL_INFO *oldTools = infoPtr->tools; 749 infoPtr->tools = 750 (TTTOOL_INFO*)COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools + 1)); 751 memcpy (infoPtr->tools, oldTools, 752 infoPtr->uNumTools * sizeof(TTTOOL_INFO)); 753 COMCTL32_Free (oldTools); 754 toolPtr = &infoPtr->tools[infoPtr->uNumTools]; 905 755 } 906 756 … … 915 765 916 766 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 917 // TRACE (tooltips,"add string id %x!\n", (int)lpToolInfo->lpszText);918 767 TRACE("add string id %x!\n", (int)lpToolInfo->lpszText); 768 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 919 769 } 920 770 else if (lpToolInfo->lpszText) { 921 922 // TRACE (tooltips,"add CALLBACK!\n");923 924 925 926 927 // TRACE (tooltips, "add text \"%s\"!\n",928 //debugstr_w(lpToolInfo->lpszText));929 toolPtr->lpszText =(WCHAR*)COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));930 931 771 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) { 772 TRACE("add CALLBACK!\n"); 773 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 774 } 775 else { 776 INT len = lstrlenW (lpToolInfo->lpszText); 777 TRACE("add text %s!\n", 778 debugstr_w(lpToolInfo->lpszText)); 779 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc ((len + 1)*sizeof(WCHAR)); 780 lstrcpyW (toolPtr->lpszText, lpToolInfo->lpszText); 781 } 932 782 } 933 783 934 784 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 935 785 toolPtr->lParam = lpToolInfo->lParam; 936 786 937 787 /* install subclassing hook */ 938 TOOLTIPS_Subclass(hwnd,toolPtr); 788 if (toolPtr->uFlags & TTF_SUBCLASS) { 789 if (toolPtr->uFlags & TTF_IDISHWND) { 790 LPTT_SUBCLASS_INFO lpttsi = 791 (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 792 if (lpttsi == NULL) { 793 lpttsi = 794 (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO)); 795 lpttsi->wpOrigProc = 796 (WNDPROC)SetWindowLongA ((HWND)toolPtr->uId, 797 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc); 798 lpttsi->hwndToolTip = hwnd; 799 lpttsi->uRefCount++; 800 SetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass, 801 (HANDLE)lpttsi); 802 } 803 else 804 WARN("A window tool must only be listed once!\n"); 805 } 806 else { 807 LPTT_SUBCLASS_INFO lpttsi = 808 (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 809 if (lpttsi == NULL) { 810 lpttsi = 811 (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO)); 812 lpttsi->wpOrigProc = 813 (WNDPROC)SetWindowLongA (toolPtr->hwnd, 814 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc); 815 lpttsi->hwndToolTip = hwnd; 816 lpttsi->uRefCount++; 817 SetPropA (toolPtr->hwnd, COMCTL32_aSubclass, (HANDLE)lpttsi); 818 } 819 else 820 lpttsi->uRefCount++; 821 } 822 TRACE("subclassing installed!\n"); 823 } 939 824 940 825 return TRUE; … … 951 836 952 837 if (lpToolInfo == NULL) 953 838 return 0; 954 839 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 955 840 return 0; 956 841 if (infoPtr->uNumTools == 0) 957 842 return 0; 958 843 959 844 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 960 845 if (nTool == -1) return 0; 961 846 962 // TRACE (tooltips,"tool %d\n", nTool);847 TRACE("tool %d\n", nTool); 963 848 964 849 /* delete text string */ 965 toolPtr = &infoPtr->tools[nTool]; 850 toolPtr = &infoPtr->tools[nTool]; 966 851 if ((toolPtr->hinst) && (toolPtr->lpszText)) { 967 968 969 852 if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && 853 (HIWORD((INT)toolPtr->lpszText) != 0) ) 854 COMCTL32_Free (toolPtr->lpszText); 970 855 } 971 856 972 857 /* remove subclassing */ 973 TOOLTIPS_Desubclass(toolPtr); 858 if (toolPtr->uFlags & TTF_SUBCLASS) { 859 if (toolPtr->uFlags & TTF_IDISHWND) { 860 LPTT_SUBCLASS_INFO lpttsi = 861 (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 862 if (lpttsi) { 863 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 864 (LONG)lpttsi->wpOrigProc); 865 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 866 COMCTL32_Free (&lpttsi); 867 } 868 else 869 ERR("Invalid data handle!\n"); 870 } 871 else { 872 LPTT_SUBCLASS_INFO lpttsi = 873 (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 874 if (lpttsi) { 875 if (lpttsi->uRefCount == 1) { 876 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 877 (LONG)lpttsi->wpOrigProc); 878 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 879 COMCTL32_Free (&lpttsi); 880 } 881 else 882 lpttsi->uRefCount--; 883 } 884 else 885 ERR("Invalid data handle!\n"); 886 } 887 } 974 888 975 889 /* delete tool from tool list */ 976 890 if (infoPtr->uNumTools == 1) { 977 978 891 COMCTL32_Free (infoPtr->tools); 892 infoPtr->tools = NULL; 979 893 } 980 894 else { 981 982 983 984 985 986 987 988 989 990 991 992 993 895 TTTOOL_INFO *oldTools = infoPtr->tools; 896 infoPtr->tools = 897 (TTTOOL_INFO*)COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1)); 898 899 if (nTool > 0) 900 memcpy (&infoPtr->tools[0], &oldTools[0], 901 nTool * sizeof(TTTOOL_INFO)); 902 903 if (nTool < infoPtr->uNumTools - 1) 904 memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1], 905 (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO)); 906 907 COMCTL32_Free (oldTools); 994 908 } 995 909 … … 1009 923 1010 924 if (lpToolInfo == NULL) 1011 925 return 0; 1012 926 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1013 927 return 0; 1014 928 if (infoPtr->uNumTools == 0) 1015 929 return 0; 1016 930 1017 931 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1018 932 if (nTool == -1) return 0; 1019 933 1020 // TRACE (tooltips,"tool %d\n", nTool);934 TRACE("tool %d\n", nTool); 1021 935 1022 936 /* delete text string */ 1023 toolPtr = &infoPtr->tools[nTool]; 937 toolPtr = &infoPtr->tools[nTool]; 1024 938 if ((toolPtr->hinst) && (toolPtr->lpszText)) { 1025 1026 1027 939 if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && 940 (HIWORD((INT)toolPtr->lpszText) != 0) ) 941 COMCTL32_Free (toolPtr->lpszText); 1028 942 } 1029 943 1030 944 /* remove subclassing */ 1031 TOOLTIPS_Desubclass(toolPtr); 945 if (toolPtr->uFlags & TTF_SUBCLASS) { 946 if (toolPtr->uFlags & TTF_IDISHWND) { 947 LPTT_SUBCLASS_INFO lpttsi = 948 (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 949 if (lpttsi) { 950 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 951 (LONG)lpttsi->wpOrigProc); 952 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 953 COMCTL32_Free (&lpttsi); 954 } 955 else 956 ERR("Invalid data handle!\n"); 957 } 958 else { 959 LPTT_SUBCLASS_INFO lpttsi = 960 (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 961 if (lpttsi) { 962 if (lpttsi->uRefCount == 1) { 963 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 964 (LONG)lpttsi->wpOrigProc); 965 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 966 COMCTL32_Free (&lpttsi); 967 } 968 else 969 lpttsi->uRefCount--; 970 } 971 else 972 ERR("Invalid data handle!\n"); 973 } 974 } 1032 975 1033 976 /* delete tool from tool list */ 1034 977 if (infoPtr->uNumTools == 1) { 1035 1036 978 COMCTL32_Free (infoPtr->tools); 979 infoPtr->tools = NULL; 1037 980 } 1038 981 else { 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 982 TTTOOL_INFO *oldTools = infoPtr->tools; 983 infoPtr->tools = 984 (TTTOOL_INFO*)COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1)); 985 986 if (nTool > 0) 987 memcpy (&infoPtr->tools[0], &oldTools[0], 988 nTool * sizeof(TTTOOL_INFO)); 989 990 if (nTool < infoPtr->uNumTools - 1) 991 memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1], 992 (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO)); 993 994 COMCTL32_Free (oldTools); 1052 995 } 1053 996 … … 1067 1010 1068 1011 if (lpToolInfo == NULL) 1069 1012 return FALSE; 1070 1013 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1071 1014 return FALSE; 1072 1015 if (uIndex >= infoPtr->uNumTools) 1073 1074 1075 // TRACE (tooltips,"index=%u\n", uIndex);1016 return FALSE; 1017 1018 TRACE("index=%u\n", uIndex); 1076 1019 1077 1020 toolPtr = &infoPtr->tools[uIndex]; … … 1087 1030 1088 1031 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1089 1032 lpToolInfo->lParam = toolPtr->lParam; 1090 1033 1091 1034 return TRUE; … … 1102 1045 1103 1046 if (lpToolInfo == NULL) 1104 1047 return FALSE; 1105 1048 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1106 1049 return FALSE; 1107 1050 if (uIndex >= infoPtr->uNumTools) 1108 1109 1110 // TRACE (tooltips,"index=%u\n", uIndex);1051 return FALSE; 1052 1053 TRACE("index=%u\n", uIndex); 1111 1054 1112 1055 toolPtr = &infoPtr->tools[uIndex]; … … 1122 1065 1123 1066 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1124 1067 lpToolInfo->lParam = toolPtr->lParam; 1125 1068 1126 1069 return TRUE; … … 1136 1079 1137 1080 if (lpToolInfo == NULL) 1138 1081 return FALSE; 1139 1082 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1140 1083 return FALSE; 1141 1084 1142 1085 if (lpToolInfo) { 1143 1144 1145 1146 1147 1148 1149 1150 /* 1151 1152 1153 1154 1155 1156 1157 1158 1159 1086 if (infoPtr->nCurrentTool > -1) { 1087 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; 1088 1089 /* copy tool data */ 1090 lpToolInfo->uFlags = toolPtr->uFlags; 1091 lpToolInfo->rect = toolPtr->rect; 1092 lpToolInfo->hinst = toolPtr->hinst; 1093 /* lpToolInfo->lpszText = toolPtr->lpszText; */ 1094 lpToolInfo->lpszText = NULL; /* FIXME */ 1095 1096 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1097 lpToolInfo->lParam = toolPtr->lParam; 1098 1099 return TRUE; 1100 } 1101 else 1102 return FALSE; 1160 1103 } 1161 1104 else 1162 1105 return (infoPtr->nCurrentTool != -1); 1163 1106 1164 1107 return FALSE; … … 1174 1117 1175 1118 if (lpToolInfo == NULL) 1176 1119 return FALSE; 1177 1120 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1178 1121 return FALSE; 1179 1122 1180 1123 if (lpToolInfo) { 1181 1182 1183 1184 1185 1186 1187 1188 /* 1189 1190 1191 1192 1193 1194 1195 1196 1197 1124 if (infoPtr->nCurrentTool > -1) { 1125 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; 1126 1127 /* copy tool data */ 1128 lpToolInfo->uFlags = toolPtr->uFlags; 1129 lpToolInfo->rect = toolPtr->rect; 1130 lpToolInfo->hinst = toolPtr->hinst; 1131 /* lpToolInfo->lpszText = toolPtr->lpszText; */ 1132 lpToolInfo->lpszText = NULL; /* FIXME */ 1133 1134 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1135 lpToolInfo->lParam = toolPtr->lParam; 1136 1137 return TRUE; 1138 } 1139 else 1140 return FALSE; 1198 1141 } 1199 1142 else 1200 1143 return (infoPtr->nCurrentTool != -1); 1201 1144 1202 1145 return FALSE; … … 1210 1153 1211 1154 switch (wParam) { 1212 case TTDT_AUTOMATIC: 1213 return infoPtr->nAutomaticTime; 1214 1215 case TTDT_RESHOW: 1216 return infoPtr->nReshowTime; 1217 1218 case TTDT_AUTOPOP: 1219 return infoPtr->nAutoPopTime; 1220 1221 case TTDT_INITIAL: 1222 return infoPtr->nInitialTime; 1223 } 1224 1225 return 0; 1155 case TTDT_RESHOW: 1156 return infoPtr->nReshowTime; 1157 1158 case TTDT_AUTOPOP: 1159 return infoPtr->nAutoPopTime; 1160 1161 case TTDT_INITIAL: 1162 case TTDT_AUTOMATIC: /* Apparently TTDT_AUTOMATIC returns TTDT_INITIAL */ 1163 return infoPtr->nInitialTime; 1164 1165 default: 1166 WARN("Invalid wParam %x\n", wParam); 1167 break; 1168 } 1169 1170 return -1; 1226 1171 } 1227 1172 … … 1242 1187 1243 1188 1244 static LRESULT1189 inline static LRESULT 1245 1190 TOOLTIPS_GetMaxTipWidth (HWND hwnd, WPARAM wParam, LPARAM lParam) 1246 1191 { … … 1259 1204 1260 1205 if (lpToolInfo == NULL) 1261 1206 return 0; 1262 1207 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1263 1208 return 0; 1264 1209 1265 1210 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1266 1211 if (nTool == -1) return 0; 1267 1212 1268 TOOLTIPS_GetTipText(hwnd,infoPtr,nTool); 1269 1270 lstrcpyWtoA(lpToolInfo->lpszText,infoPtr->szTipText); 1213 /* NB this API is broken, there is no way for the app to determine 1214 what size buffer it requires nor a way to specify how long the 1215 one it supplies is. We'll assume it's upto INFOTIPSIZE */ 1216 1217 WideCharToMultiByte(CP_ACP, 0, infoPtr->tools[nTool].lpszText, -1, 1218 lpToolInfo->lpszText, INFOTIPSIZE, NULL, NULL); 1271 1219 1272 1220 return 0; … … 1282 1230 1283 1231 if (lpToolInfo == NULL) 1284 1232 return 0; 1285 1233 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1286 1234 return 0; 1287 1235 1288 1236 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1289 1237 if (nTool == -1) return 0; 1290 1238 1291 TOOLTIPS_GetTipText(hwnd,infoPtr,nTool); 1292 1293 lstrcpyW(lpToolInfo->lpszText,infoPtr->szTipText); 1294 1295 return 0; 1296 } 1297 1298 1299 static LRESULT 1239 lstrcpyW (lpToolInfo->lpszText, infoPtr->tools[nTool].lpszText); 1240 1241 return 0; 1242 } 1243 1244 1245 inline static LRESULT 1300 1246 TOOLTIPS_GetTipBkColor (HWND hwnd, WPARAM wParam, LPARAM lParam) 1301 1247 { … … 1305 1251 1306 1252 1307 static LRESULT1253 inline static LRESULT 1308 1254 TOOLTIPS_GetTipTextColor (HWND hwnd, WPARAM wParam, LPARAM lParam) 1309 1255 { … … 1313 1259 1314 1260 1315 static LRESULT1261 inline static LRESULT 1316 1262 TOOLTIPS_GetToolCount (HWND hwnd, WPARAM wParam, LPARAM lParam) 1317 1263 { … … 1330 1276 1331 1277 if (lpToolInfo == NULL) 1332 1278 return FALSE; 1333 1279 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1334 1280 return FALSE; 1335 1281 if (infoPtr->uNumTools == 0) 1336 1282 return FALSE; 1337 1283 1338 1284 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1339 1285 if (nTool == -1) 1340 1341 1342 // TRACE (tooltips,"tool %d\n", nTool);1286 return FALSE; 1287 1288 TRACE("tool %d\n", nTool); 1343 1289 1344 1290 toolPtr = &infoPtr->tools[nTool]; … … 1352 1298 1353 1299 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1354 1300 lpToolInfo->lParam = toolPtr->lParam; 1355 1301 1356 1302 return TRUE; … … 1367 1313 1368 1314 if (lpToolInfo == NULL) 1369 1315 return FALSE; 1370 1316 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1371 1317 return FALSE; 1372 1318 if (infoPtr->uNumTools == 0) 1373 1319 return FALSE; 1374 1320 1375 1321 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1376 1322 if (nTool == -1) 1377 1378 1379 // TRACE (tooltips,"tool %d\n", nTool);1323 return FALSE; 1324 1325 TRACE("tool %d\n", nTool); 1380 1326 1381 1327 toolPtr = &infoPtr->tools[nTool]; … … 1389 1335 1390 1336 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1391 1337 lpToolInfo->lParam = toolPtr->lParam; 1392 1338 1393 1339 return TRUE; … … 1404 1350 1405 1351 if (lptthit == 0) 1406 1352 return FALSE; 1407 1353 1408 1354 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lptthit->hwnd, &lptthit->pt); 1409 1355 if (nTool == -1) 1410 1411 1412 // TRACE (tooltips,"tool %d!\n", nTool);1356 return FALSE; 1357 1358 TRACE("tool %d!\n", nTool); 1413 1359 1414 1360 /* copy tool data */ 1415 1361 if (lptthit->ti.cbSize >= sizeof(TTTOOLINFOA)) { 1416 1417 1418 1419 1420 1421 1422 1423 /* 1424 1425 1362 toolPtr = &infoPtr->tools[nTool]; 1363 1364 lptthit->ti.uFlags = toolPtr->uFlags; 1365 lptthit->ti.hwnd = toolPtr->hwnd; 1366 lptthit->ti.uId = toolPtr->uId; 1367 lptthit->ti.rect = toolPtr->rect; 1368 lptthit->ti.hinst = toolPtr->hinst; 1369 /* lptthit->ti.lpszText = toolPtr->lpszText; */ 1370 lptthit->ti.lpszText = NULL; /* FIXME */ 1371 lptthit->ti.lParam = toolPtr->lParam; 1426 1372 } 1427 1373 … … 1439 1385 1440 1386 if (lptthit == 0) 1441 1387 return FALSE; 1442 1388 1443 1389 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lptthit->hwnd, &lptthit->pt); 1444 1390 if (nTool == -1) 1445 1446 1447 // TRACE (tooltips,"tool %d!\n", nTool);1391 return FALSE; 1392 1393 TRACE("tool %d!\n", nTool); 1448 1394 1449 1395 /* copy tool data */ 1450 1396 if (lptthit->ti.cbSize >= sizeof(TTTOOLINFOW)) { 1451 1452 1453 1454 1455 1456 1457 1458 /* 1459 1460 1397 toolPtr = &infoPtr->tools[nTool]; 1398 1399 lptthit->ti.uFlags = toolPtr->uFlags; 1400 lptthit->ti.hwnd = toolPtr->hwnd; 1401 lptthit->ti.uId = toolPtr->uId; 1402 lptthit->ti.rect = toolPtr->rect; 1403 lptthit->ti.hinst = toolPtr->hinst; 1404 /* lptthit->ti.lpszText = toolPtr->lpszText; */ 1405 lptthit->ti.lpszText = NULL; /* FIXME */ 1406 lptthit->ti.lParam = toolPtr->lParam; 1461 1407 } 1462 1408 … … 1473 1419 1474 1420 if (lpti == NULL) 1475 1421 return 0; 1476 1422 if (lpti->cbSize < TTTOOLINFO_V1_SIZEA) 1477 1423 return FALSE; 1478 1424 1479 1425 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpti); … … 1494 1440 1495 1441 if (lpti == NULL) 1496 1442 return 0; 1497 1443 if (lpti->cbSize < TTTOOLINFO_V1_SIZEW) 1498 1444 return FALSE; 1499 1445 1500 1446 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpti); … … 1507 1453 1508 1454 1509 static LRESULT1455 inline static LRESULT 1510 1456 TOOLTIPS_Pop (HWND hwnd, WPARAM wParam, LPARAM lParam) 1511 1457 { 1512 1458 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 1513 1514 /*1515 * Need to set nCurrentTool to nOldTool so we hide the tool.1516 * nTool and nOldTool values change when the mouse leaves the window.1517 * If using TTM_UPDATETIPTEXT we can end up with an nCurrentTool = -1 if the1518 * text can't be found, thus the tooltip would never be hidden.1519 */1520 if (infoPtr->nTool != infoPtr->nOldTool)1521 infoPtr->nCurrentTool = infoPtr->nOldTool;1522 1523 1459 TOOLTIPS_Hide (hwnd, infoPtr); 1524 1460 … … 1533 1469 LPMSG lpMsg = (LPMSG)lParam; 1534 1470 POINT pt; 1535 1536 if (lParam == 0) 1537 { 1538 // ERR (tooltips, "lpMsg == NULL!\n"); 1539 return 0; 1540 } 1541 1542 switch (lpMsg->message) 1543 { 1544 case WM_LBUTTONDOWN: 1545 case WM_LBUTTONUP: 1546 case WM_MBUTTONDOWN: 1547 case WM_MBUTTONUP: 1548 case WM_RBUTTONDOWN: 1549 case WM_RBUTTONUP: 1550 pt = lpMsg->pt; 1551 ScreenToClient(lpMsg->hwnd,&pt); 1552 infoPtr->nOldTool = infoPtr->nTool; 1553 infoPtr->nTool = TOOLTIPS_GetToolFromPoint(infoPtr,lpMsg->hwnd,&pt); 1554 // TRACE (tooltips, "tool (%x) %d %d\n", 1555 // hwnd, infoPtr->nOldTool, infoPtr->nTool); 1556 TOOLTIPS_Hide (hwnd, infoPtr); 1557 break; 1558 1559 case WM_MOUSEMOVE: 1560 pt = lpMsg->pt; 1561 ScreenToClient(lpMsg->hwnd,&pt); 1562 infoPtr->nOldTool = infoPtr->nTool; 1563 infoPtr->nTool = TOOLTIPS_GetToolFromPoint(infoPtr,lpMsg->hwnd,&pt); 1564 //TRACE (tooltips, "tool (%x) %d %d\n", 1565 // hwnd, infoPtr->nOldTool, infoPtr->nTool); 1566 //TRACE (tooltips, "WM_MOUSEMOVE (%04x %ld %ld)\n", 1567 // hwnd, pt.x, pt.y); 1568 1569 if (infoPtr->bActive && (infoPtr->nTool != infoPtr->nOldTool)) 1570 { 1571 if (infoPtr->nOldTool == -1) 1572 { 1573 SetTimer(hwnd,ID_TIMERSHOW,infoPtr->nInitialTime,0); 1574 //TRACE (tooltips, "timer 1 started!\n"); 1575 } else 1576 { 1577 /* 1578 * Need to set nCurrentTool to nOldTool so we hide the tool. 1579 * nTool and nOldTool values change when the mouse leaves the window. 1580 * If using TTM_UPDATETIPTEXT we can end up with an nCurrentTool = -1 if the 1581 * text can't be found, thus the tooltip would never be hidden. 1582 */ 1583 if (infoPtr->nTool != infoPtr->nOldTool) 1584 infoPtr->nCurrentTool = infoPtr->nOldTool; 1585 1586 TOOLTIPS_Hide(hwnd,infoPtr); 1587 SetTimer (hwnd,ID_TIMERSHOW,infoPtr->nReshowTime,0); 1588 //TRACE (tooltips, "timer 2 started!\n"); 1589 } 1590 } 1591 if (infoPtr->nCurrentTool != -1) 1592 { 1593 SetTimer(hwnd,ID_TIMERLEAVE,100,0); 1594 //TRACE (tooltips, "timer 3 started!\n"); 1595 } 1596 break; 1471 INT nOldTool; 1472 1473 if (lParam == 0) { 1474 ERR("lpMsg == NULL!\n"); 1475 return 0; 1476 } 1477 1478 switch (lpMsg->message) { 1479 case WM_LBUTTONDOWN: 1480 case WM_LBUTTONUP: 1481 case WM_MBUTTONDOWN: 1482 case WM_MBUTTONUP: 1483 case WM_RBUTTONDOWN: 1484 case WM_RBUTTONUP: 1485 pt.x = LOWORD(lParam); 1486 pt.y = HIWORD(lParam); 1487 infoPtr->nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lpMsg->hwnd, &pt); 1488 TRACE("tool (%x) %d %d\n", 1489 hwnd, infoPtr->nTool, infoPtr->nCurrentTool); 1490 TOOLTIPS_Hide (hwnd, infoPtr); 1491 break; 1492 1493 case WM_MOUSEMOVE: 1494 pt.x = LOWORD(lpMsg->lParam); 1495 pt.y = HIWORD(lpMsg->lParam); 1496 nOldTool = infoPtr->nTool; 1497 infoPtr->nTool = TOOLTIPS_GetToolFromPoint(infoPtr, lpMsg->hwnd, 1498 &pt); 1499 TRACE("tool (%x) %d %d %d\n", hwnd, nOldTool, 1500 infoPtr->nTool, infoPtr->nCurrentTool); 1501 TRACE("WM_MOUSEMOVE (%04x %ld %ld)\n", hwnd, pt.x, pt.y); 1502 1503 if (infoPtr->nTool != nOldTool) { 1504 if(infoPtr->nTool == -1) { /* Moved out of all tools */ 1505 TOOLTIPS_Hide(hwnd, infoPtr); 1506 KillTimer(hwnd, ID_TIMERLEAVE); 1507 } else if (nOldTool == -1) { /* Moved from outside */ 1508 if(infoPtr->bActive) { 1509 SetTimer(hwnd, ID_TIMERSHOW, infoPtr->nInitialTime, 0); 1510 TRACE("timer 1 started!\n"); 1511 } 1512 } else { /* Moved from one to another */ 1513 TOOLTIPS_Hide (hwnd, infoPtr); 1514 KillTimer(hwnd, ID_TIMERLEAVE); 1515 if(infoPtr->bActive) { 1516 SetTimer (hwnd, ID_TIMERSHOW, infoPtr->nReshowTime, 0); 1517 TRACE("timer 1 started!\n"); 1518 } 1519 } 1520 } else if(infoPtr->nCurrentTool != -1) { /* restart autopop */ 1521 KillTimer(hwnd, ID_TIMERPOP); 1522 SetTimer(hwnd, ID_TIMERPOP, infoPtr->nAutoPopTime, 0); 1523 TRACE("timer 2 restarted\n"); 1524 } 1525 break; 1597 1526 } 1598 1527 … … 1608 1537 1609 1538 switch (wParam) { 1610 case TTDT_AUTOMATIC: 1611 if (nTime == 0) { 1612 infoPtr->nAutomaticTime = 500; 1613 infoPtr->nReshowTime = 100; 1614 infoPtr->nAutoPopTime = 5000; 1615 infoPtr->nInitialTime = 500; 1616 } 1617 else { 1618 infoPtr->nAutomaticTime = nTime; 1619 infoPtr->nReshowTime = nTime / 5; 1620 infoPtr->nAutoPopTime = nTime * 10; 1621 infoPtr->nInitialTime = nTime; 1622 } 1623 break; 1624 1625 case TTDT_RESHOW: 1626 infoPtr->nReshowTime = nTime; 1627 break; 1628 1629 case TTDT_AUTOPOP: 1630 infoPtr->nAutoPopTime = nTime; 1631 break; 1632 1633 case TTDT_INITIAL: 1634 infoPtr->nInitialTime = nTime; 1635 break; 1539 case TTDT_AUTOMATIC: 1540 if (nTime <= 0) 1541 nTime = GetDoubleClickTime(); 1542 infoPtr->nReshowTime = nTime / 5; 1543 infoPtr->nAutoPopTime = nTime * 10; 1544 infoPtr->nInitialTime = nTime; 1545 break; 1546 1547 case TTDT_RESHOW: 1548 if(nTime < 0) 1549 nTime = GetDoubleClickTime() / 5; 1550 infoPtr->nReshowTime = nTime; 1551 break; 1552 1553 case TTDT_AUTOPOP: 1554 if(nTime < 0) 1555 nTime = GetDoubleClickTime() * 10; 1556 infoPtr->nAutoPopTime = nTime; 1557 break; 1558 1559 case TTDT_INITIAL: 1560 if(nTime < 0) 1561 nTime = GetDoubleClickTime(); 1562 infoPtr->nInitialTime = nTime; 1563 break; 1564 1565 default: 1566 WARN("Invalid wParam %x\n", wParam); 1567 break; 1636 1568 } 1637 1569 … … 1655 1587 1656 1588 1657 static LRESULT1589 inline static LRESULT 1658 1590 TOOLTIPS_SetMaxTipWidth (HWND hwnd, WPARAM wParam, LPARAM lParam) 1659 1591 { … … 1667 1599 1668 1600 1669 static LRESULT1601 inline static LRESULT 1670 1602 TOOLTIPS_SetTipBkColor (HWND hwnd, WPARAM wParam, LPARAM lParam) 1671 1603 { … … 1678 1610 1679 1611 1680 static LRESULT1612 inline static LRESULT 1681 1613 TOOLTIPS_SetTipTextColor (HWND hwnd, WPARAM wParam, LPARAM lParam) 1682 1614 { … … 1698 1630 1699 1631 if (lpToolInfo == NULL) 1700 1632 return 0; 1701 1633 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1702 1634 return 0; 1703 1635 1704 1636 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1705 1637 if (nTool == -1) return 0; 1706 1638 1707 // TRACE (tooltips,"tool %d\n", nTool);1639 TRACE("tool %d\n", nTool); 1708 1640 1709 1641 toolPtr = &infoPtr->tools[nTool]; … … 1717 1649 1718 1650 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 1719 // TRACE (tooltips,"set string id %x!\n", (INT)lpToolInfo->lpszText);1720 1651 TRACE("set string id %x!\n", (INT)lpToolInfo->lpszText); 1652 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 1721 1653 } 1722 1654 else if (lpToolInfo->lpszText) { 1723 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) 1724 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1725 else { 1726 if ( (toolPtr->lpszText) && 1727 (HIWORD((INT)toolPtr->lpszText) != 0) ) { 1728 COMCTL32_Free (toolPtr->lpszText); 1729 toolPtr->lpszText = NULL; 1730 } 1731 if (lpToolInfo->lpszText) { 1732 INT len = lstrlenA (lpToolInfo->lpszText); 1733 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1734 lstrcpyAtoW (toolPtr->lpszText, lpToolInfo->lpszText); 1735 } 1736 } 1655 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) 1656 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1657 else { 1658 if ( (toolPtr->lpszText) && 1659 (HIWORD((INT)toolPtr->lpszText) != 0) ) { 1660 COMCTL32_Free (toolPtr->lpszText); 1661 toolPtr->lpszText = NULL; 1662 } 1663 if (lpToolInfo->lpszText) { 1664 INT len = MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, 1665 -1, NULL, 0); 1666 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc (len * sizeof(WCHAR)); 1667 MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, -1, 1668 toolPtr->lpszText, len); 1669 } 1670 } 1737 1671 } 1738 1672 1739 1673 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1740 1674 toolPtr->lParam = lpToolInfo->lParam; 1741 1675 1742 1676 return 0; … … 1753 1687 1754 1688 if (lpToolInfo == NULL) 1755 1689 return 0; 1756 1690 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1757 1691 return 0; 1758 1692 1759 1693 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1760 1694 if (nTool == -1) return 0; 1761 1695 1762 // TRACE (tooltips,"tool %d\n", nTool);1696 TRACE("tool %d\n", nTool); 1763 1697 1764 1698 toolPtr = &infoPtr->tools[nTool]; … … 1772 1706 1773 1707 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 1774 // TRACE (tooltips,"set string id %x!\n", (INT)lpToolInfo->lpszText);1775 1708 TRACE("set string id %x!\n", (INT)lpToolInfo->lpszText); 1709 toolPtr->lpszText = lpToolInfo->lpszText; 1776 1710 } 1777 1711 else if (lpToolInfo->lpszText) { 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1712 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) 1713 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1714 else { 1715 if ( (toolPtr->lpszText) && 1716 (HIWORD((INT)toolPtr->lpszText) != 0) ) { 1717 COMCTL32_Free (toolPtr->lpszText); 1718 toolPtr->lpszText = NULL; 1719 } 1720 if (lpToolInfo->lpszText) { 1721 INT len = lstrlenW (lpToolInfo->lpszText); 1722 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1723 lstrcpyW (toolPtr->lpszText, lpToolInfo->lpszText); 1724 } 1725 } 1792 1726 } 1793 1727 1794 1728 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1795 1729 toolPtr->lParam = lpToolInfo->lParam; 1796 1730 1797 1731 return 0; … … 1805 1739 LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam; 1806 1740 1807 if (lpToolInfo == NULL) return 0;1808 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) return FALSE;1809 1810 if ((BOOL)wParam) 1811 { 1812 /* activate */1813 infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoA(infoPtr,lpToolInfo); 1814 if (infoPtr->nTrackTool != -1) 1815 1816 //TRACE (tooltips,"activated!\n");1817 1818 TOOLTIPS_TrackShow(hwnd,infoPtr);1819 1820 } else1821 {1822 1823 TOOLTIPS_TrackHide(hwnd,infoPtr);1824 1825 1826 1827 1828 //TRACE (tooltips,"deactivated!\n");1741 if (lpToolInfo == NULL) 1742 return 0; 1743 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1744 return FALSE; 1745 1746 if ((BOOL)wParam) { 1747 /* activate */ 1748 infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1749 if (infoPtr->nTrackTool != -1) { 1750 TRACE("activated!\n"); 1751 infoPtr->bTrackActive = TRUE; 1752 TOOLTIPS_TrackShow (hwnd, infoPtr); 1753 } 1754 } 1755 else { 1756 /* deactivate */ 1757 TOOLTIPS_TrackHide (hwnd, infoPtr); 1758 1759 infoPtr->bTrackActive = FALSE; 1760 infoPtr->nTrackTool = -1; 1761 1762 TRACE("deactivated!\n"); 1829 1763 } 1830 1764 … … 1841 1775 infoPtr->yTrackPos = (INT)HIWORD(lParam); 1842 1776 1843 if (infoPtr->bTrackActive) 1844 { 1845 // TRACE (tooltips, "[%d %d]\n", 1846 // infoPtr->xTrackPos, infoPtr->yTrackPos); 1847 TOOLTIPS_TrackShow(hwnd,infoPtr);1777 if (infoPtr->bTrackActive) { 1778 TRACE("[%d %d]\n", 1779 infoPtr->xTrackPos, infoPtr->yTrackPos); 1780 1781 TOOLTIPS_TrackShow (hwnd, infoPtr); 1848 1782 } 1849 1783 … … 1858 1792 1859 1793 if (infoPtr->nCurrentTool != -1) 1860 UpdateWindow (hwnd); 1861 1862 return 0; 1863 } 1864 1865 1794 UpdateWindow (hwnd); 1795 1796 return 0; 1797 } 1798 1799 1800 static LRESULT 1866 1801 TOOLTIPS_UpdateTipTextA (HWND hwnd, WPARAM wParam, LPARAM lParam) 1867 1802 { … … 1872 1807 1873 1808 if (lpToolInfo == NULL) 1874 1809 return 0; 1875 1810 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1876 1811 return FALSE; 1877 1812 1878 1813 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1879 1814 if (nTool == -1) return 0; 1880 1815 1881 //TRACE("tool %d\n", nTool);1816 TRACE("tool %d\n", nTool); 1882 1817 1883 1818 toolPtr = &infoPtr->tools[nTool]; … … 1887 1822 1888 1823 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)){ 1889 1824 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 1890 1825 } 1891 1826 else if (lpToolInfo->lpszText) { 1892 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) 1893 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1894 else { 1895 if ( (toolPtr->lpszText) && 1896 (HIWORD((INT)toolPtr->lpszText) != 0) ) { 1897 COMCTL32_Free (toolPtr->lpszText); 1898 toolPtr->lpszText = NULL; 1899 } 1900 if (lpToolInfo->lpszText) { 1901 INT len = lstrlenA (lpToolInfo->lpszText); 1902 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1903 lstrcpyAtoW (toolPtr->lpszText, lpToolInfo->lpszText); 1904 } 1905 } 1827 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) 1828 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1829 else { 1830 if ( (toolPtr->lpszText) && 1831 (HIWORD((INT)toolPtr->lpszText) != 0) ) { 1832 COMCTL32_Free (toolPtr->lpszText); 1833 toolPtr->lpszText = NULL; 1834 } 1835 if (lpToolInfo->lpszText) { 1836 INT len = MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, 1837 -1, NULL, 0); 1838 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc (len * sizeof(WCHAR)); 1839 MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, -1, 1840 toolPtr->lpszText, len); 1841 } 1842 } 1906 1843 } 1907 1844 1908 1845 /* force repaint */ 1909 1846 if (infoPtr->bActive) 1910 1847 TOOLTIPS_Show (hwnd, infoPtr); 1911 1848 else if (infoPtr->bTrackActive) 1912 1849 TOOLTIPS_TrackShow (hwnd, infoPtr); 1913 1850 1914 1851 return 0; … … 1925 1862 1926 1863 if (lpToolInfo == NULL) 1927 1864 return 0; 1928 1865 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1929 1866 return FALSE; 1930 1867 1931 1868 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1932 1869 if (nTool == -1) 1933 1934 1935 //TRACE("tool %d\n", nTool);1870 return 0; 1871 1872 TRACE("tool %d\n", nTool); 1936 1873 1937 1874 toolPtr = &infoPtr->tools[nTool]; … … 1941 1878 1942 1879 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)){ 1943 1880 toolPtr->lpszText = lpToolInfo->lpszText; 1944 1881 } 1945 1882 else if (lpToolInfo->lpszText) { 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1883 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) 1884 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1885 else { 1886 if ( (toolPtr->lpszText) && 1887 (HIWORD((INT)toolPtr->lpszText) != 0) ) { 1888 COMCTL32_Free (toolPtr->lpszText); 1889 toolPtr->lpszText = NULL; 1890 } 1891 if (lpToolInfo->lpszText) { 1892 INT len = lstrlenW (lpToolInfo->lpszText); 1893 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1894 lstrcpyW (toolPtr->lpszText, lpToolInfo->lpszText); 1895 } 1896 } 1960 1897 } 1961 1898 1962 1899 /* force repaint */ 1963 1900 if (infoPtr->bActive) 1964 1901 TOOLTIPS_Show (hwnd, infoPtr); 1965 1902 else if (infoPtr->bTrackActive) 1966 1903 TOOLTIPS_TrackShow (hwnd, infoPtr); 1967 1904 1968 1905 return 0; … … 1986 1923 1987 1924 /* allocate memory for info structure */ 1988 infoPtr = (TOOLTIPS_INFO*)initControl(hwnd,sizeof(TOOLTIPS_INFO)); 1925 infoPtr = (TOOLTIPS_INFO *)COMCTL32_Alloc (sizeof(TOOLTIPS_INFO)); 1926 SetWindowLongA (hwnd, 0, (DWORD)infoPtr); 1989 1927 1990 1928 /* initialize info structure */ 1991 infoPtr->szTipText[0] = '\0';1992 1929 infoPtr->bActive = TRUE; 1993 1930 infoPtr->bTrackActive = FALSE; 1994 infoPtr->clrBk = GetSysColor(COLOR_INFOBK); 1995 infoPtr->clrText = GetSysColor(COLOR_INFOTEXT); 1996 infoPtr->xTrackPos = 0; 1997 infoPtr->yTrackPos = 0; 1931 infoPtr->clrBk = GetSysColor (COLOR_INFOBK); 1932 infoPtr->clrText = GetSysColor (COLOR_INFOTEXT); 1998 1933 1999 1934 nclm.cbSize = sizeof(NONCLIENTMETRICSA); 2000 SystemParametersInfoA (SPI_GETNONCLIENTMETRICS,0,&nclm,0);2001 infoPtr->hFont = CreateFontIndirectA (&nclm.lfStatusFont);1935 SystemParametersInfoA (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0); 1936 infoPtr->hFont = CreateFontIndirectA (&nclm.lfStatusFont); 2002 1937 2003 1938 infoPtr->nMaxTipWidth = -1; 2004 1939 infoPtr->nTool = -1; 2005 infoPtr->nOldTool = -1;2006 1940 infoPtr->nCurrentTool = -1; 2007 1941 infoPtr->nTrackTool = -1; 2008 1942 2009 infoPtr->nAutomaticTime = 500; 2010 infoPtr->nReshowTime = 100; 2011 infoPtr->nAutoPopTime = 5000; 2012 infoPtr->nInitialTime = 500; 2013 2014 SetRectEmpty(&infoPtr->rcMargin); 2015 2016 SetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE); 1943 TOOLTIPS_SetDelayTime(hwnd, TTDT_AUTOMATIC, 0L); 1944 1945 nResult = (INT) SendMessageA (GetParent (hwnd), WM_NOTIFYFORMAT, 1946 (WPARAM)hwnd, (LPARAM)NF_QUERY); 1947 if (nResult == NFR_ANSI) { 1948 infoPtr->bNotifyUnicode = FALSE; 1949 TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n"); 1950 } 1951 else if (nResult == NFR_UNICODE) { 1952 infoPtr->bNotifyUnicode = TRUE; 1953 TRACE(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n"); 1954 } 1955 else { 1956 ERR (" -- WM_NOTIFYFORMAT returns: error!\n"); 1957 } 1958 1959 SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE); 2017 1960 2018 1961 return 0; … … 2023 1966 TOOLTIPS_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam) 2024 1967 { 2025 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);1968 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 2026 1969 TTTOOL_INFO *toolPtr; 2027 1970 INT i; … … 2029 1972 /* free tools */ 2030 1973 if (infoPtr->tools) { 2031 2032 2033 2034 2035 (HIWORD((INT)toolPtr->lpszText) != 0) ) 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 1974 for (i = 0; i < infoPtr->uNumTools; i++) { 1975 toolPtr = &infoPtr->tools[i]; 1976 if ((toolPtr->hinst) && (toolPtr->lpszText)) { 1977 if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && 1978 (HIWORD((INT)toolPtr->lpszText) != 0) ) 1979 { 1980 COMCTL32_Free (toolPtr->lpszText); 1981 toolPtr->lpszText = NULL; 1982 } 1983 } 1984 1985 /* remove subclassing */ 1986 if (toolPtr->uFlags & TTF_SUBCLASS) { 1987 LPTT_SUBCLASS_INFO lpttsi; 1988 1989 if (toolPtr->uFlags & TTF_IDISHWND) 1990 lpttsi = (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 1991 else 1992 lpttsi = (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 1993 1994 if (lpttsi) { 1995 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 1996 (LONG)lpttsi->wpOrigProc); 1997 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 1998 COMCTL32_Free (&lpttsi); 1999 } 2000 } 2001 } 2002 COMCTL32_Free (infoPtr->tools); 2060 2003 } 2061 2004 … … 2064 2007 2065 2008 /* free tool tips info data */ 2066 doneControl(hwnd);2067 2009 COMCTL32_Free (infoPtr); 2010 SetWindowLongA(hwnd, 0, 0); 2068 2011 return 0; 2069 2012 } … … 2098 2041 TOOLTIPS_MouseMessage (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 2099 2042 { 2100 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 2101 2102 if (infoPtr->nTrackTool > -1) 2103 { 2104 //CB: tocheck: tracking tool without TTF_TRANSPARENT style 2105 } else 2106 { 2043 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 2044 2107 2045 TOOLTIPS_Hide (hwnd, infoPtr); 2108 } 2109 2110 return 0; 2046 2047 return 0; 2111 2048 } 2112 2049 … … 2115 2052 TOOLTIPS_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam) 2116 2053 { 2117 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE); 2118 DWORD dwExStyle = GetWindowLongA(hwnd,GWL_EXSTYLE); 2054 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); 2119 2055 2120 2056 dwStyle &= 0x0000FFFF; 2121 2057 dwStyle |= (WS_POPUP | WS_BORDER | WS_CLIPSIBLINGS); 2122 SetWindowLongA(hwnd,GWL_STYLE,dwStyle); 2123 2124 SetWindowLongA(hwnd,GWL_EXSTYLE,dwExStyle | WS_EX_TOOLWINDOW); 2058 SetWindowLongA (hwnd, GWL_STYLE, dwStyle); 2125 2059 2126 2060 return TRUE; … … 2134 2068 INT nTool = (infoPtr->bTrackActive) ? infoPtr->nTrackTool : infoPtr->nTool; 2135 2069 2136 // TRACE (tooltips," nTool=%d\n", nTool);2070 TRACE(" nTool=%d\n", nTool); 2137 2071 2138 2072 if ((nTool > -1) && (nTool < infoPtr->uNumTools)) { 2139 2140 // TRACE (tooltips,"-- in transparent mode!\n");2141 2142 2073 if (infoPtr->tools[nTool].uFlags & TTF_TRANSPARENT) { 2074 TRACE("-- in transparent mode!\n"); 2075 return HTTRANSPARENT; 2076 } 2143 2077 } 2144 2078 2145 2079 return DefWindowProcA (hwnd, WM_NCHITTEST, wParam, lParam); 2146 2080 } 2081 2082 2083 static LRESULT 2084 TOOLTIPS_NotifyFormat (HWND hwnd, WPARAM wParam, LPARAM lParam) 2085 { 2086 FIXME ("hwnd=%x wParam=%x lParam=%lx\n", hwnd, wParam, lParam); 2087 2088 return 0; 2089 } 2090 2147 2091 2148 2092 static LRESULT … … 2153 2097 2154 2098 hdc = (wParam == 0) ? BeginPaint (hwnd, &ps) : (HDC)wParam; 2155 TOOLTIPS_ Draw(hwnd, hdc);2099 TOOLTIPS_Refresh (hwnd, hdc); 2156 2100 if (!wParam) 2157 2101 EndPaint (hwnd, &ps); 2158 2102 return 0; 2159 2103 } … … 2167 2111 infoPtr->hFont = (HFONT)wParam; 2168 2112 2169 if ((LOWORD(lParam)) && (infoPtr->nCurrentTool != -1)) 2170 { 2171 /* force repaint */ 2172 if (infoPtr->bActive) TOOLTIPS_Show(hwnd,infoPtr); 2173 else if (infoPtr->bTrackActive) TOOLTIPS_TrackShow(hwnd,infoPtr); 2113 if ((LOWORD(lParam)) && (infoPtr->nCurrentTool != -1)) { 2114 FIXME("full redraw needed!\n"); 2174 2115 } 2175 2116 … … 2186 2127 * returns the length, in characters, of the tip text 2187 2128 ******************************************************************/ 2188 2189 2129 static LRESULT 2190 2130 TOOLTIPS_OnWMGetTextLength(HWND hwnd, WPARAM wParam, LPARAM lParam) … … 2193 2133 return lstrlenW(infoPtr->szTipText); 2194 2134 } 2135 2195 2136 /****************************************************************** 2196 2137 * TOOLTIPS_OnWMGetText … … 2208 2149 { 2209 2150 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 2210 INT length;2211 2151 2212 2152 if(!infoPtr || !(infoPtr->szTipText)) 2213 2153 return 0; 2214 2154 2215 length = lstrlenW(infoPtr->szTipText); 2216 /* When wParam is smaller than the lenght of the tip text 2217 copy wParam characters of the tip text and return wParam */ 2218 if(wParam < length) 2219 { 2220 lstrcpynWtoA((LPSTR)lParam,infoPtr->szTipText,(UINT)wParam);//includes 0 terminator 2221 return wParam; 2222 } 2223 lstrcpyWtoA((LPSTR)lParam,infoPtr->szTipText); 2224 return length; 2225 2155 return WideCharToMultiByte(CP_ACP, 0, infoPtr->szTipText, -1, 2156 (LPSTR)lParam, wParam, NULL, NULL); 2226 2157 } 2227 2158 … … 2230 2161 { 2231 2162 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 2232 2233 // TRACE (tooltips, "timer %d (%x) expired!\n", wParam, hwnd); 2234 switch (wParam) 2235 { 2236 case ID_TIMERSHOW: 2237 KillTimer(hwnd,ID_TIMERSHOW); 2238 if (TOOLTIPS_CheckTool(hwnd,TRUE) == infoPtr->nTool) 2239 TOOLTIPS_Show(hwnd,infoPtr); 2240 break; 2241 2242 case ID_TIMERPOP: 2243 TOOLTIPS_Hide (hwnd, infoPtr); 2244 break; 2245 2246 case ID_TIMERLEAVE: 2247 KillTimer (hwnd,ID_TIMERLEAVE); 2248 if (TOOLTIPS_CheckTool(hwnd,FALSE) == -1) 2249 { 2250 infoPtr->nTool = -1; 2251 infoPtr->nOldTool = -1; 2252 TOOLTIPS_Hide(hwnd,infoPtr); 2253 } 2254 break; 2255 } 2256 2163 INT nOldTool; 2164 2165 TRACE("timer %d (%x) expired!\n", wParam, hwnd); 2166 2167 switch (wParam) { 2168 case ID_TIMERSHOW: 2169 KillTimer (hwnd, ID_TIMERSHOW); 2170 nOldTool = infoPtr->nTool; 2171 if ((infoPtr->nTool = TOOLTIPS_CheckTool (hwnd, TRUE)) == nOldTool) 2172 TOOLTIPS_Show (hwnd, infoPtr); 2173 break; 2174 2175 case ID_TIMERPOP: 2176 TOOLTIPS_Hide (hwnd, infoPtr); 2177 break; 2178 2179 case ID_TIMERLEAVE: 2180 nOldTool = infoPtr->nTool; 2181 infoPtr->nTool = TOOLTIPS_CheckTool (hwnd, FALSE); 2182 TRACE("tool (%x) %d %d %d\n", hwnd, nOldTool, 2183 infoPtr->nTool, infoPtr->nCurrentTool); 2184 if (infoPtr->nTool != nOldTool) { 2185 if(infoPtr->nTool == -1) { /* Moved out of all tools */ 2186 TOOLTIPS_Hide(hwnd, infoPtr); 2187 KillTimer(hwnd, ID_TIMERLEAVE); 2188 } else if (nOldTool == -1) { /* Moved from outside */ 2189 ERR("How did this happen?\n"); 2190 } else { /* Moved from one to another */ 2191 TOOLTIPS_Hide (hwnd, infoPtr); 2192 KillTimer(hwnd, ID_TIMERLEAVE); 2193 if(infoPtr->bActive) { 2194 SetTimer (hwnd, ID_TIMERSHOW, infoPtr->nReshowTime, 0); 2195 TRACE("timer 1 started!\n"); 2196 } 2197 } 2198 } 2199 break; 2200 2201 default: 2202 ERR("Unknown timer id %d\n", wParam); 2203 break; 2204 } 2257 2205 return 0; 2258 2206 } … … 2276 2224 } 2277 2225 2278 LRESULT TOOLTIPS_MouseActivate(HWND hwnd,WPARAM wParam,LPARAM lParam)2279 {2280 return MA_NOACTIVATE;2281 }2282 2226 2283 2227 LRESULT CALLBACK … … 2285 2229 { 2286 2230 LPTT_SUBCLASS_INFO lpttsi = 2287 (LPTT_SUBCLASS_INFO)GetPropA (hwnd, COMCTL32_aSubclass); 2288 TOOLTIPS_INFO *infoPtr; 2289 UINT nTool; 2290 2291 switch (uMsg) { 2292 case WM_LBUTTONDOWN: 2293 case WM_LBUTTONUP: 2294 case WM_MBUTTONDOWN: 2295 case WM_MBUTTONUP: 2296 case WM_RBUTTONDOWN: 2297 case WM_RBUTTONUP: 2298 infoPtr = TOOLTIPS_GetInfoPtr(lpttsi->hwndToolTip); 2299 if (!infoPtr) break; 2300 nTool = TOOLTIPS_GetToolFromMessage (infoPtr, hwnd); 2301 2302 infoPtr->nOldTool = infoPtr->nTool; 2303 infoPtr->nTool = nTool; 2304 TOOLTIPS_Hide (lpttsi->hwndToolTip, infoPtr); 2305 break; 2306 2307 case WM_MOUSEMOVE: 2308 infoPtr = TOOLTIPS_GetInfoPtr (lpttsi->hwndToolTip); 2309 if (!infoPtr) break; 2310 nTool = TOOLTIPS_GetToolFromMessage (infoPtr, hwnd); 2311 2312 infoPtr->nOldTool = infoPtr->nTool; 2313 infoPtr->nTool = nTool; 2314 2315 if ((infoPtr->bActive) && 2316 (infoPtr->nTool != infoPtr->nOldTool)) { 2317 if (infoPtr->nOldTool == -1) { 2318 SetTimer (hwnd, ID_TIMERSHOW, 2319 infoPtr->nInitialTime, 0); 2320 //TRACE (tooltips, "timer 1 started!\n"); 2321 } 2322 else { 2323 TOOLTIPS_Hide (lpttsi->hwndToolTip, infoPtr); 2324 SetTimer (hwnd, ID_TIMERSHOW, 2325 infoPtr->nReshowTime, 0); 2326 // TRACE (tooltips, "timer 2 started!\n"); 2327 } 2328 } 2329 if (infoPtr->nCurrentTool != -1) { 2330 SetTimer (hwnd, ID_TIMERLEAVE, 100, 0); 2331 // TRACE (tooltips, "timer 3 started!\n"); 2332 } 2333 break; 2334 } 2335 2231 (LPTT_SUBCLASS_INFO)GetPropA (hwnd, COMCTL32_aSubclass); 2232 MSG msg; 2233 2234 switch(uMsg) { 2235 case WM_MOUSEMOVE: 2236 case WM_LBUTTONDOWN: 2237 case WM_LBUTTONUP: 2238 case WM_MBUTTONDOWN: 2239 case WM_MBUTTONUP: 2240 case WM_RBUTTONDOWN: 2241 case WM_RBUTTONUP: 2242 msg.hwnd = hwnd; 2243 msg.message = uMsg; 2244 msg.wParam = wParam; 2245 msg.lParam = lParam; 2246 TOOLTIPS_RelayEvent(lpttsi->hwndToolTip, 0, (LPARAM)&msg); 2247 break; 2248 2249 default: 2250 break; 2251 } 2336 2252 return CallWindowProcA (lpttsi->wpOrigProc, hwnd, uMsg, wParam, lParam); 2337 2253 } … … 2341 2257 TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 2342 2258 { 2259 TRACE("hwnd=%x msg=%x wparam=%x lParam=%lx\n", hwnd, uMsg, wParam, lParam); 2260 if (!TOOLTIPS_GetInfoPtr(hwnd) && (uMsg != WM_CREATE) && (uMsg != WM_NCCREATE)) 2261 return DefWindowProcA (hwnd, uMsg, wParam, lParam); 2343 2262 switch (uMsg) 2344 2263 { 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2264 case TTM_ACTIVATE: 2265 return TOOLTIPS_Activate (hwnd, wParam, lParam); 2266 2267 case TTM_ADDTOOLA: 2268 return TOOLTIPS_AddToolA (hwnd, wParam, lParam); 2269 2270 case TTM_ADDTOOLW: 2271 return TOOLTIPS_AddToolW (hwnd, wParam, lParam); 2272 2273 case TTM_DELTOOLA: 2274 return TOOLTIPS_DelToolA (hwnd, wParam, lParam); 2275 2276 case TTM_DELTOOLW: 2277 return TOOLTIPS_DelToolW (hwnd, wParam, lParam); 2278 2279 case TTM_ENUMTOOLSA: 2280 return TOOLTIPS_EnumToolsA (hwnd, wParam, lParam); 2281 2282 case TTM_ENUMTOOLSW: 2283 return TOOLTIPS_EnumToolsW (hwnd, wParam, lParam); 2284 2285 case TTM_GETCURRENTTOOLA: 2286 return TOOLTIPS_GetCurrentToolA (hwnd, wParam, lParam); 2287 2288 case TTM_GETCURRENTTOOLW: 2289 return TOOLTIPS_GetCurrentToolW (hwnd, wParam, lParam); 2290 2291 case TTM_GETDELAYTIME: 2292 return TOOLTIPS_GetDelayTime (hwnd, wParam, lParam); 2293 2294 case TTM_GETMARGIN: 2295 return TOOLTIPS_GetMargin (hwnd, wParam, lParam); 2296 2297 case TTM_GETMAXTIPWIDTH: 2298 return TOOLTIPS_GetMaxTipWidth (hwnd, wParam, lParam); 2299 2300 case TTM_GETTEXTA: 2301 return TOOLTIPS_GetTextA (hwnd, wParam, lParam); 2302 2303 case TTM_GETTEXTW: 2304 return TOOLTIPS_GetTextW (hwnd, wParam, lParam); 2305 2306 case TTM_GETTIPBKCOLOR: 2307 return TOOLTIPS_GetTipBkColor (hwnd, wParam, lParam); 2308 2309 case TTM_GETTIPTEXTCOLOR: 2310 return TOOLTIPS_GetTipTextColor (hwnd, wParam, lParam); 2311 2312 case TTM_GETTOOLCOUNT: 2313 return TOOLTIPS_GetToolCount (hwnd, wParam, lParam); 2314 2315 case TTM_GETTOOLINFOA: 2316 return TOOLTIPS_GetToolInfoA (hwnd, wParam, lParam); 2317 2318 case TTM_GETTOOLINFOW: 2319 return TOOLTIPS_GetToolInfoW (hwnd, wParam, lParam); 2320 2321 case TTM_HITTESTA: 2322 return TOOLTIPS_HitTestA (hwnd, wParam, lParam); 2323 2324 case TTM_HITTESTW: 2325 return TOOLTIPS_HitTestW (hwnd, wParam, lParam); 2326 2327 case TTM_NEWTOOLRECTA: 2328 return TOOLTIPS_NewToolRectA (hwnd, wParam, lParam); 2329 2330 case TTM_NEWTOOLRECTW: 2331 return TOOLTIPS_NewToolRectW (hwnd, wParam, lParam); 2332 2333 case TTM_POP: 2334 return TOOLTIPS_Pop (hwnd, wParam, lParam); 2335 2336 case TTM_RELAYEVENT: 2337 return TOOLTIPS_RelayEvent (hwnd, wParam, lParam); 2338 2339 case TTM_SETDELAYTIME: 2340 return TOOLTIPS_SetDelayTime (hwnd, wParam, lParam); 2341 2342 case TTM_SETMARGIN: 2343 return TOOLTIPS_SetMargin (hwnd, wParam, lParam); 2344 2345 case TTM_SETMAXTIPWIDTH: 2346 return TOOLTIPS_SetMaxTipWidth (hwnd, wParam, lParam); 2347 2348 case TTM_SETTIPBKCOLOR: 2349 return TOOLTIPS_SetTipBkColor (hwnd, wParam, lParam); 2350 2351 case TTM_SETTIPTEXTCOLOR: 2352 return TOOLTIPS_SetTipTextColor (hwnd, wParam, lParam); 2353 2354 case TTM_SETTOOLINFOA: 2355 return TOOLTIPS_SetToolInfoA (hwnd, wParam, lParam); 2356 2357 case TTM_SETTOOLINFOW: 2358 return TOOLTIPS_SetToolInfoW (hwnd, wParam, lParam); 2359 2360 case TTM_TRACKACTIVATE: 2361 return TOOLTIPS_TrackActivate (hwnd, wParam, lParam); 2362 2363 case TTM_TRACKPOSITION: 2364 return TOOLTIPS_TrackPosition (hwnd, wParam, lParam); 2365 2366 case TTM_UPDATE: 2367 return TOOLTIPS_Update (hwnd, wParam, lParam); 2368 2369 case TTM_UPDATETIPTEXTA: 2370 return TOOLTIPS_UpdateTipTextA (hwnd, wParam, lParam); 2371 2372 case TTM_UPDATETIPTEXTW: 2373 return TOOLTIPS_UpdateTipTextW (hwnd, wParam, lParam); 2374 2375 case TTM_WINDOWFROMPOINT: 2376 return TOOLTIPS_WindowFromPoint (hwnd, wParam, lParam); 2377 2378 2379 case WM_CREATE: 2380 return TOOLTIPS_Create (hwnd, wParam, lParam); 2381 2382 case WM_DESTROY: 2383 return TOOLTIPS_Destroy (hwnd, wParam, lParam); 2384 2385 case WM_ERASEBKGND: 2386 return TOOLTIPS_EraseBackground (hwnd, wParam, lParam); 2387 2388 case WM_GETFONT: 2389 return TOOLTIPS_GetFont (hwnd, wParam, lParam); 2471 2390 2472 2391 case WM_GETTEXT: 2473 2392 return TOOLTIPS_OnWMGetText (hwnd, wParam, lParam); 2474 2393 2475 2394 case WM_GETTEXTLENGTH: 2476 2395 return TOOLTIPS_OnWMGetTextLength (hwnd, wParam, lParam); 2477 2478 2479 case WM_LBUTTONDOWN: 2480 case WM_LBUTTONUP: 2481 case WM_LBUTTONDBLCLK: 2482 case WM_MBUTTONDOWN: 2483 case WM_MBUTTONUP: 2484 case WM_MBUTTONDBLCLK: 2485 case WM_RBUTTONDOWN: 2486 case WM_RBUTTONUP: 2487 case WM_RBUTTONDBLCLK: 2488 case WM_MOUSEMOVE: 2489 return TOOLTIPS_MouseMessage (hwnd, uMsg, wParam, lParam); 2490 2491 case WM_MOUSEACTIVATE: 2492 return TOOLTIPS_MouseActivate(hwnd,wParam,lParam); 2493 2494 case WM_NCCREATE: 2495 return TOOLTIPS_NCCreate (hwnd, wParam, lParam); 2496 2497 case WM_NCHITTEST: 2498 return TOOLTIPS_NCHitTest (hwnd, wParam, lParam); 2499 2500 case WM_PAINT: 2501 return TOOLTIPS_Paint (hwnd, wParam, lParam); 2502 2503 case WM_SETFONT: 2504 return TOOLTIPS_SetFont (hwnd, wParam, lParam); 2505 2506 case WM_TIMER: 2507 return TOOLTIPS_Timer (hwnd, wParam, lParam); 2508 2509 case WM_WININICHANGE: 2510 return TOOLTIPS_WinIniChange (hwnd, wParam, lParam); 2511 2512 default: 2513 // if (uMsg >= WM_USER) 2514 // ERR (tooltips, "unknown msg %04x wp=%08x lp=%08lx\n", 2515 // uMsg, wParam, lParam); 2516 return defComCtl32ProcA (hwnd, uMsg, wParam, lParam); 2396 2397 2398 case WM_LBUTTONDOWN: 2399 case WM_LBUTTONUP: 2400 case WM_MBUTTONDOWN: 2401 case WM_MBUTTONUP: 2402 case WM_RBUTTONDOWN: 2403 case WM_RBUTTONUP: 2404 case WM_MOUSEMOVE: 2405 return TOOLTIPS_MouseMessage (hwnd, uMsg, wParam, lParam); 2406 2407 case WM_NCCREATE: 2408 return TOOLTIPS_NCCreate (hwnd, wParam, lParam); 2409 2410 case WM_NCHITTEST: 2411 return TOOLTIPS_NCHitTest (hwnd, wParam, lParam); 2412 2413 case WM_NOTIFYFORMAT: 2414 return TOOLTIPS_NotifyFormat (hwnd, wParam, lParam); 2415 2416 case WM_PAINT: 2417 return TOOLTIPS_Paint (hwnd, wParam, lParam); 2418 2419 case WM_SETFONT: 2420 return TOOLTIPS_SetFont (hwnd, wParam, lParam); 2421 2422 case WM_TIMER: 2423 return TOOLTIPS_Timer (hwnd, wParam, lParam); 2424 2425 case WM_WININICHANGE: 2426 return TOOLTIPS_WinIniChange (hwnd, wParam, lParam); 2427 2428 default: 2429 if (uMsg >= WM_USER) 2430 ERR("unknown msg %04x wp=%08x lp=%08lx\n", 2431 uMsg, wParam, lParam); 2432 return DefWindowProcA (hwnd, uMsg, wParam, lParam); 2517 2433 } 2518 2434 return 0; … … 2521 2437 2522 2438 VOID 2523 TOOLTIPS_Register ( VOID)2439 TOOLTIPS_Register (void) 2524 2440 { 2525 2441 WNDCLASSA wndClass; … … 2533 2449 wndClass.hbrBackground = 0; 2534 2450 wndClass.lpszClassName = TOOLTIPS_CLASSA; 2535 2451 2536 2452 RegisterClassA (&wndClass); 2537 2453 } … … 2539 2455 2540 2456 VOID 2541 TOOLTIPS_Unregister ( VOID)2457 TOOLTIPS_Unregister (void) 2542 2458 { 2543 2459 UnregisterClassA (TOOLTIPS_CLASSA, (HINSTANCE)NULL);
Note:
See TracChangeset
for help on using the changeset viewer.