4 * Copyright 1998 Eric Kohl
8 * - Custom draw support.
11 * - Run tests using Waite Group Windows95 API Bible Volume 2.
12 * The second cdrom (chapter 3) contains executables activate.exe,
13 * curtool.exe, deltool.exe, enumtools.exe, getinfo.exe, getiptxt.exe,
14 * hittest.exe, needtext.exe, newrect.exe, updtext.exe and winfrpt.exe.
23 #define ID_TIMERSHOW 1 /* show delay timer */
24 #define ID_TIMERPOP 2 /* auto pop timer */
25 #define ID_TIMERLEAVE 3 /* tool leave timer */
27 /* property name of tooltip window handle */
28 #define TT_SUBCLASS_PROP "CC32SubclassInfo"
30 #define TOOLTIPS_GetInfoPtr(wndPtr) ((TOOLTIPS_INFO *)wndPtr->wExtra[0])
34 TOOLTIPS_SubclassProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam);
38 TOOLTIPS_Refresh (WND *wndPtr, HDC32 hdc)
40 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
44 UINT32 uFlags = DT_EXTERNALLEADING;
46 if (infoPtr->nMaxTipWidth > -1)
47 uFlags |= DT_WORDBREAK;
48 if (wndPtr->dwStyle & TTS_NOPREFIX)
49 uFlags |= DT_NOPREFIX;
50 GetClientRect32 (wndPtr->hwndSelf, &rc);
51 rc.left += (2 + infoPtr->rcMargin.left);
52 rc.top += (2 + infoPtr->rcMargin.top);
53 rc.right -= (2 + infoPtr->rcMargin.right);
54 rc.bottom -= (2 + infoPtr->rcMargin.bottom);
55 oldBkMode = SetBkMode32 (hdc, TRANSPARENT);
56 SetTextColor32 (hdc, infoPtr->clrText);
57 hOldFont = SelectObject32 (hdc, infoPtr->hFont);
58 DrawText32A (hdc, infoPtr->szTipText, -1, &rc, uFlags);
59 SelectObject32 (hdc, hOldFont);
60 if (oldBkMode != TRANSPARENT)
61 SetBkMode32 (hdc, oldBkMode);
66 TOOLTIPS_GetTipText (WND *wndPtr, TOOLTIPS_INFO *infoPtr, INT32 nTool)
68 TTTOOL_INFO *toolPtr = &infoPtr->tools[nTool];
70 if ((toolPtr->hinst) && (HIWORD((UINT32)toolPtr->lpszText) == 0)) {
71 TRACE (tooltips, "get res string %x %x\n",
72 toolPtr->hinst, (int)toolPtr->lpszText);
73 LoadString32A (toolPtr->hinst, (UINT32)toolPtr->lpszText,
74 infoPtr->szTipText, INFOTIPSIZE);
76 else if (toolPtr->lpszText) {
77 if (toolPtr->lpszText == LPSTR_TEXTCALLBACK32A) {
78 NMTTDISPINFO32A ttnmdi;
80 /* fill NMHDR struct */
81 ZeroMemory (&ttnmdi, sizeof(NMTTDISPINFO32A));
82 ttnmdi.hdr.hwndFrom = wndPtr->hwndSelf;
83 ttnmdi.hdr.idFrom = toolPtr->uId;
84 ttnmdi.hdr.code = TTN_GETDISPINFO32A;
85 ttnmdi.lpszText = infoPtr->szTipText;
86 ttnmdi.uFlags = toolPtr->uFlags;
87 ttnmdi.lParam = toolPtr->lParam;
89 TRACE (tooltips, "hdr.idFrom = %x\n", ttnmdi.hdr.idFrom);
90 SendMessage32A (toolPtr->hwnd, WM_NOTIFY,
91 (WPARAM32)toolPtr->uId, (LPARAM)&ttnmdi);
93 if ((ttnmdi.hinst) && (HIWORD((UINT32)ttnmdi.szText) == 0)) {
94 LoadString32A (ttnmdi.hinst, (UINT32)ttnmdi.szText,
95 infoPtr->szTipText, INFOTIPSIZE);
96 if (ttnmdi.uFlags & TTF_DI_SETITEM) {
97 toolPtr->hinst = ttnmdi.hinst;
98 toolPtr->lpszText = ttnmdi.szText;
101 else if (ttnmdi.szText[0]) {
102 lstrcpyn32A (infoPtr->szTipText, ttnmdi.szText, 80);
103 if (ttnmdi.uFlags & TTF_DI_SETITEM) {
104 INT32 len = lstrlen32A (ttnmdi.szText) + 1;
106 toolPtr->lpszText = COMCTL32_Alloc (len);
107 lstrcpy32A (toolPtr->lpszText, ttnmdi.szText);
110 else if (ttnmdi.lpszText == 0) {
111 /* no text available */
112 infoPtr->szTipText[0] = '\0';
114 else if (ttnmdi.lpszText != LPSTR_TEXTCALLBACK32A) {
115 if (ttnmdi.lpszText != infoPtr->szTipText)
116 lstrcpyn32A (infoPtr->szTipText, ttnmdi.lpszText,
118 if (ttnmdi.uFlags & TTF_DI_SETITEM) {
119 INT32 len = lstrlen32A (ttnmdi.lpszText) + 1;
121 toolPtr->lpszText = COMCTL32_Alloc (len);
122 lstrcpy32A (toolPtr->lpszText, ttnmdi.lpszText);
126 ERR (tooltips, "recursive text callback!\n");
127 infoPtr->szTipText[0] = '\0';
131 lstrcpyn32A (infoPtr->szTipText, toolPtr->lpszText, INFOTIPSIZE);
134 /* no text available */
135 infoPtr->szTipText[0] = '\0';
137 TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
142 TOOLTIPS_CalcTipSize (WND *wndPtr, TOOLTIPS_INFO *infoPtr, LPSIZE32 lpSize)
146 UINT32 uFlags = DT_EXTERNALLEADING | DT_CALCRECT;
147 RECT32 rc = {0, 0, 0, 0};
149 if (infoPtr->nMaxTipWidth > -1) {
150 rc.right = infoPtr->nMaxTipWidth;
151 uFlags |= DT_WORDBREAK;
153 if (wndPtr->dwStyle & TTS_NOPREFIX)
154 uFlags |= DT_NOPREFIX;
155 TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
157 hdc = GetDC32 (wndPtr->hwndSelf);
158 hOldFont = SelectObject32 (hdc, infoPtr->hFont);
159 DrawText32A (hdc, infoPtr->szTipText, -1, &rc, uFlags);
160 SelectObject32 (hdc, hOldFont);
161 ReleaseDC32 (wndPtr->hwndSelf, hdc);
163 lpSize->cx = rc.right - rc.left + 4 +
164 infoPtr->rcMargin.left + infoPtr->rcMargin.right;
165 lpSize->cy = rc.bottom - rc.top + 4 +
166 infoPtr->rcMargin.bottom + infoPtr->rcMargin.top;
171 TOOLTIPS_Show (WND *wndPtr, TOOLTIPS_INFO *infoPtr)
173 TTTOOL_INFO *toolPtr;
178 if (infoPtr->nTool == -1) {
179 TRACE (tooltips, "invalid tool (-1)!\n");
183 infoPtr->nCurrentTool = infoPtr->nTool;
185 TRACE (tooltips, "Show tooltip pre %d!\n", infoPtr->nTool);
187 TOOLTIPS_GetTipText (wndPtr, infoPtr, infoPtr->nCurrentTool);
189 if (infoPtr->szTipText[0] == '\0') {
190 infoPtr->nCurrentTool = -1;
194 TRACE (tooltips, "Show tooltip %d!\n", infoPtr->nCurrentTool);
195 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
197 hdr.hwndFrom = wndPtr->hwndSelf;
198 hdr.idFrom = toolPtr->uId;
200 SendMessage32A (toolPtr->hwnd, WM_NOTIFY,
201 (WPARAM32)toolPtr->uId, (LPARAM)&hdr);
203 TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
205 TOOLTIPS_CalcTipSize (wndPtr, infoPtr, &size);
206 TRACE (tooltips, "size %d - %d\n", size.cx, size.cy);
208 if (toolPtr->uFlags & TTF_CENTERTIP) {
211 if (toolPtr->uFlags & TTF_IDISHWND)
212 GetWindowRect32 ((HWND32)toolPtr->uId, &rc);
215 MapWindowPoints32 (toolPtr->hwnd, (HWND32)0, (LPPOINT32)&rc, 2);
217 rect.left = (rc.left + rc.right - size.cx) / 2;
218 rect.top = rc.bottom + 2;
221 GetCursorPos32 ((LPPOINT32)&rect);
225 /* FIXME: check position */
227 TRACE (tooltips, "pos %d - %d\n", rect.left, rect.top);
229 rect.right = rect.left + size.cx;
230 rect.bottom = rect.top + size.cy;
232 AdjustWindowRectEx32 (&rect, wndPtr->dwStyle, FALSE, wndPtr->dwExStyle);
234 SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, rect.left, rect.top,
235 rect.right - rect.left, rect.bottom - rect.top,
238 SetTimer32 (wndPtr->hwndSelf, ID_TIMERPOP, infoPtr->nAutoPopTime, 0);
243 TOOLTIPS_Hide (WND *wndPtr, TOOLTIPS_INFO *infoPtr)
245 TTTOOL_INFO *toolPtr;
248 if (infoPtr->nCurrentTool == -1)
251 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
252 TRACE (tooltips, "Hide tooltip %d!\n", infoPtr->nCurrentTool);
253 KillTimer32 (wndPtr->hwndSelf, ID_TIMERPOP);
255 hdr.hwndFrom = wndPtr->hwndSelf;
256 hdr.idFrom = toolPtr->uId;
258 SendMessage32A (toolPtr->hwnd, WM_NOTIFY,
259 (WPARAM32)toolPtr->uId, (LPARAM)&hdr);
261 infoPtr->nCurrentTool = -1;
263 SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, 0, 0, 0, 0,
264 SWP_NOZORDER | SWP_HIDEWINDOW);
269 TOOLTIPS_TrackShow (WND *wndPtr, TOOLTIPS_INFO *infoPtr)
271 TTTOOL_INFO *toolPtr;
276 if (infoPtr->nTrackTool == -1) {
277 TRACE (tooltips, "invalid tracking tool (-1)!\n");
281 TRACE (tooltips, "show tracking tooltip pre %d!\n", infoPtr->nTrackTool);
283 TOOLTIPS_GetTipText (wndPtr, infoPtr, infoPtr->nTrackTool);
285 if (infoPtr->szTipText[0] == '\0') {
286 infoPtr->nTrackTool = -1;
290 TRACE (tooltips, "show tracking tooltip %d!\n", infoPtr->nTrackTool);
291 toolPtr = &infoPtr->tools[infoPtr->nTrackTool];
293 hdr.hwndFrom = wndPtr->hwndSelf;
294 hdr.idFrom = toolPtr->uId;
296 SendMessage32A (toolPtr->hwnd, WM_NOTIFY,
297 (WPARAM32)toolPtr->uId, (LPARAM)&hdr);
299 TRACE (tooltips, "\"%s\"\n", infoPtr->szTipText);
301 TOOLTIPS_CalcTipSize (wndPtr, infoPtr, &size);
302 TRACE (tooltips, "size %d - %d\n", size.cx, size.cy);
304 if (toolPtr->uFlags & TTF_ABSOLUTE) {
305 rect.left = infoPtr->xTrackPos;
306 rect.top = infoPtr->yTrackPos;
308 if (toolPtr->uFlags & TTF_CENTERTIP) {
309 rect.left -= (size.cx / 2);
310 rect.top -= (size.cy / 2);
316 if (toolPtr->uFlags & TTF_IDISHWND)
317 GetWindowRect32 ((HWND32)toolPtr->uId, &rcTool);
319 rcTool = toolPtr->rect;
320 MapWindowPoints32 (toolPtr->hwnd, (HWND32)0, (LPPOINT32)&rcTool, 2);
323 GetCursorPos32 ((LPPOINT32)&rect);
326 if (toolPtr->uFlags & TTF_CENTERTIP) {
327 rect.left -= (size.cx / 2);
328 rect.top -= (size.cy / 2);
331 /* smart placement */
332 if ((rect.left + size.cx > rcTool.left) && (rect.left < rcTool.right) &&
333 (rect.top + size.cy > rcTool.top) && (rect.top < rcTool.bottom))
334 rect.left = rcTool.right;
337 TRACE (tooltips, "pos %d - %d\n", rect.left, rect.top);
339 rect.right = rect.left + size.cx;
340 rect.bottom = rect.top + size.cy;
342 AdjustWindowRectEx32 (&rect, wndPtr->dwStyle, FALSE, wndPtr->dwExStyle);
344 SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, rect.left, rect.top,
345 rect.right - rect.left, rect.bottom - rect.top,
351 TOOLTIPS_TrackHide (WND *wndPtr, TOOLTIPS_INFO *infoPtr)
353 TTTOOL_INFO *toolPtr;
356 if (infoPtr->nTrackTool == -1)
359 toolPtr = &infoPtr->tools[infoPtr->nTrackTool];
360 TRACE (tooltips, "hide tracking tooltip %d!\n", infoPtr->nTrackTool);
362 hdr.hwndFrom = wndPtr->hwndSelf;
363 hdr.idFrom = toolPtr->uId;
365 SendMessage32A (toolPtr->hwnd, WM_NOTIFY,
366 (WPARAM32)toolPtr->uId, (LPARAM)&hdr);
368 SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, 0, 0, 0, 0,
369 SWP_NOZORDER | SWP_HIDEWINDOW);
374 TOOLTIPS_GetToolFromInfoA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFO32A lpToolInfo)
376 TTTOOL_INFO *toolPtr;
379 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
380 toolPtr = &infoPtr->tools[nTool];
382 if (!(toolPtr->uFlags & TTF_IDISHWND) &&
383 (lpToolInfo->hwnd == toolPtr->hwnd) &&
384 (lpToolInfo->uId == toolPtr->uId))
388 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
389 toolPtr = &infoPtr->tools[nTool];
391 if ((toolPtr->uFlags & TTF_IDISHWND) &&
392 (lpToolInfo->uId == toolPtr->uId))
401 TOOLTIPS_GetToolFromPoint (TOOLTIPS_INFO *infoPtr, HWND32 hwnd, LPPOINT32 lpPt)
403 TTTOOL_INFO *toolPtr;
406 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
407 toolPtr = &infoPtr->tools[nTool];
409 if (!(toolPtr->uFlags & TTF_IDISHWND)) {
410 if (hwnd != toolPtr->hwnd)
412 if (!PtInRect32 (&toolPtr->rect, *lpPt))
418 for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
419 toolPtr = &infoPtr->tools[nTool];
421 if (toolPtr->uFlags & TTF_IDISHWND) {
422 if ((HWND32)toolPtr->uId == hwnd)
432 TOOLTIPS_GetToolFromMessage (TOOLTIPS_INFO *infoPtr, HWND32 hwndTool)
437 dwPos = GetMessagePos ();
438 pt.x = (INT32)LOWORD(dwPos);
439 pt.y = (INT32)HIWORD(dwPos);
440 ScreenToClient32 (hwndTool, &pt);
442 return TOOLTIPS_GetToolFromPoint (infoPtr, hwndTool, &pt);
447 TOOLTIPS_IsWindowActive (HWND32 hwnd)
449 HWND32 hwndActive = GetActiveWindow32 ();
452 if (hwndActive == hwnd)
454 return IsChild32 (hwndActive, hwnd);
459 TOOLTIPS_CheckTool (WND *wndPtr, BOOL32 bShowTest)
461 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
466 GetCursorPos32 (&pt);
468 SendMessage32A (wndPtr->hwndSelf, TTM_WINDOWFROMPOINT, 0, (LPARAM)&pt);
472 ScreenToClient32 (hwndTool, &pt);
473 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, hwndTool, &pt);
477 if (!(wndPtr->dwStyle & TTS_ALWAYSTIP) && bShowTest) {
478 if (!TOOLTIPS_IsWindowActive (wndPtr->owner->hwndSelf))
482 TRACE (tooltips, "tool %d\n", nTool);
489 TOOLTIPS_Activate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
491 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
493 infoPtr->bActive = (BOOL32)wParam;
495 if (infoPtr->bActive)
496 TRACE (tooltips, "activate!\n");
498 if (!(infoPtr->bActive) && (infoPtr->nCurrentTool != -1))
499 TOOLTIPS_Hide (wndPtr, infoPtr);
506 TOOLTIPS_AddTool32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
508 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
509 LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
510 TTTOOL_INFO *toolPtr;
512 if (lpToolInfo == NULL)
514 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
517 TRACE (tooltips, "add tool (%x) %x %d%s!\n",
518 wndPtr->hwndSelf, lpToolInfo->hwnd, lpToolInfo->uId,
519 (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
521 if (infoPtr->uNumTools == 0) {
522 infoPtr->tools = COMCTL32_Alloc (sizeof(TTTOOL_INFO));
523 toolPtr = infoPtr->tools;
526 TTTOOL_INFO *oldTools = infoPtr->tools;
528 COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools + 1));
529 memcpy (infoPtr->tools, oldTools,
530 infoPtr->uNumTools * sizeof(TTTOOL_INFO));
531 COMCTL32_Free (oldTools);
532 toolPtr = &infoPtr->tools[infoPtr->uNumTools];
535 infoPtr->uNumTools++;
538 toolPtr->uFlags = lpToolInfo->uFlags;
539 toolPtr->hwnd = lpToolInfo->hwnd;
540 toolPtr->uId = lpToolInfo->uId;
541 toolPtr->rect = lpToolInfo->rect;
542 toolPtr->hinst = lpToolInfo->hinst;
544 if ((lpToolInfo->hinst) && (HIWORD((INT32)lpToolInfo->lpszText) == 0)) {
545 TRACE (tooltips, "add string id %x!\n", (int)lpToolInfo->lpszText);
546 toolPtr->lpszText = lpToolInfo->lpszText;
548 else if (lpToolInfo->lpszText) {
549 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A) {
550 TRACE (tooltips, "add CALLBACK!\n");
551 toolPtr->lpszText = lpToolInfo->lpszText;
554 INT32 len = lstrlen32A (lpToolInfo->lpszText);
555 TRACE (tooltips, "add text \"%s\"!\n", lpToolInfo->lpszText);
556 toolPtr->lpszText = COMCTL32_Alloc (len + 1);
557 lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
561 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
562 toolPtr->lParam = lpToolInfo->lParam;
564 /* install subclassing hook */
565 if (toolPtr->uFlags & TTF_SUBCLASS) {
566 if (toolPtr->uFlags & TTF_IDISHWND) {
567 LPTT_SUBCLASS_INFO lpttsi =
568 (LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
569 if (lpttsi == NULL) {
571 (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO));
573 (WNDPROC32)SetWindowLong32A ((HWND32)toolPtr->uId,
574 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc);
575 lpttsi->hwndToolTip = wndPtr->hwndSelf;
577 SetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP,
581 WARN (tooltips, "A window tool must only be listed once!\n");
584 LPTT_SUBCLASS_INFO lpttsi =
585 (LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP);
586 if (lpttsi == NULL) {
588 (LPTT_SUBCLASS_INFO)COMCTL32_Alloc (sizeof(TT_SUBCLASS_INFO));
590 (WNDPROC32)SetWindowLong32A (toolPtr->hwnd,
591 GWL_WNDPROC,(LONG)TOOLTIPS_SubclassProc);
592 lpttsi->hwndToolTip = wndPtr->hwndSelf;
594 SetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP, (HANDLE32)lpttsi);
599 TRACE (tooltips, "subclassing installed!\n");
606 // << TOOLTIPS_AddTool32W >>
610 TOOLTIPS_DelTool32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
612 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
613 LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
614 TTTOOL_INFO *toolPtr;
617 if (lpToolInfo == NULL)
619 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
621 if (infoPtr->uNumTools == 0)
624 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
625 if (nTool == -1) return 0;
627 TRACE (tooltips, "tool %d\n", nTool);
629 /* delete text string */
630 toolPtr = &infoPtr->tools[nTool];
631 if ((toolPtr->hinst) && (toolPtr->lpszText)) {
632 if (toolPtr->lpszText != LPSTR_TEXTCALLBACK32A)
633 COMCTL32_Free (toolPtr->lpszText);
636 /* remove subclassing */
637 if (toolPtr->uFlags & TTF_SUBCLASS) {
638 if (toolPtr->uFlags & TTF_IDISHWND) {
639 LPTT_SUBCLASS_INFO lpttsi =
640 (LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
642 SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
643 (LONG)lpttsi->wpOrigProc);
644 RemoveProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
645 COMCTL32_Free (&lpttsi);
648 ERR (tooltips, "Invalid data handle!\n");
651 LPTT_SUBCLASS_INFO lpttsi =
652 (LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP);
654 if (lpttsi->uRefCount == 1) {
655 SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
656 (LONG)lpttsi->wpOrigProc);
657 RemoveProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
658 COMCTL32_Free (&lpttsi);
664 ERR (tooltips, "Invalid data handle!\n");
668 /* delete tool from tool list */
669 if (infoPtr->uNumTools == 1) {
670 COMCTL32_Free (infoPtr->tools);
671 infoPtr->tools = NULL;
674 TTTOOL_INFO *oldTools = infoPtr->tools;
676 COMCTL32_Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools - 1));
679 memcpy (&infoPtr->tools[0], &oldTools[0],
680 nTool * sizeof(TTTOOL_INFO));
682 if (nTool < infoPtr->uNumTools - 1)
683 memcpy (&infoPtr->tools[nTool], &oldTools[nTool + 1],
684 (infoPtr->uNumTools - nTool - 1) * sizeof(TTTOOL_INFO));
686 COMCTL32_Free (oldTools);
689 infoPtr->uNumTools--;
695 // << TOOLTIPS_DelTool32W >>
699 TOOLTIPS_EnumTools32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
701 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
702 UINT32 uIndex = (UINT32)wParam;
703 LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
704 TTTOOL_INFO *toolPtr;
706 if (lpToolInfo == NULL)
708 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
710 if (uIndex >= infoPtr->uNumTools)
713 TRACE (tooltips, "index=%u\n", uIndex);
715 toolPtr = &infoPtr->tools[uIndex];
718 lpToolInfo->uFlags = toolPtr->uFlags;
719 lpToolInfo->hwnd = toolPtr->hwnd;
720 lpToolInfo->uId = toolPtr->uId;
721 lpToolInfo->rect = toolPtr->rect;
722 lpToolInfo->hinst = toolPtr->hinst;
723 lpToolInfo->lpszText = toolPtr->lpszText;
725 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
726 lpToolInfo->lParam = toolPtr->lParam;
732 // << TOOLTIPS_EnumTools32W >>
736 TOOLTIPS_GetCurrentTool32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
738 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
739 LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
740 TTTOOL_INFO *toolPtr;
742 if (lpToolInfo == NULL)
744 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
748 if (infoPtr->nCurrentTool > -1) {
749 toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
752 lpToolInfo->uFlags = toolPtr->uFlags;
753 lpToolInfo->rect = toolPtr->rect;
754 lpToolInfo->hinst = toolPtr->hinst;
755 lpToolInfo->lpszText = toolPtr->lpszText;
757 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
758 lpToolInfo->lParam = toolPtr->lParam;
766 return (infoPtr->nCurrentTool != -1);
772 // << TOOLTIPS_GetCurrentTool32W >>
776 TOOLTIPS_GetDelayTime (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
778 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
782 return infoPtr->nAutomaticTime;
785 return infoPtr->nReshowTime;
788 return infoPtr->nAutoPopTime;
791 return infoPtr->nInitialTime;
799 TOOLTIPS_GetMargin (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
801 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
802 LPRECT32 lpRect = (LPRECT32)lParam;
804 lpRect->left = infoPtr->rcMargin.left;
805 lpRect->right = infoPtr->rcMargin.right;
806 lpRect->bottom = infoPtr->rcMargin.bottom;
807 lpRect->top = infoPtr->rcMargin.top;
813 __inline__ static LRESULT
814 TOOLTIPS_GetMaxTipWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
816 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
818 return infoPtr->nMaxTipWidth;
823 TOOLTIPS_GetText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
825 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
826 LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
829 if (lpToolInfo == NULL)
831 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
834 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
835 if (nTool == -1) return 0;
837 lstrcpy32A (lpToolInfo->lpszText, infoPtr->tools[nTool].lpszText);
843 // << TOOLTIPS_GetText32W >>
846 __inline__ static LRESULT
847 TOOLTIPS_GetTipBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
849 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
850 return infoPtr->clrBk;
854 __inline__ static LRESULT
855 TOOLTIPS_GetTipTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
857 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
858 return infoPtr->clrText;
862 __inline__ static LRESULT
863 TOOLTIPS_GetToolCount (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
865 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
866 return infoPtr->uNumTools;
871 TOOLTIPS_GetToolInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
873 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
874 LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
875 TTTOOL_INFO *toolPtr;
878 if (lpToolInfo == NULL)
880 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
882 if (infoPtr->uNumTools == 0)
885 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
886 if (nTool == -1) return FALSE;
888 TRACE (tooltips, "tool %d\n", nTool);
890 toolPtr = &infoPtr->tools[nTool];
893 lpToolInfo->uFlags = toolPtr->uFlags;
894 lpToolInfo->rect = toolPtr->rect;
895 lpToolInfo->hinst = toolPtr->hinst;
896 lpToolInfo->lpszText = toolPtr->lpszText;
898 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
899 lpToolInfo->lParam = toolPtr->lParam;
905 // << TOOLTIPS_GetToolInfo32W >>
909 TOOLTIPS_HitTest32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
911 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
912 LPTTHITTESTINFO32A lptthit = (LPTTHITTESTINFO32A)lParam;
913 TTTOOL_INFO *toolPtr;
919 nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lptthit->hwnd, &lptthit->pt);
923 TRACE (tooltips, "tool %d!\n", nTool);
926 toolPtr = &infoPtr->tools[nTool];
927 lptthit->ti.cbSize = sizeof(TTTOOLINFO32A);
928 lptthit->ti.uFlags = toolPtr->uFlags;
929 lptthit->ti.hwnd = toolPtr->hwnd;
930 lptthit->ti.uId = toolPtr->uId;
931 lptthit->ti.rect = toolPtr->rect;
932 lptthit->ti.hinst = toolPtr->hinst;
933 lptthit->ti.lpszText = toolPtr->lpszText;
934 lptthit->ti.lParam = toolPtr->lParam;
940 // << TOOLTIPS_HitTest32W >>
944 TOOLTIPS_NewToolRect32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
946 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
947 LPTTTOOLINFO32A lpti = (LPTTTOOLINFO32A)lParam;
952 if (lpti->cbSize < TTTOOLINFO_V1_SIZE32A)
955 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpti);
956 if (nTool == -1) return 0;
958 infoPtr->tools[nTool].rect = lpti->rect;
964 // << TOOLTIPS_NewToolRect32W >>
967 __inline__ static LRESULT
968 TOOLTIPS_Pop (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
970 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
972 TOOLTIPS_Hide (wndPtr, infoPtr);
979 TOOLTIPS_RelayEvent (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
981 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
982 LPMSG32 lpMsg = (LPMSG32)lParam;
986 ERR (tooltips, "lpMsg == NULL!\n");
990 switch (lpMsg->message) {
998 ScreenToClient32 (lpMsg->hwnd, &pt);
999 infoPtr->nOldTool = infoPtr->nTool;
1000 infoPtr->nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lpMsg->hwnd, &pt);
1001 TRACE (tooltips, "tool (%x) %d %d\n",
1002 wndPtr->hwndSelf, infoPtr->nOldTool, infoPtr->nTool);
1003 TOOLTIPS_Hide (wndPtr, infoPtr);
1008 ScreenToClient32 (lpMsg->hwnd, &pt);
1009 infoPtr->nOldTool = infoPtr->nTool;
1010 infoPtr->nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lpMsg->hwnd, &pt);
1011 TRACE (tooltips, "tool (%x) %d %d\n",
1012 wndPtr->hwndSelf, infoPtr->nOldTool, infoPtr->nTool);
1013 TRACE (tooltips, "WM_MOUSEMOVE (%04x %d %d)\n",
1014 wndPtr->hwndSelf, pt.x, pt.y);
1015 if ((infoPtr->bActive) && (infoPtr->nTool != infoPtr->nOldTool)) {
1016 if (infoPtr->nOldTool == -1) {
1017 SetTimer32 (wndPtr->hwndSelf, ID_TIMERSHOW,
1018 infoPtr->nInitialTime, 0);
1019 TRACE (tooltips, "timer 1 started!\n");
1022 TOOLTIPS_Hide (wndPtr, infoPtr);
1023 SetTimer32 (wndPtr->hwndSelf, ID_TIMERSHOW,
1024 infoPtr->nReshowTime, 0);
1025 TRACE (tooltips, "timer 2 started!\n");
1028 if (infoPtr->nCurrentTool != -1) {
1029 SetTimer32 (wndPtr->hwndSelf, ID_TIMERLEAVE, 100, 0);
1030 TRACE (tooltips, "timer 3 started!\n");
1040 TOOLTIPS_SetDelayTime (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1042 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1043 INT32 nTime = (INT32)LOWORD(lParam);
1046 case TTDT_AUTOMATIC:
1048 infoPtr->nAutomaticTime = 500;
1049 infoPtr->nReshowTime = 100;
1050 infoPtr->nAutoPopTime = 5000;
1051 infoPtr->nInitialTime = 500;
1054 infoPtr->nAutomaticTime = nTime;
1055 infoPtr->nReshowTime = nTime / 5;
1056 infoPtr->nAutoPopTime = nTime * 10;
1057 infoPtr->nInitialTime = nTime;
1062 infoPtr->nReshowTime = nTime;
1066 infoPtr->nAutoPopTime = nTime;
1070 infoPtr->nInitialTime = nTime;
1079 TOOLTIPS_SetMargin (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1081 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1082 LPRECT32 lpRect = (LPRECT32)lParam;
1084 infoPtr->rcMargin.left = lpRect->left;
1085 infoPtr->rcMargin.right = lpRect->right;
1086 infoPtr->rcMargin.bottom = lpRect->bottom;
1087 infoPtr->rcMargin.top = lpRect->top;
1093 __inline__ static LRESULT
1094 TOOLTIPS_SetMaxTipWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1096 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1097 INT32 nTemp = infoPtr->nMaxTipWidth;
1099 infoPtr->nMaxTipWidth = (INT32)lParam;
1105 __inline__ static LRESULT
1106 TOOLTIPS_SetTipBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1108 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1110 infoPtr->clrBk = (COLORREF)wParam;
1116 __inline__ static LRESULT
1117 TOOLTIPS_SetTipTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1119 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1121 infoPtr->clrText = (COLORREF)wParam;
1128 TOOLTIPS_SetToolInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1130 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1131 LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
1132 TTTOOL_INFO *toolPtr;
1135 if (lpToolInfo == NULL)
1137 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
1140 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
1141 if (nTool == -1) return 0;
1143 TRACE (tooltips, "tool %d\n", nTool);
1145 toolPtr = &infoPtr->tools[nTool];
1147 /* copy tool data */
1148 toolPtr->uFlags = lpToolInfo->uFlags;
1149 toolPtr->hwnd = lpToolInfo->hwnd;
1150 toolPtr->uId = lpToolInfo->uId;
1151 toolPtr->rect = lpToolInfo->rect;
1152 toolPtr->hinst = lpToolInfo->hinst;
1154 if ((lpToolInfo->hinst) && (HIWORD((INT32)lpToolInfo->lpszText) == 0)) {
1155 TRACE (tooltips, "set string id %x!\n", (INT32)lpToolInfo->lpszText);
1156 toolPtr->lpszText = lpToolInfo->lpszText;
1158 else if (lpToolInfo->lpszText) {
1159 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A)
1160 toolPtr->lpszText = lpToolInfo->lpszText;
1162 INT32 len = lstrlen32A (lpToolInfo->lpszText);
1163 COMCTL32_Free (toolPtr->lpszText);
1164 toolPtr->lpszText = COMCTL32_Alloc (len + 1);
1165 lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
1169 if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
1170 toolPtr->lParam = lpToolInfo->lParam;
1176 // << TOOLTIPS_SetToolInfo32W >>
1180 TOOLTIPS_TrackActivate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1182 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1183 LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
1185 if (lpToolInfo == NULL)
1187 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
1190 if ((BOOL32)wParam) {
1192 infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
1193 if (infoPtr->nTrackTool != -1) {
1194 TRACE (tooltips, "activated!\n");
1195 infoPtr->bTrackActive = TRUE;
1196 TOOLTIPS_TrackShow (wndPtr, infoPtr);
1201 TOOLTIPS_TrackHide (wndPtr, infoPtr);
1203 infoPtr->bTrackActive = FALSE;
1204 infoPtr->nTrackTool = -1;
1206 TRACE (tooltips, "deactivated!\n");
1214 TOOLTIPS_TrackPosition (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1216 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1218 infoPtr->xTrackPos = (INT32)LOWORD(lParam);
1219 infoPtr->yTrackPos = (INT32)HIWORD(lParam);
1221 if (infoPtr->bTrackActive) {
1222 TRACE (tooltips, "[%d %d]\n",
1223 infoPtr->xTrackPos, infoPtr->yTrackPos);
1225 TOOLTIPS_TrackShow (wndPtr, infoPtr);
1233 TOOLTIPS_Update (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1235 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1237 if (infoPtr->nCurrentTool != -1)
1238 UpdateWindow32 (wndPtr->hwndSelf);
1245 TOOLTIPS_UpdateTipText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1247 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1248 LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
1249 TTTOOL_INFO *toolPtr;
1252 if (lpToolInfo == NULL)
1254 if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
1257 nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
1258 if (nTool == -1) return 0;
1260 TRACE (tooltips, "tool %d\n", nTool);
1262 toolPtr = &infoPtr->tools[nTool];
1264 /* copy tool text */
1265 toolPtr->hinst = lpToolInfo->hinst;
1267 if ((lpToolInfo->hinst) && (HIWORD((INT32)lpToolInfo->lpszText) == 0)){
1268 toolPtr->lpszText = lpToolInfo->lpszText;
1270 else if (lpToolInfo->lpszText) {
1271 if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A)
1272 toolPtr->lpszText = lpToolInfo->lpszText;
1274 INT32 len = lstrlen32A (lpToolInfo->lpszText);
1275 COMCTL32_Free (toolPtr->lpszText);
1276 toolPtr->lpszText = COMCTL32_Alloc (len + 1);
1277 lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
1285 // << TOOLTIPS_UpdateTipText32W >>
1289 TOOLTIPS_WindowFromPoint (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1291 return WindowFromPoint32 (*((LPPOINT32)lParam));
1297 TOOLTIPS_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1299 TOOLTIPS_INFO *infoPtr;
1300 NONCLIENTMETRICS32A nclm;
1302 /* allocate memory for info structure */
1303 infoPtr = (TOOLTIPS_INFO *)COMCTL32_Alloc (sizeof(TOOLTIPS_INFO));
1304 wndPtr->wExtra[0] = (DWORD)infoPtr;
1306 if (infoPtr == NULL) {
1307 ERR (tooltips, "could not allocate info memory!\n");
1311 /* initialize info structure */
1312 infoPtr->bActive = TRUE;
1313 infoPtr->bTrackActive = FALSE;
1314 infoPtr->clrBk = GetSysColor32 (COLOR_INFOBK);
1315 infoPtr->clrText = GetSysColor32 (COLOR_INFOTEXT);
1317 nclm.cbSize = sizeof(NONCLIENTMETRICS32A);
1318 SystemParametersInfo32A (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
1319 infoPtr->hFont = CreateFontIndirect32A (&nclm.lfStatusFont);
1321 infoPtr->nMaxTipWidth = -1;
1322 infoPtr->nTool = -1;
1323 infoPtr->nOldTool = -1;
1324 infoPtr->nCurrentTool = -1;
1325 infoPtr->nTrackTool = -1;
1327 infoPtr->nAutomaticTime = 500;
1328 infoPtr->nReshowTime = 100;
1329 infoPtr->nAutoPopTime = 5000;
1330 infoPtr->nInitialTime = 500;
1332 SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, 0, 0, 0, 0,
1333 SWP_NOZORDER | SWP_HIDEWINDOW);
1340 TOOLTIPS_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1342 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1343 TTTOOL_INFO *toolPtr;
1347 if (infoPtr->tools) {
1348 for (i = 0; i < infoPtr->uNumTools; i++) {
1349 toolPtr = &infoPtr->tools[i];
1350 if ((toolPtr->hinst) && (toolPtr->lpszText)) {
1351 if (toolPtr->lpszText != LPSTR_TEXTCALLBACK32A)
1352 COMCTL32_Free (toolPtr->lpszText);
1355 /* remove subclassing */
1356 if (toolPtr->uFlags & TTF_SUBCLASS) {
1357 LPTT_SUBCLASS_INFO lpttsi;
1359 if (toolPtr->uFlags & TTF_IDISHWND)
1360 lpttsi = (LPTT_SUBCLASS_INFO)GetProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
1362 lpttsi = (LPTT_SUBCLASS_INFO)GetProp32A (toolPtr->hwnd, TT_SUBCLASS_PROP);
1365 SetWindowLong32A ((HWND32)toolPtr->uId, GWL_WNDPROC,
1366 (LONG)lpttsi->wpOrigProc);
1367 RemoveProp32A ((HWND32)toolPtr->uId, TT_SUBCLASS_PROP);
1368 COMCTL32_Free (&lpttsi);
1372 COMCTL32_Free (infoPtr->tools);
1376 DeleteObject32 (infoPtr->hFont);
1378 /* free tool tips info data */
1379 COMCTL32_Free (infoPtr);
1386 TOOLTIPS_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1388 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1392 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
1393 GetClientRect32 (wndPtr->hwndSelf, &rect);
1394 FillRect32 ((HDC32)wParam, &rect, hBrush);
1395 DeleteObject32 (hBrush);
1402 TOOLTIPS_GetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1404 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1406 return infoPtr->hFont;
1411 TOOLTIPS_MouseMessage (WND *wndPtr, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
1413 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1415 TOOLTIPS_Hide (wndPtr, infoPtr);
1422 TOOLTIPS_NCCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1424 wndPtr->dwStyle &= 0x0000FFFF;
1425 wndPtr->dwStyle |= (WS_POPUP | WS_BORDER | WS_CLIPSIBLINGS);
1432 TOOLTIPS_NCHitTest (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1434 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1435 INT32 nTool = (infoPtr->bTrackActive) ? infoPtr->nTrackTool : infoPtr->nTool;
1437 TRACE (tooltips, " nTool=%d\n", nTool);
1439 if ((nTool > -1) && (nTool < infoPtr->uNumTools)) {
1440 if (infoPtr->tools[nTool].uFlags & TTF_TRANSPARENT) {
1441 TRACE (tooltips, "-- in transparent mode!\n");
1442 return HTTRANSPARENT;
1446 return DefWindowProc32A (wndPtr->hwndSelf, WM_NCHITTEST, wParam, lParam);
1451 TOOLTIPS_Paint (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1456 hdc = (wParam == 0) ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
1457 TOOLTIPS_Refresh (wndPtr, hdc);
1459 EndPaint32 (wndPtr->hwndSelf, &ps);
1465 TOOLTIPS_SetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1467 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1469 infoPtr->hFont = (HFONT32)wParam;
1471 if ((LOWORD(lParam)) & (infoPtr->nCurrentTool != -1)) {
1472 FIXME (tooltips, "full redraw needed!\n");
1480 TOOLTIPS_Timer (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1482 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1484 TRACE (tooltips, "timer %d (%x) expired!\n", wParam, wndPtr->hwndSelf);
1489 KillTimer32 (wndPtr->hwndSelf, ID_TIMERSHOW);
1490 if (TOOLTIPS_CheckTool (wndPtr, TRUE) == infoPtr->nTool)
1491 TOOLTIPS_Show (wndPtr, infoPtr);
1495 TOOLTIPS_Hide (wndPtr, infoPtr);
1499 KillTimer32 (wndPtr->hwndSelf, ID_TIMERLEAVE);
1500 if (TOOLTIPS_CheckTool (wndPtr, FALSE) == -1) {
1501 infoPtr->nTool = -1;
1502 infoPtr->nOldTool = -1;
1503 TOOLTIPS_Hide (wndPtr, infoPtr);
1512 TOOLTIPS_WinIniChange (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1514 TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1515 NONCLIENTMETRICS32A nclm;
1517 infoPtr->clrBk = GetSysColor32 (COLOR_INFOBK);
1518 infoPtr->clrText = GetSysColor32 (COLOR_INFOTEXT);
1520 DeleteObject32 (infoPtr->hFont);
1521 nclm.cbSize = sizeof(NONCLIENTMETRICS32A);
1522 SystemParametersInfo32A (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
1523 infoPtr->hFont = CreateFontIndirect32A (&nclm.lfStatusFont);
1530 TOOLTIPS_SubclassProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
1532 LPTT_SUBCLASS_INFO lpttsi =
1533 (LPTT_SUBCLASS_INFO)GetProp32A (hwnd, TT_SUBCLASS_PROP);
1535 TOOLTIPS_INFO *infoPtr;
1539 case WM_LBUTTONDOWN:
1541 case WM_MBUTTONDOWN:
1543 case WM_RBUTTONDOWN:
1546 wndPtr = WIN_FindWndPtr(lpttsi->hwndToolTip);
1547 infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1548 nTool = TOOLTIPS_GetToolFromMessage (infoPtr, hwnd);
1550 TRACE (tooltips, "subclassed mouse message %04x\n", uMsg);
1551 infoPtr->nOldTool = infoPtr->nTool;
1552 infoPtr->nTool = nTool;
1553 TOOLTIPS_Hide (wndPtr, infoPtr);
1559 wndPtr = WIN_FindWndPtr(lpttsi->hwndToolTip);
1560 infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
1561 nTool = TOOLTIPS_GetToolFromMessage (infoPtr, hwnd);
1563 TRACE (tooltips, "subclassed WM_MOUSEMOVE\n");
1564 infoPtr->nOldTool = infoPtr->nTool;
1565 infoPtr->nTool = nTool;
1567 if ((infoPtr->bActive) &&
1568 (infoPtr->nTool != infoPtr->nOldTool)) {
1569 if (infoPtr->nOldTool == -1) {
1570 SetTimer32 (wndPtr->hwndSelf, ID_TIMERSHOW,
1571 infoPtr->nInitialTime, 0);
1572 TRACE (tooltips, "timer 1 started!\n");
1575 TOOLTIPS_Hide (wndPtr, infoPtr);
1576 SetTimer32 (wndPtr->hwndSelf, ID_TIMERSHOW,
1577 infoPtr->nReshowTime, 0);
1578 TRACE (tooltips, "timer 2 started!\n");
1581 if (infoPtr->nCurrentTool != -1) {
1582 SetTimer32 (wndPtr->hwndSelf, ID_TIMERLEAVE, 100, 0);
1583 TRACE (tooltips, "timer 3 started!\n");
1589 return CallWindowProc32A (lpttsi->wpOrigProc, hwnd, uMsg, wParam, lParam);
1594 TOOLTIPS_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
1596 WND *wndPtr = WIN_FindWndPtr(hwnd);
1601 return TOOLTIPS_Activate (wndPtr, wParam, lParam);
1603 case TTM_ADDTOOL32A:
1604 return TOOLTIPS_AddTool32A (wndPtr, wParam, lParam);
1606 // case TTM_ADDTOOL32W:
1608 case TTM_DELTOOL32A:
1609 return TOOLTIPS_DelTool32A (wndPtr, wParam, lParam);
1611 // case TTM_DELTOOL32W:
1613 case TTM_ENUMTOOLS32A:
1614 return TOOLTIPS_EnumTools32A (wndPtr, wParam, lParam);
1616 // case TTM_ENUMTOOLS32W:
1618 case TTM_GETCURRENTTOOL32A:
1619 return TOOLTIPS_GetCurrentTool32A (wndPtr, wParam, lParam);
1621 // case TTM_GETCURRENTTOOL32W:
1623 case TTM_GETDELAYTIME:
1624 return TOOLTIPS_GetDelayTime (wndPtr, wParam, lParam);
1627 return TOOLTIPS_GetMargin (wndPtr, wParam, lParam);
1629 case TTM_GETMAXTIPWIDTH:
1630 return TOOLTIPS_GetMaxTipWidth (wndPtr, wParam, lParam);
1632 case TTM_GETTEXT32A:
1633 return TOOLTIPS_GetText32A (wndPtr, wParam, lParam);
1635 // case TTM_GETTEXT32W:
1637 case TTM_GETTIPBKCOLOR:
1638 return TOOLTIPS_GetTipBkColor (wndPtr, wParam, lParam);
1640 case TTM_GETTIPTEXTCOLOR:
1641 return TOOLTIPS_GetTipTextColor (wndPtr, wParam, lParam);
1643 case TTM_GETTOOLCOUNT:
1644 return TOOLTIPS_GetToolCount (wndPtr, wParam, lParam);
1646 case TTM_GETTOOLINFO32A:
1647 return TOOLTIPS_GetToolInfo32A (wndPtr, wParam, lParam);
1649 // case TTM_GETTOOLINFO32W:
1651 case TTM_HITTEST32A:
1652 return TOOLTIPS_HitTest32A (wndPtr, wParam, lParam);
1654 // case TTM_HITTEST32W:
1656 case TTM_NEWTOOLRECT32A:
1657 return TOOLTIPS_NewToolRect32A (wndPtr, wParam, lParam);
1659 // case TTM_NEWTOOLRECT32W:
1662 return TOOLTIPS_Pop (wndPtr, wParam, lParam);
1664 case TTM_RELAYEVENT:
1665 return TOOLTIPS_RelayEvent (wndPtr, wParam, lParam);
1667 case TTM_SETDELAYTIME:
1668 return TOOLTIPS_SetDelayTime (wndPtr, wParam, lParam);
1671 return TOOLTIPS_SetMargin (wndPtr, wParam, lParam);
1673 case TTM_SETMAXTIPWIDTH:
1674 return TOOLTIPS_SetMaxTipWidth (wndPtr, wParam, lParam);
1676 case TTM_SETTIPBKCOLOR:
1677 return TOOLTIPS_SetTipBkColor (wndPtr, wParam, lParam);
1679 case TTM_SETTIPTEXTCOLOR:
1680 return TOOLTIPS_SetTipTextColor (wndPtr, wParam, lParam);
1682 case TTM_SETTOOLINFO32A:
1683 return TOOLTIPS_SetToolInfo32A (wndPtr, wParam, lParam);
1685 // case TTM_SETTOOLINFO32W:
1687 case TTM_TRACKACTIVATE:
1688 return TOOLTIPS_TrackActivate (wndPtr, wParam, lParam);
1690 case TTM_TRACKPOSITION:
1691 return TOOLTIPS_TrackPosition (wndPtr, wParam, lParam);
1694 return TOOLTIPS_Update (wndPtr, wParam, lParam);
1696 case TTM_UPDATETIPTEXT32A:
1697 return TOOLTIPS_UpdateTipText32A (wndPtr, wParam, lParam);
1699 // case TTM_UPDATETIPTEXT32W:
1701 case TTM_WINDOWFROMPOINT:
1702 return TOOLTIPS_WindowFromPoint (wndPtr, wParam, lParam);
1706 return TOOLTIPS_Create (wndPtr, wParam, lParam);
1709 return TOOLTIPS_Destroy (wndPtr, wParam, lParam);
1712 return TOOLTIPS_EraseBackground (wndPtr, wParam, lParam);
1715 return TOOLTIPS_GetFont (wndPtr, wParam, lParam);
1717 case WM_LBUTTONDOWN:
1719 case WM_MBUTTONDOWN:
1721 case WM_RBUTTONDOWN:
1724 return TOOLTIPS_MouseMessage (wndPtr, uMsg, wParam, lParam);
1727 return TOOLTIPS_NCCreate (wndPtr, wParam, lParam);
1730 return TOOLTIPS_NCHitTest (wndPtr, wParam, lParam);
1733 return TOOLTIPS_Paint (wndPtr, wParam, lParam);
1736 return TOOLTIPS_SetFont (wndPtr, wParam, lParam);
1739 return TOOLTIPS_Timer (wndPtr, wParam, lParam);
1741 case WM_WININICHANGE:
1742 return TOOLTIPS_WinIniChange (wndPtr, wParam, lParam);
1745 if (uMsg >= WM_USER)
1746 ERR (tooltips, "unknown msg %04x wp=%08x lp=%08lx\n",
1747 uMsg, wParam, lParam);
1748 return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
1755 TOOLTIPS_Register (VOID)
1757 WNDCLASS32A wndClass;
1759 if (GlobalFindAtom32A (TOOLTIPS_CLASS32A)) return;
1761 ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
1762 wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
1763 wndClass.lpfnWndProc = (WNDPROC32)TOOLTIPS_WindowProc;
1764 wndClass.cbClsExtra = 0;
1765 wndClass.cbWndExtra = sizeof(TOOLTIPS_INFO *);
1766 wndClass.hCursor = LoadCursor32A (0, IDC_ARROW32A);
1767 wndClass.hbrBackground = 0;
1768 wndClass.lpszClassName = TOOLTIPS_CLASS32A;
1770 RegisterClass32A (&wndClass);
1775 TOOLTIPS_Unregister (VOID)
1777 if (GlobalFindAtom32A (TOOLTIPS_CLASS32A))
1778 UnregisterClass32A (TOOLTIPS_CLASS32A, (HINSTANCE32)NULL);