2 * Interface code to StatusWindow widget/control
4 * Copyright 1996 Bruce Milner
5 * Copyright 1998 Eric Kohl
15 * Run tests using Waite Group Windows95 API Bible Vol. 1&2
16 * The second cdrom contains executables drawstat.exe,gettext.exe,
17 * simple.exe, getparts.exe, setparts.exe, statwnd.exe
22 * 1) Don't hard code bar to bottom of window, allow CCS_TOP also.
23 + 2) Tooltip support (almost done).
26 #define _MAX(a,b) (((a)>(b))?(a):(b))
27 #define _MIN(a,b) (((a)>(b))?(b):(a))
33 #define STATUSBAR_GetInfoPtr(wndPtr) ((STATUSWINDOWINFO *)wndPtr->wExtra[0])
37 STATUSBAR_DrawSizeGrip (HDC32 hdc, LPRECT32 lpRect)
43 pt.x = lpRect->right - 1;
44 pt.y = lpRect->bottom - 1;
46 hOldPen = SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DFACE));
47 MoveToEx32 (hdc, pt.x - 12, pt.y, NULL);
48 LineTo32 (hdc, pt.x, pt.y);
49 LineTo32 (hdc, pt.x, pt.y - 12);
54 SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DSHADOW));
55 for (i = 1; i < 11; i += 4) {
56 MoveToEx32 (hdc, pt.x - i, pt.y, NULL);
57 LineTo32 (hdc, pt.x, pt.y - i);
59 MoveToEx32 (hdc, pt.x - i-1, pt.y, NULL);
60 LineTo32 (hdc, pt.x, pt.y - i-1);
63 SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DHIGHLIGHT));
64 for (i = 3; i < 13; i += 4) {
65 MoveToEx32 (hdc, pt.x - i, pt.y, NULL);
66 LineTo32 (hdc, pt.x, pt.y - i);
69 SelectObject32 (hdc, hOldPen);
74 STATUSBAR_DrawPart (HDC32 hdc, STATUSWINDOWPART *part)
76 RECT32 r = part->bound;
77 UINT32 border = BDR_SUNKENOUTER;
79 if (part->style==SBT_POPOUT)
80 border = BDR_RAISEDOUTER;
81 else if (part->style==SBT_NOBORDERS)
84 DrawEdge32(hdc, &r, border, BF_RECT|BF_ADJUST);
88 INT32 cy = r.bottom - r.top;
91 DrawIconEx32 (hdc, r.left, r.top, part->hIcon, cy, cy, 0, 0, DI_NORMAL);
97 int oldbkmode = SetBkMode32(hdc, TRANSPARENT);
98 LPSTR p = (LPSTR)part->text;
99 UINT32 align = DT_LEFT;
110 DrawText32A(hdc, p, lstrlen32A(p), &r, align|DT_VCENTER|DT_SINGLELINE);
111 if (oldbkmode != TRANSPARENT)
112 SetBkMode32(hdc, oldbkmode);
118 STATUSBAR_RefreshPart (WND *wndPtr, STATUSWINDOWPART *part, HDC32 hdc)
120 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
124 if (!IsWindowVisible32(wndPtr->hwndSelf))
127 if (self->clrBk != CLR_DEFAULT)
128 hbrBk = CreateSolidBrush32 (self->clrBk);
130 hbrBk = GetSysColorBrush32 (COLOR_3DFACE);
131 FillRect32(hdc, &part->bound, hbrBk);
133 hOldFont = SelectObject32 (hdc, self->hFont ? self->hFont : self->hDefaultFont);
135 if (part->style == SBT_OWNERDRAW) {
136 DRAWITEMSTRUCT32 dis;
138 dis.CtlID = wndPtr->wIDmenu;
140 dis.hwndItem = wndPtr->hwndSelf;
142 dis.rcItem = part->bound;
143 dis.itemData = (INT32)part->text;
144 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_DRAWITEM,
145 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&dis);
148 STATUSBAR_DrawPart (hdc, part);
150 SelectObject32 (hdc, hOldFont);
152 if (self->clrBk != CLR_DEFAULT)
153 DeleteObject32 (hbrBk);
155 if (wndPtr->dwStyle & SBARS_SIZEGRIP) {
158 GetClientRect32 (wndPtr->hwndSelf, &rect);
159 STATUSBAR_DrawSizeGrip (hdc, &rect);
165 STATUSBAR_Refresh (WND *wndPtr, HDC32 hdc)
167 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
173 if (!IsWindowVisible32(wndPtr->hwndSelf))
176 GetClientRect32 (wndPtr->hwndSelf, &rect);
178 if (self->clrBk != CLR_DEFAULT)
179 hbrBk = CreateSolidBrush32 (self->clrBk);
181 hbrBk = GetSysColorBrush32 (COLOR_3DFACE);
182 FillRect32(hdc, &rect, hbrBk);
184 hOldFont = SelectObject32 (hdc, self->hFont ? self->hFont : self->hDefaultFont);
187 STATUSBAR_DrawPart (hdc, &self->part0);
190 for (i = 0; i < self->numParts; i++) {
191 if (self->parts[i].style == SBT_OWNERDRAW) {
192 DRAWITEMSTRUCT32 dis;
194 dis.CtlID = wndPtr->wIDmenu;
196 dis.hwndItem = wndPtr->hwndSelf;
198 dis.rcItem = self->parts[i].bound;
199 dis.itemData = (INT32)self->parts[i].text;
200 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_DRAWITEM,
201 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&dis);
204 STATUSBAR_DrawPart (hdc, &self->parts[i]);
208 SelectObject32 (hdc, hOldFont);
210 if (self->clrBk != CLR_DEFAULT)
211 DeleteObject32 (hbrBk);
213 if (wndPtr->dwStyle & SBARS_SIZEGRIP)
214 STATUSBAR_DrawSizeGrip (hdc, &rect);
221 STATUSBAR_SetPartBounds (WND *wndPtr)
223 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
224 STATUSWINDOWPART *part;
228 /* get our window size */
229 GetClientRect32 (wndPtr->hwndSelf, &rect);
231 rect.top += VERT_BORDER;
233 /* set bounds for simple rectangle */
234 self->part0.bound = rect;
236 /* set bounds for non-simple rectangles */
237 for (i = 0; i < self->numParts; i++) {
238 part = &self->parts[i];
239 r = &self->parts[i].bound;
241 r->bottom = rect.bottom;
245 r->left = self->parts[i-1].bound.right + HORZ_GAP;
247 r->right = rect.right;
251 if (self->hwndToolTip) {
254 ti.cbSize = sizeof(TTTOOLINFO32A);
255 ti.hwnd = wndPtr->hwndSelf;
258 SendMessage32A (self->hwndToolTip, TTM_NEWTOOLRECT32A,
266 STATUSBAR_RelayEvent (HWND32 hwndTip, HWND32 hwndMsg, UINT32 uMsg,
267 WPARAM32 wParam, LPARAM lParam)
275 msg.time = GetMessageTime ();
276 msg.pt.x = LOWORD(GetMessagePos ());
277 msg.pt.y = HIWORD(GetMessagePos ());
279 SendMessage32A (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
283 __inline__ static LRESULT
284 STATUSBAR_GetBorders (LPARAM lParam)
286 LPINT32 out = (LPINT32) lParam;
288 out[0] = HORZ_BORDER; /* horizontal border width */
289 out[1] = VERT_BORDER; /* vertical border width */
290 out[2] = HORZ_GAP; /* width of border between rectangles */
297 STATUSBAR_GetIcon (WND *wndPtr, WPARAM32 wParam)
299 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
302 nPart = (INT32)wParam & 0x00ff;
303 if ((nPart < -1) || (nPart >= self->numParts)) return 0;
306 return (self->part0.hIcon);
308 return (self->parts[nPart].hIcon);
313 STATUSBAR_GetParts (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
315 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
320 num_parts = (INT32) wParam;
321 parts = (LPINT32) lParam;
323 return (self->numParts);
324 for (i = 0; i < num_parts; i++) {
325 parts[i] = self->parts[i].x;
328 return (self->numParts);
333 STATUSBAR_GetRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
335 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
339 part_num = ((INT32) wParam) & 0x00ff;
340 rect = (LPRECT32) lParam;
342 *rect = self->part0.bound;
344 *rect = self->parts[part_num].bound;
350 STATUSBAR_GetText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
352 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
353 STATUSWINDOWPART *part;
358 part_num = ((INT32) wParam) & 0x00ff;
359 out_text = (LPSTR) lParam;
363 part = &self->parts[part_num];
365 if (part->style == SBT_OWNERDRAW)
366 result = (LRESULT) part->text;
368 result = part->text ? lstrlen32A(part->text) : 0;
369 result |= (part->style << 16);
371 lstrcpy32A(out_text, part->text);
378 // << STATUSBAR_GetText32W >>
382 STATUSBAR_GetTextLength32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
384 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
385 STATUSWINDOWPART *part;
389 part_num = ((INT32) wParam) & 0x00ff;
394 part = &self->parts[part_num];
397 result = lstrlen32A(part->text);
401 result |= (part->style << 16);
406 // << STATUSBAR_GetTextLength32W >>
410 STATUSBAR_GetTipText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
412 STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
414 if (infoPtr->hwndToolTip) {
417 ti.cbSize = sizeof(TTTOOLINFO32A);
418 ti.hwnd = wndPtr->hwndSelf;
419 ti.uId = LOWORD(wParam);
420 SendMessage32A (infoPtr->hwndToolTip, TTM_GETTEXT32A, 0, (LPARAM)&ti);
423 lstrcpyn32A ((LPSTR)lParam, ti.lpszText, HIWORD(wParam));
430 // << STATUSBAR_GetTipText32W >>
431 // << STATUSBAR_GetUnicodeFormat >>
434 __inline__ static LRESULT
435 STATUSBAR_IsSimple (WND *wndPtr)
437 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
444 STATUSBAR_SetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
446 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
450 oldBkColor = self->clrBk;
451 self->clrBk = (COLORREF)lParam;
452 hdc = GetDC32 (wndPtr->hwndSelf);
453 STATUSBAR_Refresh (wndPtr, hdc);
454 ReleaseDC32 (wndPtr->hwndSelf, hdc);
461 STATUSBAR_SetIcon (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
463 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
464 INT32 nPart = (INT32)wParam & 0x00ff;
467 if ((nPart < -1) || (nPart >= self->numParts)) return FALSE;
469 hdc = GetDC32 (wndPtr->hwndSelf);
471 self->part0.hIcon = (HICON32)lParam;
473 STATUSBAR_RefreshPart (wndPtr, &self->part0, hdc);
476 self->parts[nPart].hIcon = (HICON32)lParam;
478 STATUSBAR_RefreshPart (wndPtr, &self->parts[nPart], hdc);
480 ReleaseDC32 (wndPtr->hwndSelf, hdc);
487 STATUSBAR_SetMinHeight (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
489 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
491 if (IsWindowVisible32 (wndPtr->hwndSelf)) {
492 HWND32 parent = GetParent32 (wndPtr->hwndSelf);
496 GetClientRect32 (parent, &parent_rect);
497 self->height = (INT32)wParam + VERT_BORDER;
498 width = parent_rect.right - parent_rect.left;
499 x = parent_rect.left;
500 y = parent_rect.bottom - self->height;
501 MoveWindow32 (wndPtr->hwndSelf, parent_rect.left,
502 parent_rect.bottom - self->height,
503 width, self->height, TRUE);
504 STATUSBAR_SetPartBounds (wndPtr);
512 STATUSBAR_SetParts (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
514 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
517 STATUSWINDOWPART * tmp;
522 self->simple = FALSE;
524 oldNumParts = self->numParts;
525 self->numParts = (INT32) wParam;
526 parts = (LPINT32) lParam;
527 if (oldNumParts > self->numParts) {
528 for (i = self->numParts ; i < oldNumParts; i++) {
529 if (self->parts[i].text && (self->parts[i].style != SBT_OWNERDRAW))
530 COMCTL32_Free (self->parts[i].text);
533 else if (oldNumParts < self->numParts) {
534 tmp = COMCTL32_Alloc (sizeof(STATUSWINDOWPART) * self->numParts);
535 for (i = 0; i < oldNumParts; i++) {
536 tmp[i] = self->parts[i];
539 COMCTL32_Free (self->parts);
543 for (i = 0; i < self->numParts; i++) {
544 self->parts[i].x = parts[i];
547 if (self->hwndToolTip) {
549 SendMessage32A (self->hwndToolTip, TTM_GETTOOLCOUNT, 0, 0);
551 if (nTipCount < self->numParts) {
556 ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
557 ti.cbSize = sizeof(TTTOOLINFO32A);
558 ti.hwnd = wndPtr->hwndSelf;
559 for (i = nTipCount; i < self->numParts; i++) {
560 TRACE (statusbar, "add tool %d\n", i);
562 SendMessage32A (self->hwndToolTip, TTM_ADDTOOL32A,
566 else if (nTipCount > self->numParts) {
570 for (i = nTipCount - 1; i >= self->numParts; i--) {
572 TRACE (statusbar, "delete tool %d\n", i);
578 STATUSBAR_SetPartBounds (wndPtr);
580 hdc = GetDC32 (wndPtr->hwndSelf);
581 STATUSBAR_Refresh (wndPtr, hdc);
582 ReleaseDC32 (wndPtr->hwndSelf, hdc);
589 STATUSBAR_SetText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
591 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
592 STATUSWINDOWPART *part;
599 text = (LPSTR) lParam;
600 part_num = ((INT32) wParam) & 0x00ff;
601 style = ((INT32) wParam) & 0xff00;
603 if ((self->simple) || (self->parts==NULL) || (part_num==255))
606 part = &self->parts[part_num];
607 if (!part) return FALSE;
609 if (style == SBT_OWNERDRAW) {
613 /* duplicate string */
615 COMCTL32_Free (part->text);
617 if (text && (len = lstrlen32A(text))) {
618 part->text = COMCTL32_Alloc (len+1);
619 lstrcpy32A(part->text, text);
623 hdc = GetDC32 (wndPtr->hwndSelf);
624 STATUSBAR_RefreshPart (wndPtr, part, hdc);
625 ReleaseDC32 (wndPtr->hwndSelf, hdc);
631 // << STATUSBAR_SetText32W >>
635 STATUSBAR_SetTipText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
637 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
640 TRACE (statusbar, "part %d: \"%s\"\n", (INT32)wParam, (LPSTR)lParam);
641 if (self->hwndToolTip) {
642 ti.cbSize = sizeof(TTTOOLINFO32A);
643 ti.hwnd = wndPtr->hwndSelf;
644 ti.uId = (INT32)wParam;
646 ti.lpszText = (LPSTR)lParam;
647 SendMessage32A (self->hwndToolTip, TTM_UPDATETIPTEXT32A,
655 // << STATUSBAR_SetTipText32W >>
656 // << STATUSBAR_SetUnicodeFormat >>
660 STATUSBAR_Simple (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
662 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
667 simple = (BOOL32) wParam;
668 self->simple = simple;
670 /* send notification */
671 nmhdr.hwndFrom = wndPtr->hwndSelf;
672 nmhdr.idFrom = wndPtr->wIDmenu;
673 nmhdr.code = SBN_SIMPLEMODECHANGE;
674 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
677 hdc = GetDC32 (wndPtr->hwndSelf);
678 STATUSBAR_Refresh (wndPtr, hdc);
679 ReleaseDC32 (wndPtr->hwndSelf, hdc);
686 STATUSBAR_WMCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
688 LPCREATESTRUCT32A lpCreate = (LPCREATESTRUCT32A) lParam;
689 NONCLIENTMETRICS32A nclm;
693 STATUSWINDOWINFO *self;
695 self = (STATUSWINDOWINFO*)COMCTL32_Alloc (sizeof(STATUSWINDOWINFO));
696 wndPtr->wExtra[0] = (DWORD)self;
700 self->simple = FALSE;
701 self->clrBk = CLR_DEFAULT;
703 GetClientRect32 (wndPtr->hwndSelf, &rect);
705 nclm.cbSize = sizeof(NONCLIENTMETRICS32A);
706 SystemParametersInfo32A (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
707 self->hDefaultFont = CreateFontIndirect32A (&nclm.lfStatusFont);
709 /* initialize simple case */
710 self->part0.bound = rect;
711 self->part0.text = 0;
713 self->part0.style = 0;
714 self->part0.hIcon = 0;
716 /* initialize first part */
717 self->parts = COMCTL32_Alloc (sizeof(STATUSWINDOWPART));
718 self->parts[0].bound = rect;
719 self->parts[0].text = 0;
720 self->parts[0].x = -1;
721 self->parts[0].style = 0;
722 self->parts[0].hIcon = 0;
724 if ((len = lstrlen32A (lpCreate->lpszName))) {
725 self->parts[0].text = COMCTL32_Alloc (len + 1);
726 lstrcpy32A (self->parts[0].text, lpCreate->lpszName);
729 if ((hdc = GetDC32 (0))) {
733 hOldFont = SelectObject32 (hdc,self->hDefaultFont);
734 GetTextMetrics32A(hdc, &tm);
735 self->textHeight = tm.tmHeight;
736 SelectObject32 (hdc, hOldFont);
740 if (wndPtr->dwStyle & SBT_TOOLTIPS) {
742 CreateWindowEx32A (0, TOOLTIPS_CLASS32A, NULL, 0,
743 CW_USEDEFAULT32, CW_USEDEFAULT32,
744 CW_USEDEFAULT32, CW_USEDEFAULT32,
746 wndPtr->hInstance, NULL);
748 if (self->hwndToolTip) {
749 NMTOOLTIPSCREATED nmttc;
751 nmttc.hdr.hwndFrom = wndPtr->hwndSelf;
752 nmttc.hdr.idFrom = wndPtr->wIDmenu;
753 nmttc.hdr.code = NM_TOOLTIPSCREATED;
754 nmttc.hwndToolTips = self->hwndToolTip;
756 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
757 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmttc);
761 GetClientRect32 (GetParent32 (wndPtr->hwndSelf), &rect);
762 width = rect.right - rect.left;
763 self->height = self->textHeight + 4 + VERT_BORDER;
764 MoveWindow32 (wndPtr->hwndSelf, lpCreate->x, lpCreate->y-1,
765 width, self->height, FALSE);
766 STATUSBAR_SetPartBounds (wndPtr);
773 STATUSBAR_WMDestroy (WND *wndPtr)
775 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
778 for (i = 0; i < self->numParts; i++) {
779 if (self->parts[i].text && (self->parts[i].style != SBT_OWNERDRAW))
780 COMCTL32_Free (self->parts[i].text);
782 if (self->part0.text && (self->part0.style != SBT_OWNERDRAW))
783 COMCTL32_Free (self->part0.text);
784 COMCTL32_Free (self->parts);
786 /* delete default font */
787 if (self->hDefaultFont)
788 DeleteObject32 (self->hDefaultFont);
790 /* delete tool tip control */
791 if (self->hwndToolTip)
792 DestroyWindow32 (self->hwndToolTip);
794 COMCTL32_Free (self);
800 static __inline__ LRESULT
801 STATUSBAR_WMGetFont (WND *wndPtr)
803 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
810 STATUSBAR_WMGetText (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
812 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
815 if (!(self->parts[0].text))
817 len = lstrlen32A (self->parts[0].text);
819 lstrcpy32A ((LPSTR)lParam, self->parts[0].text);
828 STATUSBAR_WMGetTextLength (WND *wndPtr)
830 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
832 if (!(self->parts[0].text))
835 return (lstrlen32A (self->parts[0].text));
839 __inline__ static LRESULT
840 STATUSBAR_WMMouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
842 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
844 if (self->hwndToolTip)
845 STATUSBAR_RelayEvent (self->hwndToolTip, wndPtr->hwndSelf,
846 WM_MOUSEMOVE, wParam, lParam);
852 STATUSBAR_WMNCHitTest (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
854 if (wndPtr->dwStyle & SBARS_SIZEGRIP) {
858 GetClientRect32 (wndPtr->hwndSelf, &rect);
860 pt.x = (INT32)LOWORD(lParam);
861 pt.y = (INT32)HIWORD(lParam);
862 ScreenToClient32 (wndPtr->hwndSelf, &pt);
864 rect.left = rect.right - 13;
867 if (PtInRect32 (&rect, pt))
868 return HTBOTTOMRIGHT;
871 return DefWindowProc32A (wndPtr->hwndSelf, WM_NCHITTEST, wParam, lParam);
875 static __inline__ LRESULT
876 STATUSBAR_WMNCLButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
878 PostMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NCLBUTTONDOWN,
884 static __inline__ LRESULT
885 STATUSBAR_WMNCLButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
887 PostMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NCLBUTTONUP,
894 STATUSBAR_WMPaint (WND *wndPtr, WPARAM32 wParam)
899 hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
900 STATUSBAR_Refresh (wndPtr, hdc);
902 EndPaint32 (wndPtr->hwndSelf, &ps);
909 STATUSBAR_WMSetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
911 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
913 self->hFont = (HFONT32)wParam;
914 if (LOWORD(lParam) == TRUE) {
915 HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
916 STATUSBAR_Refresh (wndPtr, hdc);
917 ReleaseDC32 (wndPtr->hwndSelf, hdc);
925 STATUSBAR_WMSetText (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
927 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
928 STATUSWINDOWPART *part;
932 if (self->numParts == 0)
935 part = &self->parts[0];
936 /* duplicate string */
938 COMCTL32_Free (part->text);
940 if (lParam && (len = lstrlen32A((LPCSTR)lParam))) {
941 part->text = COMCTL32_Alloc (len+1);
942 lstrcpy32A (part->text, (LPCSTR)lParam);
945 hdc = GetDC32 (wndPtr->hwndSelf);
946 STATUSBAR_RefreshPart (wndPtr, part, hdc);
947 ReleaseDC32 (wndPtr->hwndSelf, hdc);
954 STATUSBAR_WMSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
956 STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
957 INT32 width, x, y, flags;
961 /* Need to resize width to match parent */
962 flags = (INT32) wParam;
965 * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED, SIZE_RESTORED
968 if (flags == SIZE_RESTORED) {
969 /* width and height don't apply */
970 parent = GetParent32 (wndPtr->hwndSelf);
971 GetClientRect32 (parent, &parent_rect);
972 width = parent_rect.right - parent_rect.left;
973 x = parent_rect.left;
974 y = parent_rect.bottom - self->height;
975 MoveWindow32 (wndPtr->hwndSelf, parent_rect.left,
976 parent_rect.bottom - self->height,
977 width, self->height, TRUE);
978 STATUSBAR_SetPartBounds (wndPtr);
985 STATUSBAR_SendNotify (WND *wndPtr, UINT32 code)
989 nmhdr.hwndFrom = wndPtr->hwndSelf;
990 nmhdr.idFrom = wndPtr->wIDmenu;
992 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
1000 StatusWindowProc (HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
1002 WND *wndPtr = WIN_FindWndPtr (hwnd);
1006 return STATUSBAR_GetBorders (lParam);
1009 return STATUSBAR_GetIcon (wndPtr, wParam);
1012 return STATUSBAR_GetParts (wndPtr, wParam, lParam);
1015 return STATUSBAR_GetRect (wndPtr, wParam, lParam);
1018 return STATUSBAR_GetText32A (wndPtr, wParam, lParam);
1020 // case SB_GETTEXT32W:
1022 case SB_GETTEXTLENGTH32A:
1023 return STATUSBAR_GetTextLength32A (wndPtr, wParam, lParam);
1025 // case SB_GETTEXTLENGHT32W:
1027 case SB_GETTIPTEXT32A:
1028 return STATUSBAR_GetTipText32A (wndPtr, wParam, lParam);
1030 // case SB_GETTIPTEXT32W:
1031 // case SB_GETUNICODEFORMAT:
1034 return STATUSBAR_IsSimple (wndPtr);
1037 return STATUSBAR_SetBkColor (wndPtr, wParam, lParam);
1040 return STATUSBAR_SetIcon (wndPtr, wParam, lParam);
1042 case SB_SETMINHEIGHT:
1043 return STATUSBAR_SetMinHeight (wndPtr, wParam, lParam);
1046 return STATUSBAR_SetParts (wndPtr, wParam, lParam);
1049 return STATUSBAR_SetText32A (wndPtr, wParam, lParam);
1051 // case SB_SETTEXT32W:
1053 case SB_SETTIPTEXT32A:
1054 return STATUSBAR_SetTipText32A (wndPtr, wParam, lParam);
1056 // case SB_SETTIPTEXT32W:
1057 // case SB_SETUNICODEFORMAT:
1060 return STATUSBAR_Simple (wndPtr, wParam, lParam);
1064 return STATUSBAR_WMCreate (wndPtr, wParam, lParam);
1067 return STATUSBAR_WMDestroy (wndPtr);
1070 return STATUSBAR_WMGetFont (wndPtr);
1073 return STATUSBAR_WMGetText (wndPtr, wParam, lParam);
1075 case WM_GETTEXTLENGTH:
1076 return STATUSBAR_WMGetTextLength (wndPtr);
1078 case WM_LBUTTONDBLCLK:
1079 return STATUSBAR_SendNotify (wndPtr, NM_DBLCLK);
1082 return STATUSBAR_SendNotify (wndPtr, NM_CLICK);
1085 return STATUSBAR_WMMouseMove (wndPtr, wParam, lParam);
1088 return STATUSBAR_WMNCHitTest (wndPtr, wParam, lParam);
1090 case WM_NCLBUTTONDOWN:
1091 return STATUSBAR_WMNCLButtonDown (wndPtr, wParam, lParam);
1093 case WM_NCLBUTTONUP:
1094 return STATUSBAR_WMNCLButtonUp (wndPtr, wParam, lParam);
1097 return STATUSBAR_WMPaint (wndPtr, wParam);
1099 case WM_RBUTTONDBLCLK:
1100 return STATUSBAR_SendNotify (wndPtr, NM_RDBLCLK);
1103 return STATUSBAR_SendNotify (wndPtr, NM_RCLICK);
1106 return STATUSBAR_WMSetFont (wndPtr, wParam, lParam);
1109 return STATUSBAR_WMSetText (wndPtr, wParam, lParam);
1112 return STATUSBAR_WMSize (wndPtr, wParam, lParam);
1116 ERR (statusbar, "unknown msg %04x wp=%04x lp=%08lx\n",
1117 msg, wParam, lParam);
1118 return DefWindowProc32A (hwnd, msg, wParam, lParam);
1124 /***********************************************************************
1125 * STATUS_Register [Internal]
1127 * Registers the status window class.
1129 void STATUS_Register (void)
1131 WNDCLASS32A wndClass;
1133 if (GlobalFindAtom32A (STATUSCLASSNAME32A)) return;
1135 ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
1136 wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW;
1137 wndClass.lpfnWndProc = (WNDPROC32)StatusWindowProc;
1138 wndClass.cbClsExtra = 0;
1139 wndClass.cbWndExtra = sizeof(STATUSWINDOWINFO *);
1140 wndClass.hCursor = LoadCursor32A (0, IDC_ARROW32A);
1141 wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
1142 wndClass.lpszClassName = STATUSCLASSNAME32A;
1144 RegisterClass32A (&wndClass);