Changeset 3963 for trunk/src/comctl32/tooltips.cpp
- Timestamp:
- Aug 6, 2000, 10:31:01 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/tooltips.cpp
r3962 r3963 1 /* $Id: tooltips.cpp,v 1. 9 2000-08-06 14:40:18sandervl Exp $ */1 /* $Id: tooltips.cpp,v 1.10 2000-08-06 20:28:29 sandervl Exp $ */ 2 2 /* 3 3 * Tool tip control … … 8 8 * 9 9 * TODO: 10 * - Unicode support (started).11 10 * - Custom draw support. 12 11 * … … 16 15 * curtool.exe, deltool.exe, enumtools.exe, getinfo.exe, getiptxt.exe, 17 16 * 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 get22 * a WM_MOUSEMOVE once the cursor leaves the tool, an example is when23 * a tool sets TTF_IDISHWND (i.e. an entire window is a tool) because24 * here WM_MOUSEMOVEs only get sent when the cursor is inside the25 * client area. Therefore the only reliable way to know that the26 * cursor has left a tool is to keep a timer running and check the27 * position every time it expires. This is the role of timer28 * ID_TIMERLEAVE.29 *30 *31 * On entering a tool (detected in a relayed WM_MOUSEMOVE) we start32 * ID_TIMERSHOW, if this times out and we're still in the tool we show33 * the tip. On showing a tip we start both ID_TIMERPOP and34 * ID_TIMERLEAVE. On hiding a tooltip we kill ID_TIMERPOP.35 * ID_TIMERPOP is restarted on every relayed WM_MOUSEMOVE. If36 * ID_TIMERPOP expires the tool is hidden and ID_TIMERPOP is killed.37 * ID_TIMERLEAVE remains running - this is important as we need to38 * determine when the cursor leaves the tool.39 *40 * When ID_TIMERLEAVE expires or on a relayed WM_MOUSEMOVE if we're41 * still in the tool do nothing (apart from restart ID_TIMERPOP if42 * this is a WM_MOUSEMOVE) (ID_TIMERLEAVE remains running). If we've43 * left the tool and entered another one then hide the tip and start44 * ID_TIMERSHOW with time ReshowTime and kill ID_TIMERLEAVE. If we're45 * outside all tools hide the tip and kill ID_TIMERLEAVE. On Relayed46 * mouse button messages hide the tip but leave ID_TIMERLEAVE running,47 * this again will let us keep track of when the cursor leaves the48 * tool.49 *50 *51 * infoPtr->nTool is the tool the mouse was on on the last relayed MM52 * 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 currently55 * displaying text for or -1 if the tip is not shown. Actually this56 * will only ever be infoPtr-nTool or -1, so it could be changed to a57 * BOOL.58 *59 17 */ 60 18 61 19 /* 62 - (WINE 20000801 level) 20 - Corel WINE 20000513 level 21 - (WINE 20000130 level) 63 22 */ 64 23 65 24 #include <string.h> 66 25 67 #include "winnls.h"68 26 #include "winbase.h" 69 27 #include "commctrl.h" … … 76 34 #define ID_TIMERLEAVE 3 /* tool leave timer */ 77 35 78 #ifdef __WIN32OS2__79 #define FIXME80 #define TRACE81 #define WARN82 #define ERR83 #define debugstr_w84 #endif85 36 86 37 extern LPSTR COMCTL32_aSubclass; /* global subclassing atom */ … … 94 45 TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 95 46 96 static VOID 97 TOOLTIPS_Refresh(HWND hwnd, HDC hdc)47 48 static VOID TOOLTIPS_Draw (HWND hwnd, HDC hdc) 98 49 { 99 50 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(hwnd); … … 104 55 UINT uFlags = DT_EXTERNALLEADING; 105 56 57 if (infoPtr->nMaxTipWidth > -1) uFlags |= DT_WORDBREAK; 58 if (GetWindowLongA(hwnd,GWL_STYLE) & TTS_NOPREFIX) uFlags |= DT_NOPREFIX; 59 GetClientRect(hwnd,&rc); 60 61 /* fill the background */ 62 hBrush = CreateSolidBrush(infoPtr->clrBk); 63 FillRect(hdc,&rc,hBrush); 64 DeleteObject(hBrush); 65 66 /* 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); 71 72 /* 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) 179 { 180 TTTOOL_INFO *toolPtr = &infoPtr->tools[nTool]; 181 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 106 212 if (infoPtr->nMaxTipWidth > -1) 107 uFlags |= DT_WORDBREAK; 108 if (GetWindowLongA (hwnd, GWL_STYLE) & TTS_NOPREFIX) 109 uFlags |= DT_NOPREFIX; 110 GetClientRect (hwnd, &rc); 111 112 /* fill the background */ 113 hBrush = CreateSolidBrush (infoPtr->clrBk); 114 FillRect (hdc, &rc, hBrush); 115 DeleteObject (hBrush); 116 117 /* calculate text rectangle */ 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); 122 123 /* draw text */ 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) 136 { 137 TTTOOL_INFO *toolPtr = &infoPtr->tools[nTool]; 138 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 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 } 217 308 218 309 static VOID … … 225 316 226 317 if (infoPtr->nMaxTipWidth > -1) { 227 228 318 rc.right = infoPtr->nMaxTipWidth; 319 uFlags |= DT_WORDBREAK; 229 320 } 230 321 if (GetWindowLongA (hwnd, GWL_STYLE) & TTS_NOPREFIX) 231 232 TRACE("%s\n", debugstr_w(infoPtr->szTipText));322 uFlags |= DT_NOPREFIX; 323 //TRACE("\"%s\"\n", debugstr_w(infoPtr->szTipText)); 233 324 234 325 hdc = GetDC (hwnd); … … 238 329 ReleaseDC (hwnd, hdc); 239 330 240 lpSize->cx = rc.right - rc.left + 4 + 241 331 lpSize->cx = rc.right - rc.left + 4 + 332 infoPtr->rcMargin.left + infoPtr->rcMargin.right; 242 333 lpSize->cy = rc.bottom - rc.top + 4 + 243 infoPtr->rcMargin.bottom + infoPtr->rcMargin.top; 244 } 245 334 infoPtr->rcMargin.bottom + infoPtr->rcMargin.top; 335 } 246 336 247 337 static VOID … … 251 341 RECT rect, wndrect; 252 342 SIZE size; 343 HDC hdc; 253 344 NMHDR hdr; 254 345 255 346 if (infoPtr->nTool == -1) { 256 257 347 // TRACE("invalid tool (-1)!\n"); 348 return; 258 349 } 259 350 260 351 infoPtr->nCurrentTool = infoPtr->nTool; 261 352 262 TRACE("Show tooltip pre %d! (%04x)\n", infoPtr->nTool, hwnd);353 // TRACE("Show tooltip pre %d!\n", infoPtr->nTool); 263 354 264 355 TOOLTIPS_GetTipText (hwnd, infoPtr, infoPtr->nCurrentTool); 265 356 266 357 if (infoPtr->szTipText[0] == L'\0') { 267 268 269 } 270 271 TRACE("Show tooltip %d!\n", infoPtr->nCurrentTool);358 infoPtr->nCurrentTool = -1; 359 return; 360 } 361 362 // TRACE("Show tooltip %d!\n", infoPtr->nCurrentTool); 272 363 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; 273 364 … … 276 367 hdr.code = TTN_SHOW; 277 368 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 278 279 280 TRACE("%s\n", debugstr_w(infoPtr->szTipText));369 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 370 371 // TRACE("\"%s\"\n", debugstr_w(infoPtr->szTipText)); 281 372 282 373 TOOLTIPS_CalcTipSize (hwnd, infoPtr, &size); 283 TRACE("size %d - %d\n", size.cx, size.cy);374 // TRACE("size %d - %d\n", size.cx, size.cy); 284 375 285 376 if (toolPtr->uFlags & TTF_CENTERTIP) { 286 287 288 289 290 291 292 293 294 295 377 RECT rc; 378 379 if (toolPtr->uFlags & TTF_IDISHWND) 380 GetWindowRect ((HWND)toolPtr->uId, &rc); 381 else { 382 rc = toolPtr->rect; 383 MapWindowPoints (toolPtr->hwnd, (HWND)0, (LPPOINT)&rc, 2); 384 } 385 rect.left = (rc.left + rc.right - size.cx) / 2; 386 rect.top = rc.bottom + 2; 296 387 } 297 388 else { 298 299 300 } 301 302 TRACE("pos %d - %d\n", rect.left, rect.top);389 GetCursorPos ((LPPOINT)&rect); 390 rect.top += 20; 391 } 392 393 // TRACE("pos %d - %d\n", rect.left, rect.top); 303 394 304 395 rect.right = rect.left + size.cx; … … 308 399 wndrect.right = GetSystemMetrics( SM_CXSCREEN ); 309 400 if( rect.right > wndrect.right ) { 310 311 401 rect.left -= rect.right - wndrect.right + 2; 402 rect.right = wndrect.right - 2; 312 403 } 313 404 wndrect.bottom = GetSystemMetrics( SM_CYSCREEN ); … … 315 406 RECT rc; 316 407 317 318 319 320 321 322 } 323 324 408 if (toolPtr->uFlags & TTF_IDISHWND) 409 GetWindowRect ((HWND)toolPtr->uId, &rc); 410 else { 411 rc = toolPtr->rect; 412 MapWindowPoints (toolPtr->hwnd, (HWND)0, (LPPOINT)&rc, 2); 413 } 414 rect.bottom = rc.top - 2; 415 rect.top = rect.bottom - size.cy; 325 416 } 326 417 327 418 AdjustWindowRectEx (&rect, GetWindowLongA (hwnd, GWL_STYLE), 328 419 FALSE, GetWindowLongA (hwnd, GWL_EXSTYLE)); 329 420 330 421 SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top, 331 332 422 rect.right - rect.left, rect.bottom - rect.top, 423 SWP_SHOWWINDOW | SWP_NOACTIVATE); 333 424 334 425 /* repaint the tooltip */ 335 InvalidateRect(hwnd, NULL, TRUE); 336 UpdateWindow(hwnd); 426 hdc = GetDC (hwnd); 427 TOOLTIPS_Draw(hwnd, hdc); 428 ReleaseDC (hwnd, hdc); 337 429 338 430 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");342 431 } 343 432 … … 349 438 NMHDR hdr; 350 439 351 TRACE("Hide tooltip %d! (%04x)\n", infoPtr->nCurrentTool, hwnd);352 353 440 if (infoPtr->nCurrentTool == -1) 354 441 return; 355 442 356 443 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; 444 //TRACE (tooltips, "Hide tooltip %d!\n", infoPtr->nCurrentTool); 357 445 KillTimer (hwnd, ID_TIMERPOP); 358 446 … … 361 449 hdr.code = TTN_POP; 362 450 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 363 451 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 364 452 365 453 infoPtr->nCurrentTool = -1; 366 454 367 455 SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, 368 456 SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE); 369 457 } 370 458 … … 375 463 TTTOOL_INFO *toolPtr; 376 464 RECT rect; 377 SIZE size;465 HDC hdc; 378 466 NMHDR hdr; 379 467 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); 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); 395 485 toolPtr = &infoPtr->tools[infoPtr->nTrackTool]; 396 486 … … 398 488 hdr.idFrom = toolPtr->uId; 399 489 hdr.code = TTN_SHOW; 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); 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); 455 503 } 456 504 … … 463 511 464 512 if (infoPtr->nTrackTool == -1) 465 513 return; 466 514 467 515 toolPtr = &infoPtr->tools[infoPtr->nTrackTool]; 468 TRACE("hide tracking tooltip %d!\n", infoPtr->nTrackTool);516 // TRACE (tooltips, "hide tracking tooltip %d!\n", infoPtr->nTrackTool); 469 517 470 518 hdr.hwndFrom = hwnd; … … 472 520 hdr.code = TTN_POP; 473 521 SendMessageA (toolPtr->hwnd, WM_NOTIFY, 474 522 (WPARAM)toolPtr->uId, (LPARAM)&hdr); 475 523 476 524 SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, 477 525 SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE); 478 526 } 479 527 … … 486 534 487 535 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 488 489 490 if (!(toolPtr->uFlags & TTF_IDISHWND) && 491 492 493 536 toolPtr = &infoPtr->tools[nTool]; 537 538 if (!(toolPtr->uFlags & TTF_IDISHWND) && 539 (lpToolInfo->hwnd == toolPtr->hwnd) && 540 (lpToolInfo->uId == toolPtr->uId)) 541 return nTool; 494 542 } 495 543 496 544 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 497 498 499 500 501 545 toolPtr = &infoPtr->tools[nTool]; 546 547 if ((toolPtr->uFlags & TTF_IDISHWND) && 548 (lpToolInfo->uId == toolPtr->uId)) 549 return nTool; 502 550 } 503 551 … … 513 561 514 562 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 515 516 517 if (!(toolPtr->uFlags & TTF_IDISHWND) && 518 519 520 563 toolPtr = &infoPtr->tools[nTool]; 564 565 if (!(toolPtr->uFlags & TTF_IDISHWND) && 566 (lpToolInfo->hwnd == toolPtr->hwnd) && 567 (lpToolInfo->uId == toolPtr->uId)) 568 return nTool; 521 569 } 522 570 523 571 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 524 525 526 527 528 572 toolPtr = &infoPtr->tools[nTool]; 573 574 if ((toolPtr->uFlags & TTF_IDISHWND) && 575 (lpToolInfo->uId == toolPtr->uId)) 576 return nTool; 529 577 } 530 578 … … 539 587 INT nTool; 540 588 589 //@@@AH 2000/02/25 make sure we don't get garbage in 590 if (!infoPtr) 591 { 592 dprintf(("Tooltips:GetToolFromPoint: infoPtr == NULL!!!\n")); 593 return 0; 594 } 595 541 596 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 542 543 544 545 546 547 548 549 550 597 toolPtr = &infoPtr->tools[nTool]; 598 599 if (!(toolPtr->uFlags & TTF_IDISHWND)) { 600 if (hwnd != toolPtr->hwnd) 601 continue; 602 if (!PtInRect (&toolPtr->rect, *lpPt)) 603 continue; 604 return nTool; 605 } 551 606 } 552 607 553 608 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) { 554 555 556 557 558 559 609 toolPtr = &infoPtr->tools[nTool]; 610 611 if (toolPtr->uFlags & TTF_IDISHWND) { 612 if ((HWND)toolPtr->uId == hwnd) 613 return nTool; 614 } 560 615 } 561 616 562 617 return -1; 618 } 619 620 621 static INT 622 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); 563 633 } 564 634 … … 569 639 HWND hwndActive = GetActiveWindow (); 570 640 if (!hwndActive) 571 641 return FALSE; 572 642 if (hwndActive == hwnd) 573 643 return TRUE; 574 644 return IsChild (hwndActive, hwnd); 575 645 } … … 587 657 hwndTool = SendMessageA (hwnd, TTM_WINDOWFROMPOINT, 0, (LPARAM)&pt); 588 658 if (hwndTool == 0) 589 659 return -1; 590 660 591 661 ScreenToClient (hwndTool, &pt); 592 662 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, hwndTool, &pt); 593 663 if (nTool == -1) 594 664 return -1; 595 665 596 666 if (!(GetWindowLongA (hwnd, GWL_STYLE) & TTS_ALWAYSTIP) && bShowTest) { 597 if (!TOOLTIPS_IsWindowActive (GetWindow (hwnd, GW_OWNER))) 598 return -1; 599 } 600 601 TRACE("tool %d\n", nTool); 667 if (!TOOLTIPS_IsWindowActive (GetWindow (hwnd, GW_OWNER))) 668 return -1; 669 } 602 670 603 671 return nTool; … … 608 676 TOOLTIPS_Activate (HWND hwnd, WPARAM wParam, LPARAM lParam) 609 677 { 610 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr 678 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(hwnd); 611 679 612 680 infoPtr->bActive = (BOOL)wParam; 613 681 614 if (infoPtr->bActive)615 TRACE("activate!\n");616 617 682 if (!(infoPtr->bActive) && (infoPtr->nCurrentTool != -1)) 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); 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); 628 767 LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam; 629 768 TTTOOL_INFO *toolPtr; 630 769 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]; 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 } 652 813 } 653 814 … … 661 822 toolPtr->hinst = lpToolInfo->hinst; 662 823 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 } 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; 681 842 682 843 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 683 844 toolPtr->lParam = lpToolInfo->lParam; 684 845 685 846 /* install subclassing hook */ 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 } 847 TOOLTIPS_Subclass(hwnd,toolPtr); 722 848 723 849 return TRUE; … … 733 859 734 860 if (lpToolInfo == NULL) 735 861 return FALSE; 736 862 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 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]; 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 } 755 905 } 756 906 … … 765 915 766 916 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 767 TRACE("add string id %x!\n", (int)lpToolInfo->lpszText);768 917 // TRACE (tooltips, "add string id %x!\n", (int)lpToolInfo->lpszText); 918 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 769 919 } 770 920 else if (lpToolInfo->lpszText) { 771 772 TRACE("add CALLBACK!\n");773 774 775 776 777 TRACE("add text %s!\n",778 779 toolPtr->lpszText =(WCHAR*)COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));780 781 921 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) { 922 // TRACE (tooltips, "add CALLBACK!\n"); 923 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 924 } 925 else { 926 INT len = lstrlenW (lpToolInfo->lpszText); 927 // TRACE (tooltips, "add text \"%s\"!\n", 928 // debugstr_w(lpToolInfo->lpszText)); 929 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc ((len + 1)*sizeof(WCHAR)); 930 lstrcpyW (toolPtr->lpszText, lpToolInfo->lpszText); 931 } 782 932 } 783 933 784 934 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 785 935 toolPtr->lParam = lpToolInfo->lParam; 786 936 787 937 /* install subclassing hook */ 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 } 938 TOOLTIPS_Subclass(hwnd,toolPtr); 824 939 825 940 return TRUE; … … 836 951 837 952 if (lpToolInfo == NULL) 838 953 return 0; 839 954 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 840 955 return 0; 841 956 if (infoPtr->uNumTools == 0) 842 957 return 0; 843 958 844 959 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 845 960 if (nTool == -1) return 0; 846 961 847 TRACE("tool %d\n", nTool);962 // TRACE (tooltips, "tool %d\n", nTool); 848 963 849 964 /* delete text string */ 850 toolPtr = &infoPtr->tools[nTool]; 965 toolPtr = &infoPtr->tools[nTool]; 851 966 if ((toolPtr->hinst) && (toolPtr->lpszText)) { 852 853 854 967 if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && 968 (HIWORD((INT)toolPtr->lpszText) != 0) ) 969 COMCTL32_Free (toolPtr->lpszText); 855 970 } 856 971 857 972 /* remove subclassing */ 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 } 973 TOOLTIPS_Desubclass(toolPtr); 888 974 889 975 /* delete tool from tool list */ 890 976 if (infoPtr->uNumTools == 1) { 891 892 977 COMCTL32_Free (infoPtr->tools); 978 infoPtr->tools = NULL; 893 979 } 894 980 else { 895 896 897 898 899 900 901 902 903 904 905 906 907 981 TTTOOL_INFO *oldTools = infoPtr->tools; 982 infoPtr->tools = 983 (TTTOOL_INFO*)COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1)); 984 985 if (nTool > 0) 986 memcpy (&infoPtr->tools[0], &oldTools[0], 987 nTool * sizeof(TTTOOL_INFO)); 988 989 if (nTool < infoPtr->uNumTools - 1) 990 memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1], 991 (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO)); 992 993 COMCTL32_Free (oldTools); 908 994 } 909 995 … … 923 1009 924 1010 if (lpToolInfo == NULL) 925 1011 return 0; 926 1012 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 927 1013 return 0; 928 1014 if (infoPtr->uNumTools == 0) 929 1015 return 0; 930 1016 931 1017 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 932 1018 if (nTool == -1) return 0; 933 1019 934 TRACE("tool %d\n", nTool);1020 // TRACE (tooltips, "tool %d\n", nTool); 935 1021 936 1022 /* delete text string */ 937 toolPtr = &infoPtr->tools[nTool]; 1023 toolPtr = &infoPtr->tools[nTool]; 938 1024 if ((toolPtr->hinst) && (toolPtr->lpszText)) { 939 940 941 1025 if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && 1026 (HIWORD((INT)toolPtr->lpszText) != 0) ) 1027 COMCTL32_Free (toolPtr->lpszText); 942 1028 } 943 1029 944 1030 /* remove subclassing */ 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 } 1031 TOOLTIPS_Desubclass(toolPtr); 975 1032 976 1033 /* delete tool from tool list */ 977 1034 if (infoPtr->uNumTools == 1) { 978 979 1035 COMCTL32_Free (infoPtr->tools); 1036 infoPtr->tools = NULL; 980 1037 } 981 1038 else { 982 983 984 985 986 987 988 989 990 991 992 993 994 1039 TTTOOL_INFO *oldTools = infoPtr->tools; 1040 infoPtr->tools = 1041 (TTTOOL_INFO*)COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1)); 1042 1043 if (nTool > 0) 1044 memcpy (&infoPtr->tools[0], &oldTools[0], 1045 nTool * sizeof(TTTOOL_INFO)); 1046 1047 if (nTool < infoPtr->uNumTools - 1) 1048 memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1], 1049 (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO)); 1050 1051 COMCTL32_Free (oldTools); 995 1052 } 996 1053 … … 1010 1067 1011 1068 if (lpToolInfo == NULL) 1012 1069 return FALSE; 1013 1070 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1014 1071 return FALSE; 1015 1072 if (uIndex >= infoPtr->uNumTools) 1016 1017 1018 TRACE("index=%u\n", uIndex);1073 return FALSE; 1074 1075 // TRACE (tooltips, "index=%u\n", uIndex); 1019 1076 1020 1077 toolPtr = &infoPtr->tools[uIndex]; … … 1030 1087 1031 1088 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1032 1089 lpToolInfo->lParam = toolPtr->lParam; 1033 1090 1034 1091 return TRUE; … … 1045 1102 1046 1103 if (lpToolInfo == NULL) 1047 1104 return FALSE; 1048 1105 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1049 1106 return FALSE; 1050 1107 if (uIndex >= infoPtr->uNumTools) 1051 1052 1053 TRACE("index=%u\n", uIndex);1108 return FALSE; 1109 1110 // TRACE (tooltips, "index=%u\n", uIndex); 1054 1111 1055 1112 toolPtr = &infoPtr->tools[uIndex]; … … 1065 1122 1066 1123 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1067 1124 lpToolInfo->lParam = toolPtr->lParam; 1068 1125 1069 1126 return TRUE; … … 1079 1136 1080 1137 if (lpToolInfo == NULL) 1081 1138 return FALSE; 1082 1139 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1083 1140 return FALSE; 1084 1141 1085 1142 if (lpToolInfo) { 1086 1087 1088 1089 1090 1091 1092 1093 /* 1094 1095 1096 1097 1098 1099 1100 1101 1102 1143 if (infoPtr->nCurrentTool > -1) { 1144 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; 1145 1146 /* copy tool data */ 1147 lpToolInfo->uFlags = toolPtr->uFlags; 1148 lpToolInfo->rect = toolPtr->rect; 1149 lpToolInfo->hinst = toolPtr->hinst; 1150 /* lpToolInfo->lpszText = toolPtr->lpszText; */ 1151 lpToolInfo->lpszText = NULL; /* FIXME */ 1152 1153 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1154 lpToolInfo->lParam = toolPtr->lParam; 1155 1156 return TRUE; 1157 } 1158 else 1159 return FALSE; 1103 1160 } 1104 1161 else 1105 1162 return (infoPtr->nCurrentTool != -1); 1106 1163 1107 1164 return FALSE; … … 1117 1174 1118 1175 if (lpToolInfo == NULL) 1119 1176 return FALSE; 1120 1177 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1121 1178 return FALSE; 1122 1179 1123 1180 if (lpToolInfo) { 1124 1125 1126 1127 1128 1129 1130 1131 /* 1132 1133 1134 1135 1136 1137 1138 1139 1140 1181 if (infoPtr->nCurrentTool > -1) { 1182 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool]; 1183 1184 /* copy tool data */ 1185 lpToolInfo->uFlags = toolPtr->uFlags; 1186 lpToolInfo->rect = toolPtr->rect; 1187 lpToolInfo->hinst = toolPtr->hinst; 1188 /* lpToolInfo->lpszText = toolPtr->lpszText; */ 1189 lpToolInfo->lpszText = NULL; /* FIXME */ 1190 1191 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1192 lpToolInfo->lParam = toolPtr->lParam; 1193 1194 return TRUE; 1195 } 1196 else 1197 return FALSE; 1141 1198 } 1142 1199 else 1143 1200 return (infoPtr->nCurrentTool != -1); 1144 1201 1145 1202 return FALSE; … … 1153 1210 1154 1211 switch (wParam) { 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; 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; 1171 1226 } 1172 1227 … … 1187 1242 1188 1243 1189 inlinestatic LRESULT1244 static LRESULT 1190 1245 TOOLTIPS_GetMaxTipWidth (HWND hwnd, WPARAM wParam, LPARAM lParam) 1191 1246 { … … 1204 1259 1205 1260 if (lpToolInfo == NULL) 1206 1261 return 0; 1207 1262 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1208 1263 return 0; 1209 1264 1210 1265 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1211 1266 if (nTool == -1) return 0; 1212 1267 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); 1268 TOOLTIPS_GetTipText(hwnd,infoPtr,nTool); 1269 1270 lstrcpyWtoA(lpToolInfo->lpszText,infoPtr->szTipText); 1219 1271 1220 1272 return 0; … … 1230 1282 1231 1283 if (lpToolInfo == NULL) 1232 1284 return 0; 1233 1285 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1234 1286 return 0; 1235 1287 1236 1288 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1237 1289 if (nTool == -1) return 0; 1238 1290 1239 lstrcpyW (lpToolInfo->lpszText, infoPtr->tools[nTool].lpszText); 1240 1241 return 0; 1242 } 1243 1244 1245 inline static LRESULT 1291 TOOLTIPS_GetTipText(hwnd,infoPtr,nTool); 1292 1293 lstrcpyW(lpToolInfo->lpszText,infoPtr->szTipText); 1294 1295 return 0; 1296 } 1297 1298 1299 static LRESULT 1246 1300 TOOLTIPS_GetTipBkColor (HWND hwnd, WPARAM wParam, LPARAM lParam) 1247 1301 { … … 1251 1305 1252 1306 1253 inlinestatic LRESULT1307 static LRESULT 1254 1308 TOOLTIPS_GetTipTextColor (HWND hwnd, WPARAM wParam, LPARAM lParam) 1255 1309 { … … 1259 1313 1260 1314 1261 inlinestatic LRESULT1315 static LRESULT 1262 1316 TOOLTIPS_GetToolCount (HWND hwnd, WPARAM wParam, LPARAM lParam) 1263 1317 { … … 1276 1330 1277 1331 if (lpToolInfo == NULL) 1278 1332 return FALSE; 1279 1333 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1280 1334 return FALSE; 1281 1335 if (infoPtr->uNumTools == 0) 1282 1336 return FALSE; 1283 1337 1284 1338 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1285 1339 if (nTool == -1) 1286 1287 1288 TRACE("tool %d\n", nTool);1340 return FALSE; 1341 1342 // TRACE (tooltips, "tool %d\n", nTool); 1289 1343 1290 1344 toolPtr = &infoPtr->tools[nTool]; … … 1298 1352 1299 1353 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1300 1354 lpToolInfo->lParam = toolPtr->lParam; 1301 1355 1302 1356 return TRUE; … … 1313 1367 1314 1368 if (lpToolInfo == NULL) 1315 1369 return FALSE; 1316 1370 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1317 1371 return FALSE; 1318 1372 if (infoPtr->uNumTools == 0) 1319 1373 return FALSE; 1320 1374 1321 1375 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1322 1376 if (nTool == -1) 1323 1324 1325 TRACE("tool %d\n", nTool);1377 return FALSE; 1378 1379 // TRACE (tooltips, "tool %d\n", nTool); 1326 1380 1327 1381 toolPtr = &infoPtr->tools[nTool]; … … 1335 1389 1336 1390 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1337 1391 lpToolInfo->lParam = toolPtr->lParam; 1338 1392 1339 1393 return TRUE; … … 1350 1404 1351 1405 if (lptthit == 0) 1352 1406 return FALSE; 1353 1407 1354 1408 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lptthit->hwnd, &lptthit->pt); 1355 1409 if (nTool == -1) 1356 1357 1358 TRACE("tool %d!\n", nTool);1410 return FALSE; 1411 1412 // TRACE (tooltips, "tool %d!\n", nTool); 1359 1413 1360 1414 /* copy tool data */ 1361 1415 if (lptthit->ti.cbSize >= sizeof(TTTOOLINFOA)) { 1362 1363 1364 1365 1366 1367 1368 1369 /* 1370 1371 1416 toolPtr = &infoPtr->tools[nTool]; 1417 1418 lptthit->ti.uFlags = toolPtr->uFlags; 1419 lptthit->ti.hwnd = toolPtr->hwnd; 1420 lptthit->ti.uId = toolPtr->uId; 1421 lptthit->ti.rect = toolPtr->rect; 1422 lptthit->ti.hinst = toolPtr->hinst; 1423 /* lptthit->ti.lpszText = toolPtr->lpszText; */ 1424 lptthit->ti.lpszText = NULL; /* FIXME */ 1425 lptthit->ti.lParam = toolPtr->lParam; 1372 1426 } 1373 1427 … … 1385 1439 1386 1440 if (lptthit == 0) 1387 1441 return FALSE; 1388 1442 1389 1443 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lptthit->hwnd, &lptthit->pt); 1390 1444 if (nTool == -1) 1391 1392 1393 TRACE("tool %d!\n", nTool);1445 return FALSE; 1446 1447 // TRACE (tooltips, "tool %d!\n", nTool); 1394 1448 1395 1449 /* copy tool data */ 1396 1450 if (lptthit->ti.cbSize >= sizeof(TTTOOLINFOW)) { 1397 1398 1399 1400 1401 1402 1403 1404 /* 1405 1406 1451 toolPtr = &infoPtr->tools[nTool]; 1452 1453 lptthit->ti.uFlags = toolPtr->uFlags; 1454 lptthit->ti.hwnd = toolPtr->hwnd; 1455 lptthit->ti.uId = toolPtr->uId; 1456 lptthit->ti.rect = toolPtr->rect; 1457 lptthit->ti.hinst = toolPtr->hinst; 1458 /* lptthit->ti.lpszText = toolPtr->lpszText; */ 1459 lptthit->ti.lpszText = NULL; /* FIXME */ 1460 lptthit->ti.lParam = toolPtr->lParam; 1407 1461 } 1408 1462 … … 1419 1473 1420 1474 if (lpti == NULL) 1421 1475 return 0; 1422 1476 if (lpti->cbSize < TTTOOLINFO_V1_SIZEA) 1423 1477 return FALSE; 1424 1478 1425 1479 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpti); … … 1440 1494 1441 1495 if (lpti == NULL) 1442 1496 return 0; 1443 1497 if (lpti->cbSize < TTTOOLINFO_V1_SIZEW) 1444 1498 return FALSE; 1445 1499 1446 1500 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpti); … … 1453 1507 1454 1508 1455 inlinestatic LRESULT1509 static LRESULT 1456 1510 TOOLTIPS_Pop (HWND hwnd, WPARAM wParam, LPARAM lParam) 1457 1511 { 1458 1512 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 the 1518 * 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 1459 1523 TOOLTIPS_Hide (hwnd, infoPtr); 1460 1524 … … 1469 1533 LPMSG lpMsg = (LPMSG)lParam; 1470 1534 POINT pt; 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; 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; 1526 1597 } 1527 1598 … … 1537 1608 1538 1609 switch (wParam) { 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; 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; 1568 1636 } 1569 1637 … … 1587 1655 1588 1656 1589 inlinestatic LRESULT1657 static LRESULT 1590 1658 TOOLTIPS_SetMaxTipWidth (HWND hwnd, WPARAM wParam, LPARAM lParam) 1591 1659 { … … 1599 1667 1600 1668 1601 inlinestatic LRESULT1669 static LRESULT 1602 1670 TOOLTIPS_SetTipBkColor (HWND hwnd, WPARAM wParam, LPARAM lParam) 1603 1671 { … … 1610 1678 1611 1679 1612 inlinestatic LRESULT1680 static LRESULT 1613 1681 TOOLTIPS_SetTipTextColor (HWND hwnd, WPARAM wParam, LPARAM lParam) 1614 1682 { … … 1630 1698 1631 1699 if (lpToolInfo == NULL) 1632 1700 return 0; 1633 1701 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1634 1702 return 0; 1635 1703 1636 1704 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1637 1705 if (nTool == -1) return 0; 1638 1706 1639 TRACE("tool %d\n", nTool);1707 // TRACE (tooltips, "tool %d\n", nTool); 1640 1708 1641 1709 toolPtr = &infoPtr->tools[nTool]; … … 1649 1717 1650 1718 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 1651 TRACE("set string id %x!\n", (INT)lpToolInfo->lpszText);1652 1719 // TRACE (tooltips, "set string id %x!\n", (INT)lpToolInfo->lpszText); 1720 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 1653 1721 } 1654 1722 else if (lpToolInfo->lpszText) { 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 } 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 } 1671 1737 } 1672 1738 1673 1739 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA)) 1674 1740 toolPtr->lParam = lpToolInfo->lParam; 1675 1741 1676 1742 return 0; … … 1687 1753 1688 1754 if (lpToolInfo == NULL) 1689 1755 return 0; 1690 1756 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1691 1757 return 0; 1692 1758 1693 1759 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1694 1760 if (nTool == -1) return 0; 1695 1761 1696 TRACE("tool %d\n", nTool);1762 // TRACE (tooltips, "tool %d\n", nTool); 1697 1763 1698 1764 toolPtr = &infoPtr->tools[nTool]; … … 1706 1772 1707 1773 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) { 1708 TRACE("set string id %x!\n", (INT)lpToolInfo->lpszText);1709 1774 // TRACE (tooltips, "set string id %x!\n", (INT)lpToolInfo->lpszText); 1775 toolPtr->lpszText = lpToolInfo->lpszText; 1710 1776 } 1711 1777 else if (lpToolInfo->lpszText) { 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1778 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) 1779 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1780 else { 1781 if ( (toolPtr->lpszText) && 1782 (HIWORD((INT)toolPtr->lpszText) != 0) ) { 1783 COMCTL32_Free (toolPtr->lpszText); 1784 toolPtr->lpszText = NULL; 1785 } 1786 if (lpToolInfo->lpszText) { 1787 INT len = lstrlenW (lpToolInfo->lpszText); 1788 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1789 lstrcpyW (toolPtr->lpszText, lpToolInfo->lpszText); 1790 } 1791 } 1726 1792 } 1727 1793 1728 1794 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW)) 1729 1795 toolPtr->lParam = lpToolInfo->lParam; 1730 1796 1731 1797 return 0; … … 1739 1805 LPTTTOOLINFOA lpToolInfo = (LPTTTOOLINFOA)lParam; 1740 1806 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 1752 TOOLTIPS_TrackShow (hwnd,infoPtr);1753 1754 } 1755 else{1756 1757 TOOLTIPS_TrackHide (hwnd,infoPtr);1758 1759 1760 1761 1762 TRACE("deactivated!\n");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 infoPtr->bTrackActive = TRUE; 1818 TOOLTIPS_TrackShow(hwnd,infoPtr); 1819 } 1820 } else 1821 { 1822 /* deactivate */ 1823 TOOLTIPS_TrackHide(hwnd,infoPtr); 1824 1825 infoPtr->bTrackActive = FALSE; 1826 infoPtr->nTrackTool = -1; 1827 1828 //TRACE (tooltips, "deactivated!\n"); 1763 1829 } 1764 1830 … … 1775 1841 infoPtr->yTrackPos = (INT)HIWORD(lParam); 1776 1842 1777 if (infoPtr->bTrackActive) {1778 TRACE("[%d %d]\n", 1779 infoPtr->xTrackPos, infoPtr->yTrackPos); 1780 1781 TOOLTIPS_TrackShow (hwnd,infoPtr);1843 if (infoPtr->bTrackActive) 1844 { 1845 // TRACE (tooltips, "[%d %d]\n", 1846 // infoPtr->xTrackPos, infoPtr->yTrackPos); 1847 TOOLTIPS_TrackShow(hwnd,infoPtr); 1782 1848 } 1783 1849 … … 1792 1858 1793 1859 if (infoPtr->nCurrentTool != -1) 1794 UpdateWindow (hwnd); 1795 1796 return 0; 1797 } 1798 1799 1800 static LRESULT 1860 UpdateWindow (hwnd); 1861 1862 return 0; 1863 } 1864 1865 1801 1866 TOOLTIPS_UpdateTipTextA (HWND hwnd, WPARAM wParam, LPARAM lParam) 1802 1867 { … … 1807 1872 1808 1873 if (lpToolInfo == NULL) 1809 1874 return 0; 1810 1875 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA) 1811 1876 return FALSE; 1812 1877 1813 1878 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo); 1814 1879 if (nTool == -1) return 0; 1815 1880 1816 TRACE("tool %d\n", nTool);1881 // TRACE("tool %d\n", nTool); 1817 1882 1818 1883 toolPtr = &infoPtr->tools[nTool]; … … 1822 1887 1823 1888 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)){ 1824 1889 toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText; 1825 1890 } 1826 1891 else if (lpToolInfo->lpszText) { 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 } 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 } 1843 1906 } 1844 1907 1845 1908 /* force repaint */ 1846 1909 if (infoPtr->bActive) 1847 1910 TOOLTIPS_Show (hwnd, infoPtr); 1848 1911 else if (infoPtr->bTrackActive) 1849 1912 TOOLTIPS_TrackShow (hwnd, infoPtr); 1850 1913 1851 1914 return 0; … … 1862 1925 1863 1926 if (lpToolInfo == NULL) 1864 1927 return 0; 1865 1928 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW) 1866 1929 return FALSE; 1867 1930 1868 1931 nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo); 1869 1932 if (nTool == -1) 1870 1871 1872 TRACE("tool %d\n", nTool);1933 return 0; 1934 1935 // TRACE("tool %d\n", nTool); 1873 1936 1874 1937 toolPtr = &infoPtr->tools[nTool]; … … 1878 1941 1879 1942 if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)){ 1880 1943 toolPtr->lpszText = lpToolInfo->lpszText; 1881 1944 } 1882 1945 else if (lpToolInfo->lpszText) { 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1946 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) 1947 toolPtr->lpszText = LPSTR_TEXTCALLBACKW; 1948 else { 1949 if ( (toolPtr->lpszText) && 1950 (HIWORD((INT)toolPtr->lpszText) != 0) ) { 1951 COMCTL32_Free (toolPtr->lpszText); 1952 toolPtr->lpszText = NULL; 1953 } 1954 if (lpToolInfo->lpszText) { 1955 INT len = lstrlenW (lpToolInfo->lpszText); 1956 toolPtr->lpszText = (WCHAR*)COMCTL32_Alloc ((len+1)*sizeof(WCHAR)); 1957 lstrcpyW (toolPtr->lpszText, lpToolInfo->lpszText); 1958 } 1959 } 1897 1960 } 1898 1961 1899 1962 /* force repaint */ 1900 1963 if (infoPtr->bActive) 1901 1964 TOOLTIPS_Show (hwnd, infoPtr); 1902 1965 else if (infoPtr->bTrackActive) 1903 1966 TOOLTIPS_TrackShow (hwnd, infoPtr); 1904 1967 1905 1968 return 0; … … 1923 1986 1924 1987 /* allocate memory for info structure */ 1925 infoPtr = (TOOLTIPS_INFO *)COMCTL32_Alloc (sizeof(TOOLTIPS_INFO)); 1926 SetWindowLongA (hwnd, 0, (DWORD)infoPtr); 1988 infoPtr = (TOOLTIPS_INFO*)initControl(hwnd,sizeof(TOOLTIPS_INFO)); 1927 1989 1928 1990 /* initialize info structure */ 1991 infoPtr->szTipText[0] = '\0'; 1929 1992 infoPtr->bActive = TRUE; 1930 1993 infoPtr->bTrackActive = FALSE; 1931 infoPtr->clrBk = GetSysColor (COLOR_INFOBK); 1932 infoPtr->clrText = GetSysColor (COLOR_INFOTEXT); 1994 infoPtr->clrBk = GetSysColor(COLOR_INFOBK); 1995 infoPtr->clrText = GetSysColor(COLOR_INFOTEXT); 1996 infoPtr->xTrackPos = 0; 1997 infoPtr->yTrackPos = 0; 1933 1998 1934 1999 nclm.cbSize = sizeof(NONCLIENTMETRICSA); 1935 SystemParametersInfoA (SPI_GETNONCLIENTMETRICS, 0, &nclm,0);1936 infoPtr->hFont = CreateFontIndirectA 2000 SystemParametersInfoA(SPI_GETNONCLIENTMETRICS,0,&nclm,0); 2001 infoPtr->hFont = CreateFontIndirectA(&nclm.lfStatusFont); 1937 2002 1938 2003 infoPtr->nMaxTipWidth = -1; 1939 2004 infoPtr->nTool = -1; 2005 infoPtr->nOldTool = -1; 1940 2006 infoPtr->nCurrentTool = -1; 1941 2007 infoPtr->nTrackTool = -1; 1942 2008 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); 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); 1960 2017 1961 2018 return 0; … … 1966 2023 TOOLTIPS_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam) 1967 2024 { 1968 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr 2025 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(hwnd); 1969 2026 TTTOOL_INFO *toolPtr; 1970 2027 INT i; … … 1972 2029 /* free tools */ 1973 2030 if (infoPtr->tools) { 1974 1975 1976 1977 1978 (HIWORD((INT)toolPtr->lpszText) != 0) ) 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2031 for (i = 0; i < infoPtr->uNumTools; i++) { 2032 toolPtr = &infoPtr->tools[i]; 2033 if ((toolPtr->hinst) && (toolPtr->lpszText)) { 2034 if ( (toolPtr->lpszText != LPSTR_TEXTCALLBACKW) && 2035 (HIWORD((INT)toolPtr->lpszText) != 0) ) 2036 { 2037 COMCTL32_Free (toolPtr->lpszText); 2038 toolPtr->lpszText = NULL; 2039 } 2040 } 2041 2042 /* remove subclassing */ 2043 if (toolPtr->uFlags & TTF_SUBCLASS) { 2044 LPTT_SUBCLASS_INFO lpttsi; 2045 2046 if (toolPtr->uFlags & TTF_IDISHWND) 2047 lpttsi = (LPTT_SUBCLASS_INFO)GetPropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 2048 else 2049 lpttsi = (LPTT_SUBCLASS_INFO)GetPropA (toolPtr->hwnd, COMCTL32_aSubclass); 2050 2051 if (lpttsi) { 2052 SetWindowLongA ((HWND)toolPtr->uId, GWL_WNDPROC, 2053 (LONG)lpttsi->wpOrigProc); 2054 RemovePropA ((HWND)toolPtr->uId, COMCTL32_aSubclass); 2055 COMCTL32_Free (&lpttsi); 2056 } 2057 } 2058 } 2059 COMCTL32_Free (infoPtr->tools); 2003 2060 } 2004 2061 … … 2007 2064 2008 2065 /* free tool tips info data */ 2009 COMCTL32_Free (infoPtr);2010 SetWindowLongA(hwnd, 0, 0); 2066 doneControl(hwnd); 2067 2011 2068 return 0; 2012 2069 } … … 2041 2098 TOOLTIPS_MouseMessage (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 2042 2099 { 2043 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 2044 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 { 2045 2107 TOOLTIPS_Hide (hwnd, infoPtr); 2046 2047 return 0; 2108 } 2109 2110 return 0; 2048 2111 } 2049 2112 … … 2052 2115 TOOLTIPS_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam) 2053 2116 { 2054 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE); 2117 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE); 2118 DWORD dwExStyle = GetWindowLongA(hwnd,GWL_EXSTYLE); 2055 2119 2056 2120 dwStyle &= 0x0000FFFF; 2057 2121 dwStyle |= (WS_POPUP | WS_BORDER | WS_CLIPSIBLINGS); 2058 SetWindowLongA (hwnd, GWL_STYLE, dwStyle); 2122 SetWindowLongA(hwnd,GWL_STYLE,dwStyle); 2123 2124 SetWindowLongA(hwnd,GWL_EXSTYLE,dwExStyle | WS_EX_TOOLWINDOW); 2059 2125 2060 2126 return TRUE; … … 2068 2134 INT nTool = (infoPtr->bTrackActive) ? infoPtr->nTrackTool : infoPtr->nTool; 2069 2135 2070 TRACE(" nTool=%d\n", nTool);2136 // TRACE (tooltips, " nTool=%d\n", nTool); 2071 2137 2072 2138 if ((nTool > -1) && (nTool < infoPtr->uNumTools)) { 2073 2074 TRACE("-- in transparent mode!\n");2075 2076 2139 if (infoPtr->tools[nTool].uFlags & TTF_TRANSPARENT) { 2140 // TRACE (tooltips, "-- in transparent mode!\n"); 2141 return HTTRANSPARENT; 2142 } 2077 2143 } 2078 2144 2079 2145 return DefWindowProcA (hwnd, WM_NCHITTEST, wParam, lParam); 2080 2146 } 2081 2082 2083 static LRESULT2084 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 2091 2147 2092 2148 static LRESULT … … 2097 2153 2098 2154 hdc = (wParam == 0) ? BeginPaint (hwnd, &ps) : (HDC)wParam; 2099 TOOLTIPS_ Refresh(hwnd, hdc);2155 TOOLTIPS_Draw(hwnd, hdc); 2100 2156 if (!wParam) 2101 2157 EndPaint (hwnd, &ps); 2102 2158 return 0; 2103 2159 } … … 2111 2167 infoPtr->hFont = (HFONT)wParam; 2112 2168 2113 if ((LOWORD(lParam)) && (infoPtr->nCurrentTool != -1)) { 2114 FIXME("full redraw needed!\n"); 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); 2115 2174 } 2116 2175 … … 2127 2186 * returns the length, in characters, of the tip text 2128 2187 ******************************************************************/ 2188 2129 2189 static LRESULT 2130 2190 TOOLTIPS_OnWMGetTextLength(HWND hwnd, WPARAM wParam, LPARAM lParam) … … 2133 2193 return lstrlenW(infoPtr->szTipText); 2134 2194 } 2135 2136 2195 /****************************************************************** 2137 2196 * TOOLTIPS_OnWMGetText … … 2149 2208 { 2150 2209 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 2210 INT length; 2151 2211 2152 2212 if(!infoPtr || !(infoPtr->szTipText)) 2153 2213 return 0; 2154 2214 2155 return WideCharToMultiByte(CP_ACP, 0, infoPtr->szTipText, -1, 2156 (LPSTR)lParam, wParam, NULL, NULL); 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 2157 2226 } 2158 2227 … … 2161 2230 { 2162 2231 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd); 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 } 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 2205 2257 return 0; 2206 2258 } … … 2224 2276 } 2225 2277 2278 LRESULT TOOLTIPS_MouseActivate(HWND hwnd,WPARAM wParam,LPARAM lParam) 2279 { 2280 return MA_NOACTIVATE; 2281 } 2226 2282 2227 2283 LRESULT CALLBACK … … 2229 2285 { 2230 2286 LPTT_SUBCLASS_INFO lpttsi = 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 } 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 2252 2336 return CallWindowProcA (lpttsi->wpOrigProc, hwnd, uMsg, wParam, lParam); 2253 2337 } … … 2257 2341 TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 2258 2342 { 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);2262 2343 switch (uMsg) 2263 2344 { 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 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 2345 case TTM_ACTIVATE: 2346 return TOOLTIPS_Activate (hwnd, wParam, lParam); 2347 2348 case TTM_ADDTOOLA: 2349 return TOOLTIPS_AddToolA (hwnd, wParam, lParam); 2350 2351 case TTM_ADDTOOLW: 2352 return TOOLTIPS_AddToolW (hwnd, wParam, lParam); 2353 2354 case TTM_DELTOOLA: 2355 return TOOLTIPS_DelToolA (hwnd, wParam, lParam); 2356 2357 case TTM_DELTOOLW: 2358 return TOOLTIPS_DelToolW (hwnd, wParam, lParam); 2359 2360 case TTM_ENUMTOOLSA: 2361 return TOOLTIPS_EnumToolsA (hwnd, wParam, lParam); 2362 2363 case TTM_ENUMTOOLSW: 2364 return TOOLTIPS_EnumToolsW (hwnd, wParam, lParam); 2365 2366 case TTM_GETCURRENTTOOLA: 2367 return TOOLTIPS_GetCurrentToolA (hwnd, wParam, lParam); 2368 2369 case TTM_GETCURRENTTOOLW: 2370 return TOOLTIPS_GetCurrentToolW (hwnd, wParam, lParam); 2371 2372 case TTM_GETDELAYTIME: 2373 return TOOLTIPS_GetDelayTime (hwnd, wParam, lParam); 2374 2375 case TTM_GETMARGIN: 2376 return TOOLTIPS_GetMargin (hwnd, wParam, lParam); 2377 2378 case TTM_GETMAXTIPWIDTH: 2379 return TOOLTIPS_GetMaxTipWidth (hwnd, wParam, lParam); 2380 2381 case TTM_GETTEXTA: 2382 return TOOLTIPS_GetTextA (hwnd, wParam, lParam); 2383 2384 case TTM_GETTEXTW: 2385 return TOOLTIPS_GetTextW (hwnd, wParam, lParam); 2386 2387 case TTM_GETTIPBKCOLOR: 2388 return TOOLTIPS_GetTipBkColor (hwnd, wParam, lParam); 2389 2390 case TTM_GETTIPTEXTCOLOR: 2391 return TOOLTIPS_GetTipTextColor (hwnd, wParam, lParam); 2392 2393 case TTM_GETTOOLCOUNT: 2394 return TOOLTIPS_GetToolCount (hwnd, wParam, lParam); 2395 2396 case TTM_GETTOOLINFOA: 2397 return TOOLTIPS_GetToolInfoA (hwnd, wParam, lParam); 2398 2399 case TTM_GETTOOLINFOW: 2400 return TOOLTIPS_GetToolInfoW (hwnd, wParam, lParam); 2401 2402 case TTM_HITTESTA: 2403 return TOOLTIPS_HitTestA (hwnd, wParam, lParam); 2404 2405 case TTM_HITTESTW: 2406 return TOOLTIPS_HitTestW (hwnd, wParam, lParam); 2407 2408 case TTM_NEWTOOLRECTA: 2409 return TOOLTIPS_NewToolRectA (hwnd, wParam, lParam); 2410 2411 case TTM_NEWTOOLRECTW: 2412 return TOOLTIPS_NewToolRectW (hwnd, wParam, lParam); 2413 2414 case TTM_POP: 2415 return TOOLTIPS_Pop (hwnd, wParam, lParam); 2416 2417 case TTM_RELAYEVENT: 2418 return TOOLTIPS_RelayEvent (hwnd, wParam, lParam); 2419 2420 case TTM_SETDELAYTIME: 2421 return TOOLTIPS_SetDelayTime (hwnd, wParam, lParam); 2422 2423 case TTM_SETMARGIN: 2424 return TOOLTIPS_SetMargin (hwnd, wParam, lParam); 2425 2426 case TTM_SETMAXTIPWIDTH: 2427 return TOOLTIPS_SetMaxTipWidth (hwnd, wParam, lParam); 2428 2429 case TTM_SETTIPBKCOLOR: 2430 return TOOLTIPS_SetTipBkColor (hwnd, wParam, lParam); 2431 2432 case TTM_SETTIPTEXTCOLOR: 2433 return TOOLTIPS_SetTipTextColor (hwnd, wParam, lParam); 2434 2435 case TTM_SETTOOLINFOA: 2436 return TOOLTIPS_SetToolInfoA (hwnd, wParam, lParam); 2437 2438 case TTM_SETTOOLINFOW: 2439 return TOOLTIPS_SetToolInfoW (hwnd, wParam, lParam); 2440 2441 case TTM_TRACKACTIVATE: 2442 return TOOLTIPS_TrackActivate (hwnd, wParam, lParam); 2443 2444 case TTM_TRACKPOSITION: 2445 return TOOLTIPS_TrackPosition (hwnd, wParam, lParam); 2446 2447 case TTM_UPDATE: 2448 return TOOLTIPS_Update (hwnd, wParam, lParam); 2449 2450 case TTM_UPDATETIPTEXTA: 2451 return TOOLTIPS_UpdateTipTextA (hwnd, wParam, lParam); 2452 2453 case TTM_UPDATETIPTEXTW: 2454 return TOOLTIPS_UpdateTipTextW (hwnd, wParam, lParam); 2455 2456 case TTM_WINDOWFROMPOINT: 2457 return TOOLTIPS_WindowFromPoint (hwnd, wParam, lParam); 2458 2459 2460 case WM_CREATE: 2461 return TOOLTIPS_Create (hwnd, wParam, lParam); 2462 2463 case WM_DESTROY: 2464 return TOOLTIPS_Destroy (hwnd, wParam, lParam); 2465 2466 case WM_ERASEBKGND: 2467 return TOOLTIPS_EraseBackground (hwnd, wParam, lParam); 2468 2469 case WM_GETFONT: 2470 return TOOLTIPS_GetFont (hwnd, wParam, lParam); 2390 2471 2391 2472 case WM_GETTEXT: 2392 2473 return TOOLTIPS_OnWMGetText (hwnd, wParam, lParam); 2393 2474 2394 2475 case WM_GETTEXTLENGTH: 2395 2476 return TOOLTIPS_OnWMGetTextLength (hwnd, 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); 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); 2433 2517 } 2434 2518 return 0; … … 2437 2521 2438 2522 VOID 2439 TOOLTIPS_Register ( void)2523 TOOLTIPS_Register (VOID) 2440 2524 { 2441 2525 WNDCLASSA wndClass; … … 2449 2533 wndClass.hbrBackground = 0; 2450 2534 wndClass.lpszClassName = TOOLTIPS_CLASSA; 2451 2535 2452 2536 RegisterClassA (&wndClass); 2453 2537 } … … 2455 2539 2456 2540 VOID 2457 TOOLTIPS_Unregister ( void)2541 TOOLTIPS_Unregister (VOID) 2458 2542 { 2459 2543 UnregisterClassA (TOOLTIPS_CLASSA, (HINSTANCE)NULL);
Note:
See TracChangeset
for help on using the changeset viewer.