2 * Interface code to StatusWindow widget/control
4 * Copyright 1996 Bruce Milner
5 * Copyright 1998 Eric Kohl
14 * Run tests using Waite Group Windows95 API Bible Vol. 1&2
15 * The second cdrom contains executables drawstat.exe,gettext.exe,
16 * simple.exe, getparts.exe, setparts.exe, statwnd.exe
21 * 1) Don't hard code bar to bottom of window, allow CCS_TOP also.
22 * 2) Tooltip support (almost done).
25 #define _MAX(a,b) (((a)>(b))?(a):(b))
26 #define _MIN(a,b) (((a)>(b))?(b):(a))
32 #define STATUSBAR_GetInfoPtr(wndPtr) ((STATUSWINDOWINFO *)wndPtr->wExtra[0])
36 STATUSBAR_DrawSizeGrip (HDC32 hdc, LPRECT32 lpRect)
42 pt.x = lpRect->right - 1;
43 pt.y = lpRect->bottom - 1;
45 hOldPen = SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DFACE));
46 MoveToEx32 (hdc, pt.x - 12, pt.y, NULL);
47 LineTo32 (hdc, pt.x, pt.y);
48 LineTo32 (hdc, pt.x, pt.y - 12);
53 SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DSHADOW));
54 for (i = 1; i < 11; i += 4) {
55 MoveToEx32 (hdc, pt.x - i, pt.y, NULL);
56 LineTo32 (hdc, pt.x, pt.y - i);
58 MoveToEx32 (hdc, pt.x - i-1, pt.y, NULL);
59 LineTo32 (hdc, pt.x, pt.y - i-1);
62 SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DHIGHLIGHT));
63 for (i = 3; i < 13; i += 4) {
64 MoveToEx32 (hdc, pt.x - i, pt.y, NULL);
65 LineTo32 (hdc, pt.x, pt.y - i);
68 SelectObject32 (hdc, hOldPen);
73 STATUSBAR_DrawPart (HDC32 hdc, STATUSWINDOWPART *part)
75 RECT32 r = part->bound;
76 UINT32 border = BDR_SUNKENOUTER;
78 if (part->style==SBT_POPOUT)
79 border = BDR_RAISEDOUTER;
80 else if (part->style==SBT_NOBORDERS)
83 DrawEdge32(hdc, &r, border, BF_RECT|BF_ADJUST);
87 INT32 cy = r.bottom - r.top;
90 DrawIconEx32 (hdc, r.left, r.top, part->hIcon, cy, cy, 0, 0, DI_NORMAL);
96 int oldbkmode = SetBkMode32(hdc, TRANSPARENT);
97 LPWSTR p = (LPWSTR)part->text;
98 UINT32 align = DT_LEFT;
109 DrawText32W (hdc, p, lstrlen32W (p), &r, align|DT_VCENTER|DT_SINGLELINE);
110 if (oldbkmode != TRANSPARENT)
111 SetBkMode32(hdc, oldbkmode);
117 STATUSBAR_RefreshPart (WND *wndPtr, STATUSWINDOWPART *part, HDC32 hdc)
119 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
123 if (!IsWindowVisible32(wndPtr->hwndSelf))
126 if (self->clrBk != CLR_DEFAULT)
127 hbrBk = CreateSolidBrush32 (self->clrBk);
129 hbrBk = GetSysColorBrush32 (COLOR_3DFACE);
130 FillRect32(hdc, &part->bound, hbrBk);
132 hOldFont = SelectObject32 (hdc, self->hFont ? self->hFont : self->hDefaultFont);
134 if (part->style == SBT_OWNERDRAW) {
135 DRAWITEMSTRUCT32 dis;
137 dis.CtlID = wndPtr->wIDmenu;
139 dis.hwndItem = wndPtr->hwndSelf;
141 dis.rcItem = part->bound;
142 dis.itemData = (INT32)part->text;
143 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_DRAWITEM,
144 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&dis);
147 STATUSBAR_DrawPart (hdc, part);
149 SelectObject32 (hdc, hOldFont);
151 if (self->clrBk != CLR_DEFAULT)
152 DeleteObject32 (hbrBk);
154 if (wndPtr->dwStyle & SBARS_SIZEGRIP) {
157 GetClientRect32 (wndPtr->hwndSelf, &rect);
158 STATUSBAR_DrawSizeGrip (hdc, &rect);
164 STATUSBAR_Refresh (WND *wndPtr, HDC32 hdc)
166 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
172 if (!IsWindowVisible32(wndPtr->hwndSelf))
175 GetClientRect32 (wndPtr->hwndSelf, &rect);
177 if (self->clrBk != CLR_DEFAULT)
178 hbrBk = CreateSolidBrush32 (self->clrBk);
180 hbrBk = GetSysColorBrush32 (COLOR_3DFACE);
181 FillRect32(hdc, &rect, hbrBk);
183 hOldFont = SelectObject32 (hdc, self->hFont ? self->hFont : self->hDefaultFont);
186 STATUSBAR_DrawPart (hdc, &self->part0);
189 for (i = 0; i < self->numParts; i++) {
190 if (self->parts[i].style == SBT_OWNERDRAW) {
191 DRAWITEMSTRUCT32 dis;
193 dis.CtlID = wndPtr->wIDmenu;
195 dis.hwndItem = wndPtr->hwndSelf;
197 dis.rcItem = self->parts[i].bound;
198 dis.itemData = (INT32)self->parts[i].text;
199 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_DRAWITEM,
200 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&dis);
203 STATUSBAR_DrawPart (hdc, &self->parts[i]);
207 SelectObject32 (hdc, hOldFont);
209 if (self->clrBk != CLR_DEFAULT)
210 DeleteObject32 (hbrBk);
212 if (wndPtr->dwStyle & SBARS_SIZEGRIP)
213 STATUSBAR_DrawSizeGrip (hdc, &rect);
220 STATUSBAR_SetPartBounds (WND *wndPtr)
222 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
223 STATUSWINDOWPART *part;
227 /* get our window size */
228 GetClientRect32 (wndPtr->hwndSelf, &rect);
230 rect.top += VERT_BORDER;
232 /* set bounds for simple rectangle */
233 self->part0.bound = rect;
235 /* set bounds for non-simple rectangles */
236 for (i = 0; i < self->numParts; i++) {
237 part = &self->parts[i];
238 r = &self->parts[i].bound;
240 r->bottom = rect.bottom;
244 r->left = self->parts[i-1].bound.right + HORZ_GAP;
246 r->right = rect.right;
250 if (self->hwndToolTip) {
253 ti.cbSize = sizeof(TTTOOLINFO32A);
254 ti.hwnd = wndPtr->hwndSelf;
257 SendMessage32A (self->hwndToolTip, TTM_NEWTOOLRECT32A,
265 STATUSBAR_RelayEvent (HWND32 hwndTip, HWND32 hwndMsg, UINT32 uMsg,
266 WPARAM32 wParam, LPARAM lParam)
274 msg.time = GetMessageTime ();
275 msg.pt.x = LOWORD(GetMessagePos ());
276 msg.pt.y = HIWORD(GetMessagePos ());
278 SendMessage32A (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
282 __inline__ static LRESULT
283 STATUSBAR_GetBorders (LPARAM lParam)
285 LPINT32 out = (LPINT32) lParam;
287 out[0] = HORZ_BORDER; /* horizontal border width */
288 out[1] = VERT_BORDER; /* vertical border width */
289 out[2] = HORZ_GAP; /* width of border between rectangles */
296 STATUSBAR_GetIcon (WND *wndPtr, WPARAM32 wParam)
298 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
301 nPart = (INT32)wParam & 0x00ff;
302 if ((nPart < -1) || (nPart >= self->numParts)) return 0;
305 return (self->part0.hIcon);
307 return (self->parts[nPart].hIcon);
312 STATUSBAR_GetParts (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
314 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
319 num_parts = (INT32) wParam;
320 parts = (LPINT32) lParam;
322 return (self->numParts);
323 for (i = 0; i < num_parts; i++) {
324 parts[i] = self->parts[i].x;
327 return (self->numParts);
332 STATUSBAR_GetRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
334 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
338 part_num = ((INT32) wParam) & 0x00ff;
339 rect = (LPRECT32) lParam;
341 *rect = infoPtr->part0.bound;
343 *rect = infoPtr->parts[part_num].bound;
349 STATUSBAR_GetText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
351 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
352 STATUSWINDOWPART *part;
356 nPart = ((INT32) wParam) & 0x00ff;
360 part = &self->parts[nPart];
362 if (part->style == SBT_OWNERDRAW)
363 result = (LRESULT)part->text;
365 result = part->text ? lstrlen32W (part->text) : 0;
366 result |= (part->style << 16);
367 if (lParam && LOWORD(result))
368 lstrcpyWtoA ((LPSTR)lParam, part->text);
375 STATUSBAR_GetText32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
377 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
378 STATUSWINDOWPART *part;
382 nPart = ((INT32)wParam) & 0x00ff;
386 part = &self->parts[nPart];
388 if (part->style == SBT_OWNERDRAW)
389 result = (LRESULT)part->text;
391 result = part->text ? lstrlen32W (part->text) : 0;
392 result |= (part->style << 16);
394 lstrcpy32W ((LPWSTR)lParam, part->text);
401 STATUSBAR_GetTextLength (WND *wndPtr, WPARAM32 wParam)
403 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
404 STATUSWINDOWPART *part;
408 part_num = ((INT32) wParam) & 0x00ff;
411 part = &infoPtr->part0;
413 part = &infoPtr->parts[part_num];
416 result = lstrlen32W(part->text);
420 result |= (part->style << 16);
426 STATUSBAR_GetTipText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
428 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
430 if (infoPtr->hwndToolTip) {
432 ti.cbSize = sizeof(TTTOOLINFO32A);
433 ti.hwnd = wndPtr->hwndSelf;
434 ti.uId = LOWORD(wParam);
435 SendMessage32A (infoPtr->hwndToolTip, TTM_GETTEXT32A, 0, (LPARAM)&ti);
438 lstrcpyn32A ((LPSTR)lParam, ti.lpszText, HIWORD(wParam));
446 STATUSBAR_GetTipText32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
448 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
450 if (infoPtr->hwndToolTip) {
452 ti.cbSize = sizeof(TTTOOLINFO32W);
453 ti.hwnd = wndPtr->hwndSelf;
454 ti.uId = LOWORD(wParam);
455 SendMessage32W (infoPtr->hwndToolTip, TTM_GETTEXT32W, 0, (LPARAM)&ti);
458 lstrcpyn32W ((LPWSTR)lParam, ti.lpszText, HIWORD(wParam));
465 __inline__ static LRESULT
466 STATUSBAR_GetUnicodeFormat (WND *wndPtr)
468 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
469 return infoPtr->bUnicode;
473 __inline__ static LRESULT
474 STATUSBAR_IsSimple (WND *wndPtr)
476 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
477 return infoPtr->simple;
482 STATUSBAR_SetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
484 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
488 oldBkColor = self->clrBk;
489 self->clrBk = (COLORREF)lParam;
490 hdc = GetDC32 (wndPtr->hwndSelf);
491 STATUSBAR_Refresh (wndPtr, hdc);
492 ReleaseDC32 (wndPtr->hwndSelf, hdc);
499 STATUSBAR_SetIcon (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
501 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
502 INT32 nPart = (INT32)wParam & 0x00ff;
505 if ((nPart < -1) || (nPart >= self->numParts))
508 hdc = GetDC32 (wndPtr->hwndSelf);
510 self->part0.hIcon = (HICON32)lParam;
512 STATUSBAR_RefreshPart (wndPtr, &self->part0, hdc);
515 self->parts[nPart].hIcon = (HICON32)lParam;
517 STATUSBAR_RefreshPart (wndPtr, &self->parts[nPart], hdc);
519 ReleaseDC32 (wndPtr->hwndSelf, hdc);
526 STATUSBAR_SetMinHeight (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
528 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
530 if (IsWindowVisible32 (wndPtr->hwndSelf)) {
531 HWND32 parent = GetParent32 (wndPtr->hwndSelf);
535 GetClientRect32 (parent, &parent_rect);
536 self->height = (INT32)wParam + VERT_BORDER;
537 width = parent_rect.right - parent_rect.left;
538 x = parent_rect.left;
539 y = parent_rect.bottom - self->height;
540 MoveWindow32 (wndPtr->hwndSelf, parent_rect.left,
541 parent_rect.bottom - self->height,
542 width, self->height, TRUE);
543 STATUSBAR_SetPartBounds (wndPtr);
551 STATUSBAR_SetParts (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
553 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
554 STATUSWINDOWPART *tmp;
561 self->simple = FALSE;
563 oldNumParts = self->numParts;
564 self->numParts = (INT32) wParam;
565 parts = (LPINT32) lParam;
566 if (oldNumParts > self->numParts) {
567 for (i = self->numParts ; i < oldNumParts; i++) {
568 if (self->parts[i].text && (self->parts[i].style != SBT_OWNERDRAW))
569 COMCTL32_Free (self->parts[i].text);
572 else if (oldNumParts < self->numParts) {
573 tmp = COMCTL32_Alloc (sizeof(STATUSWINDOWPART) * self->numParts);
574 for (i = 0; i < oldNumParts; i++) {
575 tmp[i] = self->parts[i];
578 COMCTL32_Free (self->parts);
582 for (i = 0; i < self->numParts; i++) {
583 self->parts[i].x = parts[i];
586 if (self->hwndToolTip) {
588 SendMessage32A (self->hwndToolTip, TTM_GETTOOLCOUNT, 0, 0);
590 if (nTipCount < self->numParts) {
595 ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
596 ti.cbSize = sizeof(TTTOOLINFO32A);
597 ti.hwnd = wndPtr->hwndSelf;
598 for (i = nTipCount; i < self->numParts; i++) {
599 TRACE (statusbar, "add tool %d\n", i);
601 SendMessage32A (self->hwndToolTip, TTM_ADDTOOL32A,
605 else if (nTipCount > self->numParts) {
609 for (i = nTipCount - 1; i >= self->numParts; i--) {
611 FIXME (statusbar, "delete tool %d\n", i);
617 STATUSBAR_SetPartBounds (wndPtr);
619 hdc = GetDC32 (wndPtr->hwndSelf);
620 STATUSBAR_Refresh (wndPtr, hdc);
621 ReleaseDC32 (wndPtr->hwndSelf, hdc);
628 STATUSBAR_SetText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
630 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
631 STATUSWINDOWPART *part;
638 text = (LPSTR) lParam;
639 part_num = ((INT32) wParam) & 0x00ff;
640 style = ((INT32) wParam) & 0xff00;
642 if ((self->simple) || (self->parts==NULL) || (part_num==255))
645 part = &self->parts[part_num];
646 if (!part) return FALSE;
648 if (style == SBT_OWNERDRAW) {
649 part->text = (LPWSTR)text;
652 /* duplicate string */
654 COMCTL32_Free (part->text);
656 if (text && (len = lstrlen32A(text))) {
657 part->text = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
658 lstrcpyAtoW (part->text, text);
662 hdc = GetDC32 (wndPtr->hwndSelf);
663 STATUSBAR_RefreshPart (wndPtr, part, hdc);
664 ReleaseDC32 (wndPtr->hwndSelf, hdc);
671 STATUSBAR_SetText32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
673 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
674 STATUSWINDOWPART *part;
675 INT32 part_num, style, len;
679 text = (LPWSTR) lParam;
680 part_num = ((INT32) wParam) & 0x00ff;
681 style = ((INT32) wParam) & 0xff00;
683 if ((self->simple) || (self->parts==NULL) || (part_num==255))
686 part = &self->parts[part_num];
687 if (!part) return FALSE;
689 if (style == SBT_OWNERDRAW) {
693 /* duplicate string */
695 COMCTL32_Free (part->text);
697 if (text && (len = lstrlen32W(text))) {
698 part->text = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
699 lstrcpy32W(part->text, text);
703 hdc = GetDC32 (wndPtr->hwndSelf);
704 STATUSBAR_RefreshPart (wndPtr, part, hdc);
705 ReleaseDC32 (wndPtr->hwndSelf, hdc);
712 STATUSBAR_SetTipText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
714 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
716 TRACE (statusbar, "part %d: \"%s\"\n", (INT32)wParam, (LPSTR)lParam);
717 if (infoPtr->hwndToolTip) {
719 ti.cbSize = sizeof(TTTOOLINFO32A);
720 ti.hwnd = wndPtr->hwndSelf;
721 ti.uId = (INT32)wParam;
723 ti.lpszText = (LPSTR)lParam;
724 SendMessage32A (infoPtr->hwndToolTip, TTM_UPDATETIPTEXT32A,
733 STATUSBAR_SetTipText32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
735 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
737 TRACE (statusbar, "part %d: \"%s\"\n", (INT32)wParam, (LPSTR)lParam);
738 if (infoPtr->hwndToolTip) {
740 ti.cbSize = sizeof(TTTOOLINFO32W);
741 ti.hwnd = wndPtr->hwndSelf;
742 ti.uId = (INT32)wParam;
744 ti.lpszText = (LPWSTR)lParam;
745 SendMessage32W (infoPtr->hwndToolTip, TTM_UPDATETIPTEXT32W,
753 __inline__ static LRESULT
754 STATUSBAR_SetUnicodeFormat (WND *wndPtr, WPARAM32 wParam)
756 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
757 BOOL32 bTemp = infoPtr->bUnicode;
759 TRACE (statusbar, "(0x%x)\n", (BOOL32)wParam);
760 infoPtr->bUnicode = (BOOL32)wParam;
767 STATUSBAR_Simple (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
769 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
773 infoPtr->simple = (BOOL32)wParam;
775 /* send notification */
776 nmhdr.hwndFrom = wndPtr->hwndSelf;
777 nmhdr.idFrom = wndPtr->wIDmenu;
778 nmhdr.code = SBN_SIMPLEMODECHANGE;
779 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
782 hdc = GetDC32 (wndPtr->hwndSelf);
783 STATUSBAR_Refresh (wndPtr, hdc);
784 ReleaseDC32 (wndPtr->hwndSelf, hdc);
791 STATUSBAR_WMCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
793 LPCREATESTRUCT32A lpCreate = (LPCREATESTRUCT32A)lParam;
794 NONCLIENTMETRICS32A nclm;
798 STATUSWINDOWINFO *self;
800 self = (STATUSWINDOWINFO*)COMCTL32_Alloc (sizeof(STATUSWINDOWINFO));
801 wndPtr->wExtra[0] = (DWORD)self;
805 self->simple = FALSE;
806 self->clrBk = CLR_DEFAULT;
808 GetClientRect32 (wndPtr->hwndSelf, &rect);
810 nclm.cbSize = sizeof(NONCLIENTMETRICS32A);
811 SystemParametersInfo32A (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
812 self->hDefaultFont = CreateFontIndirect32A (&nclm.lfStatusFont);
814 /* initialize simple case */
815 self->part0.bound = rect;
816 self->part0.text = 0;
818 self->part0.style = 0;
819 self->part0.hIcon = 0;
821 /* initialize first part */
822 self->parts = COMCTL32_Alloc (sizeof(STATUSWINDOWPART));
823 self->parts[0].bound = rect;
824 self->parts[0].text = 0;
825 self->parts[0].x = -1;
826 self->parts[0].style = 0;
827 self->parts[0].hIcon = 0;
829 if (IsWindowUnicode (wndPtr->hwndSelf)) {
830 self->bUnicode = TRUE;
831 if ((len = lstrlen32W ((LPCWSTR)lpCreate->lpszName))) {
832 self->parts[0].text = COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));
833 lstrcpy32W (self->parts[0].text, (LPCWSTR)lpCreate->lpszName);
837 if ((len = lstrlen32A ((LPCSTR)lpCreate->lpszName))) {
838 self->parts[0].text = COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));
839 lstrcpyAtoW (self->parts[0].text, (LPCSTR)lpCreate->lpszName);
843 if ((hdc = GetDC32 (0))) {
847 hOldFont = SelectObject32 (hdc,self->hDefaultFont);
848 GetTextMetrics32A(hdc, &tm);
849 self->textHeight = tm.tmHeight;
850 SelectObject32 (hdc, hOldFont);
854 if (wndPtr->dwStyle & SBT_TOOLTIPS) {
856 CreateWindowEx32A (0, TOOLTIPS_CLASS32A, NULL, 0,
857 CW_USEDEFAULT32, CW_USEDEFAULT32,
858 CW_USEDEFAULT32, CW_USEDEFAULT32,
860 wndPtr->hInstance, NULL);
862 if (self->hwndToolTip) {
863 NMTOOLTIPSCREATED nmttc;
865 nmttc.hdr.hwndFrom = wndPtr->hwndSelf;
866 nmttc.hdr.idFrom = wndPtr->wIDmenu;
867 nmttc.hdr.code = NM_TOOLTIPSCREATED;
868 nmttc.hwndToolTips = self->hwndToolTip;
870 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
871 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmttc);
875 GetClientRect32 (GetParent32 (wndPtr->hwndSelf), &rect);
876 width = rect.right - rect.left;
877 self->height = self->textHeight + 4 + VERT_BORDER;
878 MoveWindow32 (wndPtr->hwndSelf, lpCreate->x, lpCreate->y-1,
879 width, self->height, FALSE);
880 STATUSBAR_SetPartBounds (wndPtr);
887 STATUSBAR_WMDestroy (WND *wndPtr)
889 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
892 for (i = 0; i < self->numParts; i++) {
893 if (self->parts[i].text && (self->parts[i].style != SBT_OWNERDRAW))
894 COMCTL32_Free (self->parts[i].text);
896 if (self->part0.text && (self->part0.style != SBT_OWNERDRAW))
897 COMCTL32_Free (self->part0.text);
898 COMCTL32_Free (self->parts);
900 /* delete default font */
901 if (self->hDefaultFont)
902 DeleteObject32 (self->hDefaultFont);
904 /* delete tool tip control */
905 if (self->hwndToolTip)
906 DestroyWindow32 (self->hwndToolTip);
908 COMCTL32_Free (self);
914 static __inline__ LRESULT
915 STATUSBAR_WMGetFont (WND *wndPtr)
917 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
918 return infoPtr->hFont;
923 STATUSBAR_WMGetText (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
925 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
928 if (!(infoPtr->parts[0].text))
930 len = lstrlen32W (infoPtr->parts[0].text);
932 if (infoPtr->bUnicode)
933 lstrcpy32W ((LPWSTR)lParam, infoPtr->parts[0].text);
935 lstrcpyWtoA ((LPSTR)lParam, infoPtr->parts[0].text);
943 __inline__ static LRESULT
944 STATUSBAR_WMMouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
946 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
948 if (infoPtr->hwndToolTip)
949 STATUSBAR_RelayEvent (infoPtr->hwndToolTip, wndPtr->hwndSelf,
950 WM_MOUSEMOVE, wParam, lParam);
956 STATUSBAR_WMNCHitTest (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
958 if (wndPtr->dwStyle & SBARS_SIZEGRIP) {
962 GetClientRect32 (wndPtr->hwndSelf, &rect);
964 pt.x = (INT32)LOWORD(lParam);
965 pt.y = (INT32)HIWORD(lParam);
966 ScreenToClient32 (wndPtr->hwndSelf, &pt);
968 rect.left = rect.right - 13;
971 if (PtInRect32 (&rect, pt))
972 return HTBOTTOMRIGHT;
975 return DefWindowProc32A (wndPtr->hwndSelf, WM_NCHITTEST, wParam, lParam);
979 static __inline__ LRESULT
980 STATUSBAR_WMNCLButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
982 PostMessage32A (wndPtr->parent->hwndSelf, WM_NCLBUTTONDOWN,
988 static __inline__ LRESULT
989 STATUSBAR_WMNCLButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
991 PostMessage32A (wndPtr->parent->hwndSelf, WM_NCLBUTTONUP,
998 STATUSBAR_WMPaint (WND *wndPtr, WPARAM32 wParam)
1003 hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
1004 STATUSBAR_Refresh (wndPtr, hdc);
1006 EndPaint32 (wndPtr->hwndSelf, &ps);
1013 STATUSBAR_WMSetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1015 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
1017 infoPtr->hFont = (HFONT32)wParam;
1018 if (LOWORD(lParam) == TRUE) {
1019 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
1020 STATUSBAR_Refresh (wndPtr, hdc);
1021 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1029 STATUSBAR_WMSetText (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1031 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
1032 STATUSWINDOWPART *part;
1036 if (infoPtr->numParts == 0)
1039 part = &infoPtr->parts[0];
1040 /* duplicate string */
1042 COMCTL32_Free (part->text);
1044 if (infoPtr->bUnicode) {
1045 if (lParam && (len = lstrlen32W((LPCWSTR)lParam))) {
1046 part->text = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
1047 lstrcpy32W (part->text, (LPCWSTR)lParam);
1051 if (lParam && (len = lstrlen32A((LPCSTR)lParam))) {
1052 part->text = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
1053 lstrcpyAtoW (part->text, (LPCSTR)lParam);
1057 hdc = GetDC32 (wndPtr->hwndSelf);
1058 STATUSBAR_RefreshPart (wndPtr, part, hdc);
1059 ReleaseDC32 (wndPtr->hwndSelf, hdc);
1066 STATUSBAR_WMSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1068 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
1069 INT32 width, x, y, flags;
1073 /* Need to resize width to match parent */
1074 flags = (INT32) wParam;
1076 /* FIXME for flags =
1077 * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED, SIZE_RESTORED
1080 if (flags == SIZE_RESTORED) {
1081 /* width and height don't apply */
1082 parent = GetParent32 (wndPtr->hwndSelf);
1083 GetClientRect32 (parent, &parent_rect);
1084 width = parent_rect.right - parent_rect.left;
1085 x = parent_rect.left;
1086 y = parent_rect.bottom - infoPtr->height;
1087 MoveWindow32 (wndPtr->hwndSelf, parent_rect.left,
1088 parent_rect.bottom - infoPtr->height,
1089 width, infoPtr->height, TRUE);
1090 STATUSBAR_SetPartBounds (wndPtr);
1097 STATUSBAR_SendNotify (WND *wndPtr, UINT32 code)
1101 nmhdr.hwndFrom = wndPtr->hwndSelf;
1102 nmhdr.idFrom = wndPtr->wIDmenu;
1104 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
1112 StatusWindowProc (HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
1114 WND *wndPtr = WIN_FindWndPtr (hwnd);
1118 return STATUSBAR_GetBorders (lParam);
1121 return STATUSBAR_GetIcon (wndPtr, wParam);
1124 return STATUSBAR_GetParts (wndPtr, wParam, lParam);
1127 return STATUSBAR_GetRect (wndPtr, wParam, lParam);
1130 return STATUSBAR_GetText32A (wndPtr, wParam, lParam);
1133 return STATUSBAR_GetText32W (wndPtr, wParam, lParam);
1135 case SB_GETTEXTLENGTH32A:
1136 case SB_GETTEXTLENGTH32W:
1137 return STATUSBAR_GetTextLength (wndPtr, wParam);
1139 case SB_GETTIPTEXT32A:
1140 return STATUSBAR_GetTipText32A (wndPtr, wParam, lParam);
1142 case SB_GETTIPTEXT32W:
1143 return STATUSBAR_GetTipText32W (wndPtr, wParam, lParam);
1145 case SB_GETUNICODEFORMAT:
1146 return STATUSBAR_GetUnicodeFormat (wndPtr);
1149 return STATUSBAR_IsSimple (wndPtr);
1152 return STATUSBAR_SetBkColor (wndPtr, wParam, lParam);
1155 return STATUSBAR_SetIcon (wndPtr, wParam, lParam);
1157 case SB_SETMINHEIGHT:
1158 return STATUSBAR_SetMinHeight (wndPtr, wParam, lParam);
1161 return STATUSBAR_SetParts (wndPtr, wParam, lParam);
1164 return STATUSBAR_SetText32A (wndPtr, wParam, lParam);
1167 return STATUSBAR_SetText32W (wndPtr, wParam, lParam);
1169 case SB_SETTIPTEXT32A:
1170 return STATUSBAR_SetTipText32A (wndPtr, wParam, lParam);
1172 case SB_SETTIPTEXT32W:
1173 return STATUSBAR_SetTipText32W (wndPtr, wParam, lParam);
1175 case SB_SETUNICODEFORMAT:
1176 return STATUSBAR_SetUnicodeFormat (wndPtr, wParam);
1179 return STATUSBAR_Simple (wndPtr, wParam, lParam);
1183 return STATUSBAR_WMCreate (wndPtr, wParam, lParam);
1186 return STATUSBAR_WMDestroy (wndPtr);
1189 return STATUSBAR_WMGetFont (wndPtr);
1192 return STATUSBAR_WMGetText (wndPtr, wParam, lParam);
1194 case WM_GETTEXTLENGTH:
1195 return STATUSBAR_GetTextLength (wndPtr, 0);
1197 case WM_LBUTTONDBLCLK:
1198 return STATUSBAR_SendNotify (wndPtr, NM_DBLCLK);
1201 return STATUSBAR_SendNotify (wndPtr, NM_CLICK);
1204 return STATUSBAR_WMMouseMove (wndPtr, wParam, lParam);
1207 return STATUSBAR_WMNCHitTest (wndPtr, wParam, lParam);
1209 case WM_NCLBUTTONDOWN:
1210 return STATUSBAR_WMNCLButtonDown (wndPtr, wParam, lParam);
1212 case WM_NCLBUTTONUP:
1213 return STATUSBAR_WMNCLButtonUp (wndPtr, wParam, lParam);
1216 return STATUSBAR_WMPaint (wndPtr, wParam);
1218 case WM_RBUTTONDBLCLK:
1219 return STATUSBAR_SendNotify (wndPtr, NM_RDBLCLK);
1222 return STATUSBAR_SendNotify (wndPtr, NM_RCLICK);
1225 return STATUSBAR_WMSetFont (wndPtr, wParam, lParam);
1228 return STATUSBAR_WMSetText (wndPtr, wParam, lParam);
1231 return STATUSBAR_WMSize (wndPtr, wParam, lParam);
1235 ERR (statusbar, "unknown msg %04x wp=%04x lp=%08lx\n",
1236 msg, wParam, lParam);
1237 return DefWindowProc32A (hwnd, msg, wParam, lParam);
1243 /***********************************************************************
1244 * STATUS_Register [Internal]
1246 * Registers the status window class.
1250 STATUS_Register (VOID)
1252 WNDCLASS32A wndClass;
1254 if (GlobalFindAtom32A (STATUSCLASSNAME32A)) return;
1256 ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
1257 wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW;
1258 wndClass.lpfnWndProc = (WNDPROC32)StatusWindowProc;
1259 wndClass.cbClsExtra = 0;
1260 wndClass.cbWndExtra = sizeof(STATUSWINDOWINFO *);
1261 wndClass.hCursor = LoadCursor32A (0, IDC_ARROW32A);
1262 wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
1263 wndClass.lpszClassName = STATUSCLASSNAME32A;
1265 RegisterClass32A (&wndClass);
1269 /***********************************************************************
1270 * STATUS_Unregister [Internal]
1272 * Unregisters the status window class.
1276 STATUS_Unregister (VOID)
1278 if (GlobalFindAtom32A (STATUSCLASSNAME32A))
1279 UnregisterClass32A (STATUSCLASSNAME32A, (HINSTANCE32)NULL);