ReactOS 0.4.15-dev-7958-gcd0bb1a
status.c
Go to the documentation of this file.
1/*
2 * Interface code to StatusWindow widget/control
3 *
4 * Copyright 1996 Bruce Milner
5 * Copyright 1998, 1999 Eric Kohl
6 * Copyright 2002 Dimitrie O. Paun
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 *
22 * TODO:
23 * -- CCS_BOTTOM (default)
24 * -- CCS_LEFT
25 * -- CCS_NODIVIDER
26 * -- CCS_NOMOVEX
27 * -- CCS_NOMOVEY
28 * -- CCS_NOPARENTALIGN
29 * -- CCS_RIGHT
30 * -- CCS_TOP
31 * -- CCS_VERT (defaults to RIGHT)
32 */
33
34#include <stdarg.h>
35#include <string.h>
36
37#include "windef.h"
38#include "winbase.h"
39#include "wine/unicode.h"
40#include "wingdi.h"
41#include "winuser.h"
42#include "winnls.h"
43#include "commctrl.h"
44#include "comctl32.h"
45#include "uxtheme.h"
46#include "vssym32.h"
47#include "wine/debug.h"
48
50
51typedef struct
52{
59
60typedef struct
61{
66 UINT minHeight; /* at least MIN_PANE_HEIGHT, can be increased by SB_SETMINHEIGHT */
71 COLORREF clrBk; /* background color */
72 BOOL bUnicode; /* notify format. TRUE if notifies in Unicode */
73 STATUSWINDOWPART part0; /* simple window */
79
80/*
81 * Run tests using Waite Group Windows95 API Bible Vol. 1&2
82 * The second cdrom contains executables drawstat.exe, gettext.exe,
83 * simple.exe, getparts.exe, setparts.exe, statwnd.exe
84 */
85
86#define HORZ_BORDER 0
87#define VERT_BORDER 2
88#define HORZ_GAP 2
89
90static const WCHAR themeClass[] = { 'S','t','a','t','u','s',0 };
91
92/* prototype */
93static void
95static LRESULT
97
99{
100 return isW ? debugstr_w(text) : debugstr_a((LPCSTR)text);
101}
102
103static UINT
105{
106 HTHEME theme;
107 UINT height;
109 int margin;
110
111 COMCTL32_GetFontMetrics(infoPtr->hFont ? infoPtr->hFont : infoPtr->hDefaultFont, &tm);
112 margin = (tm.tmInternalLeading ? tm.tmInternalLeading : 2);
113 height = max(tm.tmHeight + margin + 2*GetSystemMetrics(SM_CYBORDER), infoPtr->minHeight) + infoPtr->verticalBorder;
114
115 if ((theme = GetWindowTheme(infoPtr->Self)))
116 {
117 /* Determine bar height from theme such that the content area is
118 * textHeight pixels large */
119 HDC hdc = GetDC(infoPtr->Self);
120 RECT r;
121
122 SetRect(&r, 0, 0, 0, max(infoPtr->minHeight, tm.tmHeight));
123 if (SUCCEEDED(GetThemeBackgroundExtent(theme, hdc, SP_PANE, 0, &r, &r)))
124 {
125 height = r.bottom - r.top;
126 }
127 ReleaseDC(infoPtr->Self, hdc);
128 }
129
130 TRACE(" textHeight=%d+%d, final height=%d\n", tm.tmHeight, tm.tmInternalLeading, height);
131 return height;
132}
133
134static void
136{
137 RECT rc = *lpRect;
138
139 TRACE("draw size grip %s\n", wine_dbgstr_rect(lpRect));
140
141 if (theme)
142 {
143 SIZE gripperSize;
144 if (SUCCEEDED (GetThemePartSize (theme, hdc, SP_GRIPPER, 0, lpRect,
145 TS_DRAW, &gripperSize)))
146 {
147 rc.left = rc.right - gripperSize.cx;
148 rc.top = rc.bottom - gripperSize.cy;
149 if (SUCCEEDED (DrawThemeBackground(theme, hdc, SP_GRIPPER, 0, &rc, NULL)))
150 return;
151 }
152 }
153
154 rc.left = max( rc.left, rc.right - GetSystemMetrics(SM_CXVSCROLL) - 1 );
155 rc.top = max( rc.top, rc.bottom - GetSystemMetrics(SM_CYHSCROLL) - 1 );
157}
158
159
160static void
161STATUSBAR_DrawPart (const STATUS_INFO *infoPtr, HDC hdc, const STATUSWINDOWPART *part, int itemID)
162{
163 RECT r = part->bound;
165 HTHEME theme = GetWindowTheme (infoPtr->Self);
166 int themePart = SP_PANE;
167 int x = 0;
168
169 TRACE("part bound %s\n", wine_dbgstr_rect(&r));
170 if (part->style & SBT_POPOUT)
172 else if (part->style & SBT_NOBORDERS)
173 border = 0;
174
175 if (theme)
176 {
177 if ((GetWindowLongW (infoPtr->Self, GWL_STYLE) & SBARS_SIZEGRIP)
178 && (infoPtr->simple || (itemID == (infoPtr->numParts-1))))
179 themePart = SP_GRIPPERPANE;
180 DrawThemeBackground(theme, hdc, themePart, 0, &r, NULL);
181 }
182 else
184
185 if (part->hIcon) {
186 INT cy = r.bottom - r.top;
187 DrawIconEx (hdc, r.left + 2, r.top, part->hIcon, cy, cy, 0, 0, DI_NORMAL);
188 x = 2 + cy;
189 }
190
191 if (part->style & SBT_OWNERDRAW) {
192 DRAWITEMSTRUCT dis;
193
194 dis.CtlID = GetWindowLongPtrW (infoPtr->Self, GWLP_ID);
195 dis.itemID = itemID;
196 dis.hwndItem = infoPtr->Self;
197 dis.hDC = hdc;
198 dis.rcItem = r;
199 dis.itemData = (ULONG_PTR)part->text;
200 SendMessageW (infoPtr->Notify, WM_DRAWITEM, dis.CtlID, (LPARAM)&dis);
201 } else {
202 r.left += x;
203#ifdef __REACTOS__
204 if (!theme)
205 {
206 r.left -= 2;
208 }
209 else
210 {
211 r.left += 2;
212 r.right -= 2;
213 DrawThemeText(theme, hdc, SP_PANE, 0, part->text, -1, DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX, 0, &r);
214 }
215#else
217#endif
218 }
219}
220
221
222static void
223STATUSBAR_RefreshPart (const STATUS_INFO *infoPtr, HDC hdc, const STATUSWINDOWPART *part, int itemID)
224{
225 HBRUSH hbrBk;
226 HTHEME theme;
227
228 TRACE("item %d\n", itemID);
229
230 if (part->bound.right < part->bound.left) return;
231
232 if (!RectVisible(hdc, &part->bound))
233 return;
234
235 if ((theme = GetWindowTheme (infoPtr->Self)))
236 {
237 RECT cr;
238 GetClientRect (infoPtr->Self, &cr);
239 DrawThemeBackground(theme, hdc, 0, 0, &cr, &part->bound);
240 }
241 else
242 {
243 if (infoPtr->clrBk != CLR_DEFAULT)
244 hbrBk = CreateSolidBrush (infoPtr->clrBk);
245 else
247 FillRect(hdc, &part->bound, hbrBk);
248 if (infoPtr->clrBk != CLR_DEFAULT)
249 DeleteObject (hbrBk);
250 }
251
252 STATUSBAR_DrawPart (infoPtr, hdc, part, itemID);
253}
254
255
256static LRESULT
258{
259 RECT rect;
260 HBRUSH hbrBk;
261 HFONT hOldFont;
262 HTHEME theme;
263
264 TRACE("\n");
265 if (!IsWindowVisible(infoPtr->Self))
266 return 0;
267
269
270 GetClientRect (infoPtr->Self, &rect);
271
272 if ((theme = GetWindowTheme (infoPtr->Self)))
273 {
274 DrawThemeBackground(theme, hdc, 0, 0, &rect, NULL);
275 }
276 else
277 {
278 if (infoPtr->clrBk != CLR_DEFAULT)
279 hbrBk = CreateSolidBrush (infoPtr->clrBk);
280 else
282 FillRect(hdc, &rect, hbrBk);
283 if (infoPtr->clrBk != CLR_DEFAULT)
284 DeleteObject (hbrBk);
285 }
286
287 hOldFont = SelectObject (hdc, infoPtr->hFont ? infoPtr->hFont : infoPtr->hDefaultFont);
288
289 if (infoPtr->simple) {
290 STATUSBAR_RefreshPart (infoPtr, hdc, &infoPtr->part0, 0);
291 } else {
292 unsigned int i;
293
294 for (i = 0; i < infoPtr->numParts; i++) {
295 STATUSBAR_RefreshPart (infoPtr, hdc, &infoPtr->parts[i], i);
296 }
297 }
298
299 SelectObject (hdc, hOldFont);
300
301 if ((GetWindowLongW (infoPtr->Self, GWL_STYLE) & SBARS_SIZEGRIP)
302 && !(GetWindowLongW (infoPtr->Notify, GWL_STYLE) & WS_MAXIMIZE))
304
305 return 0;
306}
307
308
309static int
311{
312 unsigned int i;
313
314 if (infoPtr->simple)
315 return 255;
316
317 for (i = 0; i < infoPtr->numParts; i++)
318 if (pt->x >= infoPtr->parts[i].bound.left && pt->x <= infoPtr->parts[i].bound.right)
319 return i;
320 return -2;
321}
322
323
324static void
326{
327 STATUSWINDOWPART *part;
328 RECT rect, *r;
329 UINT i;
330
331 /* get our window size */
332 GetClientRect (infoPtr->Self, &rect);
333 TRACE("client wnd size is %s\n", wine_dbgstr_rect(&rect));
334
335 rect.left += infoPtr->horizontalBorder;
336 rect.top += infoPtr->verticalBorder;
337
338 /* set bounds for simple rectangle */
339 infoPtr->part0.bound = rect;
340
341 /* set bounds for non-simple rectangles */
342 for (i = 0; i < infoPtr->numParts; i++) {
343 part = &infoPtr->parts[i];
344 r = &infoPtr->parts[i].bound;
345 r->top = rect.top;
346 r->bottom = rect.bottom;
347 if (i == 0)
348 r->left = 0;
349 else
350 r->left = infoPtr->parts[i-1].bound.right + infoPtr->horizontalGap;
351 if (part->x == -1)
352 r->right = rect.right;
353 else
354 r->right = part->x;
355
356 if (infoPtr->hwndToolTip) {
357 TTTOOLINFOW ti;
358
359 ti.cbSize = sizeof(TTTOOLINFOW);
360 ti.hwnd = infoPtr->Self;
361 ti.uId = i;
362 ti.rect = *r;
364 0, (LPARAM)&ti);
365 }
366 }
367}
368
369
370static LRESULT
373{
374 MSG msg;
375
376 msg.hwnd = infoPtr->Self;
377 msg.message = uMsg;
378 msg.wParam = wParam;
379 msg.lParam = lParam;
380 msg.time = GetMessageTime ();
381 msg.pt.x = (short)LOWORD(GetMessagePos ());
382 msg.pt.y = (short)HIWORD(GetMessagePos ());
383
384 return SendMessageW (infoPtr->hwndToolTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
385}
386
387
388static BOOL
390{
391 TRACE("\n");
392 out[0] = infoPtr->horizontalBorder;
393 out[1] = infoPtr->verticalBorder;
394 out[2] = infoPtr->horizontalGap;
395
396 return TRUE;
397}
398
399
400static BOOL
402{
403 TRACE("\n");
404 infoPtr->horizontalBorder = in[0];
405 infoPtr->verticalBorder = in[1];
406 infoPtr->horizontalGap = in[2];
407 InvalidateRect(infoPtr->Self, NULL, FALSE);
408
409 return TRUE;
410}
411
412
413static HICON
414STATUSBAR_GetIcon (const STATUS_INFO *infoPtr, INT nPart)
415{
416 TRACE("%d\n", nPart);
417 /* MSDN says: "simple parts are indexed with -1" */
418 if ((nPart < -1) || (nPart >= infoPtr->numParts))
419 return 0;
420
421 if (nPart == -1)
422 return (infoPtr->part0.hIcon);
423 else
424 return (infoPtr->parts[nPart].hIcon);
425}
426
427
428static INT
429STATUSBAR_GetParts (const STATUS_INFO *infoPtr, INT num_parts, INT parts[])
430{
431 INT i;
432
433 TRACE("(%d)\n", num_parts);
434 if (parts) {
435#ifdef __REACTOS__
436 if (num_parts > infoPtr->numParts)
437 num_parts = infoPtr->numParts;
438#endif
439 for (i = 0; i < num_parts; i++) {
440 parts[i] = infoPtr->parts[i].x;
441 }
442 }
443 return infoPtr->numParts;
444}
445
446
447static BOOL
449{
450 TRACE("part %d\n", nPart);
451 if(nPart >= infoPtr->numParts || nPart < 0)
452 return FALSE;
453 if (infoPtr->simple)
454 *rect = infoPtr->part0.bound;
455 else
456 *rect = infoPtr->parts[nPart].bound;
457 return TRUE;
458}
459
460
461static LRESULT
463{
464 STATUSWINDOWPART *part;
466
467 TRACE("part %d\n", nPart);
468
469 /* MSDN says: "simple parts use index of 0", so this check is ok. */
470 if (nPart < 0 || nPart >= infoPtr->numParts) return 0;
471
472 if (infoPtr->simple)
473 part = &infoPtr->part0;
474 else
475 part = &infoPtr->parts[nPart];
476
477 if (part->style & SBT_OWNERDRAW)
478 result = (LRESULT)part->text;
479 else {
480 DWORD len = part->text ? WideCharToMultiByte( CP_ACP, 0, part->text, -1,
481 NULL, 0, NULL, NULL ) - 1 : 0;
482 result = MAKELONG( len, part->style );
483 if (part->text && buf)
484 WideCharToMultiByte( CP_ACP, 0, part->text, -1, buf, len+1, NULL, NULL );
485 }
486 return result;
487}
488
489
490static LRESULT
492{
493 STATUSWINDOWPART *part;
495
496 TRACE("part %d\n", nPart);
497 if (nPart < 0 || nPart >= infoPtr->numParts) return 0;
498
499 if (infoPtr->simple)
500 part = &infoPtr->part0;
501 else
502 part = &infoPtr->parts[nPart];
503
504 if (part->style & SBT_OWNERDRAW)
505 result = (LRESULT)part->text;
506 else {
507 result = part->text ? strlenW (part->text) : 0;
508 result |= (part->style << 16);
509 if (part->text && buf)
510 strcpyW (buf, part->text);
511 }
512 return result;
513}
514
515
516static LRESULT
518{
519 STATUSWINDOWPART *part;
521
522 TRACE("part %d\n", nPart);
523
524 /* MSDN says: "simple parts use index of 0", so this check is ok. */
525 if (nPart < 0 || nPart >= infoPtr->numParts) return 0;
526
527 if (infoPtr->simple)
528 part = &infoPtr->part0;
529 else
530 part = &infoPtr->parts[nPart];
531
532 if ((~part->style & SBT_OWNERDRAW) && part->text)
533 result = strlenW(part->text);
534 else
535 result = 0;
536
537 result |= (part->style << 16);
538 return result;
539}
540
541static LRESULT
543{
544 TRACE("\n");
545 if (tip) {
547 buf[0]='\0';
548
549 if (infoPtr->hwndToolTip) {
550 TTTOOLINFOA ti;
551 ti.cbSize = sizeof(TTTOOLINFOA);
552 ti.hwnd = infoPtr->Self;
553 ti.uId = id;
554 ti.lpszText = buf;
555 SendMessageA (infoPtr->hwndToolTip, TTM_GETTEXTA, 0, (LPARAM)&ti);
556 }
557 lstrcpynA (tip, buf, size);
558 }
559 return 0;
560}
561
562
563static LRESULT
565{
566 TRACE("\n");
567 if (tip) {
569 buf[0]=0;
570
571 if (infoPtr->hwndToolTip) {
572 TTTOOLINFOW ti;
573 ti.cbSize = sizeof(TTTOOLINFOW);
574 ti.hwnd = infoPtr->Self;
575 ti.uId = id;
576 ti.lpszText = buf;
577 SendMessageW(infoPtr->hwndToolTip, TTM_GETTEXTW, 0, (LPARAM)&ti);
578 }
579 lstrcpynW(tip, buf, size);
580 }
581
582 return 0;
583}
584
585
586static COLORREF
588{
589 COLORREF oldBkColor;
590
591 oldBkColor = infoPtr->clrBk;
592 infoPtr->clrBk = color;
593 InvalidateRect(infoPtr->Self, NULL, FALSE);
594
595 TRACE("CREF: %08x -> %08x\n", oldBkColor, infoPtr->clrBk);
596 return oldBkColor;
597}
598
599
600static BOOL
602{
603 if ((nPart < -1) || (nPart >= infoPtr->numParts))
604 return FALSE;
605
606 TRACE("setting part %d\n", nPart);
607
608 /* FIXME: MSDN says "if nPart is -1, the status bar is assumed simple" */
609 if (nPart == -1) {
610 if (infoPtr->part0.hIcon == hIcon) /* same as - no redraw */
611 return TRUE;
612 infoPtr->part0.hIcon = hIcon;
613 if (infoPtr->simple)
614 InvalidateRect(infoPtr->Self, &infoPtr->part0.bound, FALSE);
615 } else {
616 if (infoPtr->parts[nPart].hIcon == hIcon) /* same as - no redraw */
617 return TRUE;
618
619 infoPtr->parts[nPart].hIcon = hIcon;
620 if (!(infoPtr->simple))
621 InvalidateRect(infoPtr->Self, &infoPtr->parts[nPart].bound, FALSE);
622 }
623 return TRUE;
624}
625
626
627static BOOL
629{
631 if (ysize & 1) ysize--;
632 infoPtr->minHeight = max(height, ysize);
633 infoPtr->height = STATUSBAR_ComputeHeight(infoPtr);
634 /* like native, don't resize the control */
635 return TRUE;
636}
637
638
639static BOOL
641{
642 STATUSWINDOWPART *tmp;
643 INT i, oldNumParts;
644
645 TRACE("(%d,%p)\n", count, parts);
646
647 if(!count) return FALSE;
648
649 oldNumParts = infoPtr->numParts;
650 infoPtr->numParts = count;
651 if (oldNumParts > infoPtr->numParts) {
652 for (i = infoPtr->numParts ; i < oldNumParts; i++) {
653 if (!(infoPtr->parts[i].style & SBT_OWNERDRAW))
654 Free (infoPtr->parts[i].text);
655 }
656 } else if (oldNumParts < infoPtr->numParts) {
657 tmp = Alloc (sizeof(STATUSWINDOWPART) * infoPtr->numParts);
658 if (!tmp) return FALSE;
659 for (i = 0; i < oldNumParts; i++) {
660 tmp[i] = infoPtr->parts[i];
661 }
662 Free (infoPtr->parts);
663 infoPtr->parts = tmp;
664 }
665 if (oldNumParts == infoPtr->numParts) {
666 for (i=0; i < oldNumParts; i++)
667 if (infoPtr->parts[i].x != parts[i])
668 break;
669 if (i==oldNumParts) /* Unchanged? no need to redraw! */
670 return TRUE;
671 }
672
673 for (i = 0; i < infoPtr->numParts; i++)
674 infoPtr->parts[i].x = parts[i];
675
676 if (infoPtr->hwndToolTip) {
677 INT nTipCount;
678 TTTOOLINFOW ti;
679 WCHAR wEmpty = 0;
680
681 ZeroMemory (&ti, sizeof(TTTOOLINFOW));
682 ti.cbSize = sizeof(TTTOOLINFOW);
683 ti.hwnd = infoPtr->Self;
684 ti.lpszText = &wEmpty;
685
686 nTipCount = SendMessageW (infoPtr->hwndToolTip, TTM_GETTOOLCOUNT, 0, 0);
687 if (nTipCount < infoPtr->numParts) {
688 /* add tools */
689 for (i = nTipCount; i < infoPtr->numParts; i++) {
690 TRACE("add tool %d\n", i);
691 ti.uId = i;
693 0, (LPARAM)&ti);
694 }
695 }
696 else if (nTipCount > infoPtr->numParts) {
697 /* delete tools */
698 for (i = nTipCount - 1; i >= infoPtr->numParts; i--) {
699 TRACE("delete tool %d\n", i);
700 ti.uId = i;
702 0, (LPARAM)&ti);
703 }
704 }
705 }
706 STATUSBAR_SetPartBounds (infoPtr);
707 InvalidateRect(infoPtr->Self, NULL, FALSE);
708 return TRUE;
709}
710
711
712static BOOL
715{
717 BOOL changed = FALSE;
718 INT oldStyle;
719
720 if (style & SBT_OWNERDRAW) {
721 TRACE("part %d, text %p\n",nPart,text);
722 }
723 else TRACE("part %d, text %s\n", nPart, debugstr_t(text, isW));
724
725 /* MSDN says: "If the parameter is set to SB_SIMPLEID (255), the status
726 * window is assumed to be a simple window */
727
728 if (nPart == 0x00ff) {
729 part = &infoPtr->part0;
730 } else {
731 if (infoPtr->parts && nPart >= 0 && nPart < infoPtr->numParts) {
732 part = &infoPtr->parts[nPart];
733 }
734 }
735 if (!part) return FALSE;
736
737 if (part->style != style)
738 changed = TRUE;
739
740 oldStyle = part->style;
741 part->style = style;
742 if (style & SBT_OWNERDRAW) {
743 if (!(oldStyle & SBT_OWNERDRAW))
744 Free (part->text);
745 part->text = text;
746 } else {
747 LPWSTR ntext;
748 WCHAR *idx;
749
750 if (text && !isW) {
751 LPCSTR atxt = (LPCSTR)text;
752 DWORD len = MultiByteToWideChar( CP_ACP, 0, atxt, -1, NULL, 0 );
753 ntext = Alloc( (len + 1)*sizeof(WCHAR) );
754 if (!ntext) return FALSE;
755 MultiByteToWideChar( CP_ACP, 0, atxt, -1, ntext, len );
756 } else if (text) {
757 ntext = Alloc( (strlenW(text) + 1)*sizeof(WCHAR) );
758 if (!ntext) return FALSE;
759 strcpyW (ntext, text);
760 } else ntext = 0;
761
762 /* replace nonprintable characters with spaces */
763 if (ntext) {
764 idx = ntext;
765 while (*idx) {
766 if(!isprintW(*idx))
767 *idx = ' ';
768 idx++;
769 }
770 }
771
772 /* check if text is unchanged -> no need to redraw */
773 if (text) {
774 if (!changed && part->text && !lstrcmpW(ntext, part->text)) {
775 Free(ntext);
776 return TRUE;
777 }
778 } else {
779 if (!changed && !part->text)
780 return TRUE;
781 }
782
783 if (!(oldStyle & SBT_OWNERDRAW))
784 Free (part->text);
785 part->text = ntext;
786 }
787 InvalidateRect(infoPtr->Self, &part->bound, FALSE);
788 UpdateWindow(infoPtr->Self);
789
790 return TRUE;
791}
792
793
794static LRESULT
796{
797 TRACE("part %d: \"%s\"\n", id, text);
798 if (infoPtr->hwndToolTip) {
799 TTTOOLINFOA ti;
800 ti.cbSize = sizeof(TTTOOLINFOA);
801 ti.hwnd = infoPtr->Self;
802 ti.uId = id;
803 ti.hinst = 0;
804 ti.lpszText = text;
806 }
807
808 return 0;
809}
810
811
812static LRESULT
814{
815 TRACE("part %d: \"%s\"\n", id, debugstr_w(text));
816 if (infoPtr->hwndToolTip) {
817 TTTOOLINFOW ti;
818 ti.cbSize = sizeof(TTTOOLINFOW);
819 ti.hwnd = infoPtr->Self;
820 ti.uId = id;
821 ti.hinst = 0;
822 ti.lpszText = text;
824 }
825
826 return 0;
827}
828
829
830static inline LRESULT
832{
833 BOOL bOld = infoPtr->bUnicode;
834
835 TRACE("(0x%x)\n", bUnicode);
836 infoPtr->bUnicode = bUnicode;
837
838 return bOld;
839}
840
841
842static BOOL
844{
845 NMHDR nmhdr;
846
847 TRACE("(simple=%d)\n", simple);
848 if (infoPtr->simple == simple) /* no need to change */
849 return TRUE;
850
851 infoPtr->simple = simple;
852
853 /* send notification */
854 nmhdr.hwndFrom = infoPtr->Self;
855 nmhdr.idFrom = GetWindowLongPtrW (infoPtr->Self, GWLP_ID);
857 SendMessageW (infoPtr->Notify, WM_NOTIFY, 0, (LPARAM)&nmhdr);
858 InvalidateRect(infoPtr->Self, NULL, FALSE);
859 return TRUE;
860}
861
862
863static LRESULT
865{
866 unsigned int i;
867
868 TRACE("\n");
869 for (i = 0; i < infoPtr->numParts; i++) {
870 if (!(infoPtr->parts[i].style & SBT_OWNERDRAW))
871 Free (infoPtr->parts[i].text);
872 }
873 if (!(infoPtr->part0.style & SBT_OWNERDRAW))
874 Free (infoPtr->part0.text);
875 Free (infoPtr->parts);
876
877 /* delete default font */
878 if (infoPtr->hDefaultFont)
879 DeleteObject (infoPtr->hDefaultFont);
880
881 /* delete tool tip control */
882 if (infoPtr->hwndToolTip)
883 DestroyWindow (infoPtr->hwndToolTip);
884
886
887 SetWindowLongPtrW(infoPtr->Self, 0, 0);
888 Free (infoPtr);
889 return 0;
890}
891
892
893static LRESULT
895{
896 STATUS_INFO *infoPtr;
897 NONCLIENTMETRICSW nclm;
898 DWORD dwStyle;
899 RECT rect;
900 int len;
901
902 TRACE("\n");
903 infoPtr = Alloc (sizeof(STATUS_INFO));
904 if (!infoPtr) goto create_fail;
905 SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
906
907 infoPtr->Self = hwnd;
908 infoPtr->Notify = lpCreate->hwndParent;
909 infoPtr->numParts = 1;
910 infoPtr->parts = 0;
911 infoPtr->simple = FALSE;
912 infoPtr->clrBk = CLR_DEFAULT;
913 infoPtr->hFont = 0;
914 infoPtr->horizontalBorder = HORZ_BORDER;
915 infoPtr->verticalBorder = VERT_BORDER;
916 infoPtr->horizontalGap = HORZ_GAP;
918 if (infoPtr->minHeight & 1) infoPtr->minHeight--;
919
920 STATUSBAR_NotifyFormat(infoPtr, infoPtr->Notify, NF_REQUERY);
921
922 ZeroMemory (&nclm, sizeof(nclm));
923 nclm.cbSize = sizeof(nclm);
924 SystemParametersInfoW (SPI_GETNONCLIENTMETRICS, nclm.cbSize, &nclm, 0);
925 infoPtr->hDefaultFont = CreateFontIndirectW (&nclm.lfStatusFont);
926
928
929 /* initialize simple case */
930 infoPtr->part0.bound = rect;
931 infoPtr->part0.text = 0;
932 infoPtr->part0.x = 0;
933 infoPtr->part0.style = 0;
934 infoPtr->part0.hIcon = 0;
935
936 /* initialize first part */
937 infoPtr->parts = Alloc (sizeof(STATUSWINDOWPART));
938 if (!infoPtr->parts) goto create_fail;
939 infoPtr->parts[0].bound = rect;
940 infoPtr->parts[0].text = 0;
941 infoPtr->parts[0].x = -1;
942 infoPtr->parts[0].style = 0;
943 infoPtr->parts[0].hIcon = 0;
944
946
947 if (lpCreate->lpszName && (len = strlenW ((LPCWSTR)lpCreate->lpszName)))
948 {
949 infoPtr->parts[0].text = Alloc ((len + 1)*sizeof(WCHAR));
950 if (!infoPtr->parts[0].text) goto create_fail;
951 strcpyW (infoPtr->parts[0].text, (LPCWSTR)lpCreate->lpszName);
952 }
953
954 dwStyle = GetWindowLongW (hwnd, GWL_STYLE);
955 /* native seems to clear WS_BORDER, too */
956 dwStyle &= ~WS_BORDER;
957 SetWindowLongW (hwnd, GWL_STYLE, dwStyle);
958
959 infoPtr->height = STATUSBAR_ComputeHeight(infoPtr);
960
961 if (dwStyle & SBT_TOOLTIPS) {
962 infoPtr->hwndToolTip =
967
968 if (infoPtr->hwndToolTip) {
969 NMTOOLTIPSCREATED nmttc;
970
971 nmttc.hdr.hwndFrom = hwnd;
974 nmttc.hwndToolTips = infoPtr->hwndToolTip;
975
976 SendMessageW (lpCreate->hwndParent, WM_NOTIFY, nmttc.hdr.idFrom, (LPARAM)&nmttc);
977 }
978 }
979
980 return 0;
981
982create_fail:
983 TRACE(" failed!\n");
984 if (infoPtr) STATUSBAR_WMDestroy(infoPtr);
985 return -1;
986}
987
988
989/* in contrast to SB_GETTEXT*, WM_GETTEXT handles the text
990 * of the first part only (usual behaviour) */
991static INT
993{
994 INT len;
995
996 TRACE("\n");
997 if (!(infoPtr->parts[0].text))
998 return 0;
999
1000 len = strlenW (infoPtr->parts[0].text);
1001
1002 if (!size)
1003 return len;
1004 else if (size > len) {
1005 strcpyW (buf, infoPtr->parts[0].text);
1006 return len;
1007 }
1008 else {
1009 memcpy (buf, infoPtr->parts[0].text, (size - 1) * sizeof(WCHAR));
1010 buf[size - 1] = 0;
1011 return size - 1;
1012 }
1013}
1014
1015
1016static BOOL
1018{
1019 if ((GetWindowLongW (infoPtr->Self, GWL_STYLE) & SBARS_SIZEGRIP)
1020 && !(GetWindowLongW (infoPtr->Notify, GWL_STYLE) & WS_MAXIMIZE)) {
1021 RECT rect;
1022 POINT pt;
1023
1024 GetClientRect (infoPtr->Self, &rect);
1025
1026 pt.x = x;
1027 pt.y = y;
1028 ScreenToClient (infoPtr->Self, &pt);
1029
1030 if (pt.x >= rect.right - GetSystemMetrics(SM_CXVSCROLL))
1031 {
1032 if (GetWindowLongW( infoPtr->Self, GWL_EXSTYLE ) & WS_EX_LAYOUTRTL) return HTBOTTOMLEFT;
1033 else return HTBOTTOMRIGHT;
1034 }
1035 }
1036
1037 return HTERROR;
1038}
1039
1040
1041static LRESULT
1043{
1044 PAINTSTRUCT ps;
1045
1046 TRACE("\n");
1047 if (hdc) return STATUSBAR_Refresh (infoPtr, hdc);
1048 hdc = BeginPaint (infoPtr->Self, &ps);
1049 STATUSBAR_Refresh (infoPtr, hdc);
1050 EndPaint (infoPtr->Self, &ps);
1051
1052 return 0;
1053}
1054
1055
1056static LRESULT
1058{
1059 infoPtr->hFont = font;
1060 TRACE("%p\n", infoPtr->hFont);
1061
1062 infoPtr->height = STATUSBAR_ComputeHeight(infoPtr);
1063 SendMessageW(infoPtr->Self, WM_SIZE, 0, 0); /* update size */
1064 if (redraw)
1065 InvalidateRect(infoPtr->Self, NULL, FALSE);
1066
1067 return 0;
1068}
1069
1070
1071static BOOL
1073{
1074 STATUSWINDOWPART *part;
1075 int len;
1076
1077 TRACE("\n");
1078 if (infoPtr->numParts == 0)
1079 return FALSE;
1080
1081 part = &infoPtr->parts[0];
1082 /* duplicate string */
1083 Free (part->text);
1084 part->text = 0;
1085
1086 if (text && (len = strlenW((LPCWSTR)text))) {
1087 part->text = Alloc ((len+1)*sizeof(WCHAR));
1088 if (!part->text) return FALSE;
1089 strcpyW (part->text, (LPCWSTR)text);
1090 }
1091
1092 InvalidateRect(infoPtr->Self, &part->bound, FALSE);
1093
1094 return TRUE;
1095}
1096
1097
1098static BOOL
1100{
1101 INT width, x, y;
1102 RECT parent_rect;
1103
1104 /* Need to resize width to match parent */
1105 TRACE("flags %04x\n", flags);
1106
1107 if (flags != SIZE_RESTORED && flags != SIZE_MAXIMIZED) {
1108 WARN("flags MUST be SIZE_RESTORED or SIZE_MAXIMIZED\n");
1109 return FALSE;
1110 }
1111
1112 if (GetWindowLongW(infoPtr->Self, GWL_STYLE) & CCS_NORESIZE) return FALSE;
1113
1114 /* width and height don't apply */
1115 if (!GetClientRect (infoPtr->Notify, &parent_rect))
1116 return FALSE;
1117
1118 width = parent_rect.right - parent_rect.left;
1119 x = parent_rect.left;
1120 y = parent_rect.bottom - infoPtr->height;
1121 MoveWindow (infoPtr->Self, x, y, width, infoPtr->height, TRUE);
1122 STATUSBAR_SetPartBounds (infoPtr);
1123#ifdef __REACTOS__
1124 parent_rect = infoPtr->parts[infoPtr->numParts - 1].bound;
1125 InvalidateRect(infoPtr->Self, &parent_rect, TRUE);
1126#endif
1127 return TRUE;
1128}
1129
1130
1131/* update theme after a WM_THEMECHANGED message */
1132static LRESULT theme_changed (const STATUS_INFO* infoPtr)
1133{
1134 HTHEME theme = GetWindowTheme (infoPtr->Self);
1135 CloseThemeData (theme);
1136 OpenThemeData (infoPtr->Self, themeClass);
1137 return 0;
1138}
1139
1140
1141static LRESULT
1143{
1144 if (cmd == NF_REQUERY) {
1145 INT i = SendMessageW(from, WM_NOTIFYFORMAT, (WPARAM)infoPtr->Self, NF_QUERY);
1146 infoPtr->bUnicode = (i == NFR_UNICODE);
1147 }
1148 return infoPtr->bUnicode ? NFR_UNICODE : NFR_ANSI;
1149}
1150
1151
1152static LRESULT
1154{
1155 NMMOUSE nm;
1156
1157 TRACE("code %04x, lParam=%lx\n", code, lParam);
1158 nm.hdr.hwndFrom = infoPtr->Self;
1159 nm.hdr.idFrom = GetWindowLongPtrW(infoPtr->Self, GWLP_ID);
1160 nm.hdr.code = code;
1161 nm.pt.x = (short)LOWORD(lParam);
1162 nm.pt.y = (short)HIWORD(lParam);
1163 nm.dwItemSpec = STATUSBAR_InternalHitTest(infoPtr, &nm.pt);
1164 nm.dwItemData = 0;
1165 nm.dwHitInfo = 0x30000; /* seems constant */
1166
1167 /* Do default processing if WM_NOTIFY returns zero */
1168 if(!SendMessageW(infoPtr->Notify, WM_NOTIFY, nm.hdr.idFrom, (LPARAM)&nm))
1169 {
1170 return DefWindowProcW(infoPtr->Self, msg, wParam, lParam);
1171 }
1172 return 0;
1173}
1174
1175
1176
1177static LRESULT WINAPI
1179{
1180 STATUS_INFO *infoPtr = (STATUS_INFO *)GetWindowLongPtrW (hwnd, 0);
1181 INT nPart = ((INT) wParam) & 0x00ff;
1182 LRESULT res;
1183
1184 TRACE("hwnd=%p msg=%x wparam=%lx lparam=%lx\n", hwnd, msg, wParam, lParam);
1185 if (!infoPtr && msg != WM_CREATE)
1186 return DefWindowProcW (hwnd, msg, wParam, lParam);
1187
1188 switch (msg) {
1189 case SB_GETBORDERS:
1190 return STATUSBAR_GetBorders (infoPtr, (INT *)lParam);
1191
1192 case SB_GETICON:
1193 return (LRESULT)STATUSBAR_GetIcon (infoPtr, nPart);
1194
1195 case SB_GETPARTS:
1196 return STATUSBAR_GetParts (infoPtr, (INT)wParam, (INT *)lParam);
1197
1198 case SB_GETRECT:
1199 return STATUSBAR_GetRect (infoPtr, nPart, (LPRECT)lParam);
1200
1201 case SB_GETTEXTA:
1202 return STATUSBAR_GetTextA (infoPtr, nPart, (LPSTR)lParam);
1203
1204 case SB_GETTEXTW:
1205 return STATUSBAR_GetTextW (infoPtr, nPart, (LPWSTR)lParam);
1206
1207 case SB_GETTEXTLENGTHA:
1208 case SB_GETTEXTLENGTHW:
1209 return STATUSBAR_GetTextLength (infoPtr, nPart);
1210
1211 case SB_GETTIPTEXTA:
1213
1214 case SB_GETTIPTEXTW:
1216
1218 return infoPtr->bUnicode;
1219
1220 case SB_ISSIMPLE:
1221 return infoPtr->simple;
1222
1223 case SB_SETBORDERS:
1224 return STATUSBAR_SetBorders (infoPtr, (INT *)lParam);
1225
1226 case SB_SETBKCOLOR:
1227 return STATUSBAR_SetBkColor (infoPtr, (COLORREF)lParam);
1228
1229 case SB_SETICON:
1230 return STATUSBAR_SetIcon (infoPtr, nPart, (HICON)lParam);
1231
1232 case SB_SETMINHEIGHT:
1233 return STATUSBAR_SetMinHeight (infoPtr, (INT)wParam);
1234
1235 case SB_SETPARTS:
1236 return STATUSBAR_SetParts (infoPtr, (INT)wParam, (LPINT)lParam);
1237
1238 case SB_SETTEXTA:
1239 return STATUSBAR_SetTextT (infoPtr, nPart, wParam & 0xff00, (LPWSTR)lParam, FALSE);
1240
1241 case SB_SETTEXTW:
1242 return STATUSBAR_SetTextT (infoPtr, nPart, wParam & 0xff00, (LPWSTR)lParam, TRUE);
1243
1244 case SB_SETTIPTEXTA:
1245 return STATUSBAR_SetTipTextA (infoPtr, (INT)wParam, (LPSTR)lParam);
1246
1247 case SB_SETTIPTEXTW:
1248 return STATUSBAR_SetTipTextW (infoPtr, (INT)wParam, (LPWSTR)lParam);
1249
1251 return STATUSBAR_SetUnicodeFormat (infoPtr, (BOOL)wParam);
1252
1253 case SB_SIMPLE:
1254 return STATUSBAR_Simple (infoPtr, (BOOL)wParam);
1255
1256 case WM_CREATE:
1258
1259 case WM_DESTROY:
1260 return STATUSBAR_WMDestroy (infoPtr);
1261
1262 case WM_GETFONT:
1263 return (LRESULT)(infoPtr->hFont? infoPtr->hFont : infoPtr->hDefaultFont);
1264
1265 case WM_GETTEXT:
1266 return STATUSBAR_WMGetText (infoPtr, (INT)wParam, (LPWSTR)lParam);
1267
1268 case WM_GETTEXTLENGTH:
1269 return LOWORD(STATUSBAR_GetTextLength (infoPtr, 0));
1270
1271 case WM_LBUTTONDBLCLK:
1273
1274 case WM_LBUTTONUP:
1276
1277 case WM_MOUSEMOVE:
1278 return STATUSBAR_Relay2Tip (infoPtr, msg, wParam, lParam);
1279
1280 case WM_NCHITTEST:
1281 res = STATUSBAR_WMNCHitTest(infoPtr, (short)LOWORD(lParam),
1282 (short)HIWORD(lParam));
1283 if (res != HTERROR) return res;
1284 return DefWindowProcW (hwnd, msg, wParam, lParam);
1285
1286 case WM_NCLBUTTONUP:
1287 case WM_NCLBUTTONDOWN:
1288 PostMessageW (infoPtr->Notify, msg, wParam, lParam);
1289 return 0;
1290
1291 case WM_NOTIFYFORMAT:
1292 return STATUSBAR_NotifyFormat(infoPtr, (HWND)wParam, (INT)lParam);
1293
1294 case WM_PRINTCLIENT:
1295 case WM_PAINT:
1296 return STATUSBAR_WMPaint (infoPtr, (HDC)wParam);
1297
1298 case WM_RBUTTONDBLCLK:
1300
1301 case WM_RBUTTONUP:
1303
1304 case WM_SETFONT:
1305 return STATUSBAR_WMSetFont (infoPtr, (HFONT)wParam, LOWORD(lParam));
1306
1307 case WM_SETTEXT:
1308 return STATUSBAR_WMSetText (infoPtr, (LPCSTR)lParam);
1309
1310 case WM_SIZE:
1311 if (STATUSBAR_WMSize (infoPtr, (WORD)wParam)) return 0;
1312 return DefWindowProcW (hwnd, msg, wParam, lParam);
1313
1314 case WM_SYSCOLORCHANGE:
1316 return 0;
1317
1318 case WM_THEMECHANGED:
1319 return theme_changed (infoPtr);
1320
1321 default:
1322 if ((msg >= WM_USER) && (msg < WM_APP) && !COMCTL32_IsReflectedMessage(msg))
1323 ERR("unknown msg %04x wp=%04lx lp=%08lx\n",
1324 msg, wParam, lParam);
1325 return DefWindowProcW (hwnd, msg, wParam, lParam);
1326 }
1327}
1328
1329
1330/***********************************************************************
1331 * STATUS_Register [Internal]
1332 *
1333 * Registers the status window class.
1334 */
1335
1336void
1338{
1339 WNDCLASSW wndClass;
1340
1341 ZeroMemory (&wndClass, sizeof(WNDCLASSW));
1343 wndClass.lpfnWndProc = StatusWindowProc;
1344 wndClass.cbClsExtra = 0;
1345 wndClass.cbWndExtra = sizeof(STATUS_INFO *);
1346 wndClass.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW);
1347 wndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
1349
1350 RegisterClassW (&wndClass);
1351}
1352
1353
1354/***********************************************************************
1355 * STATUS_Unregister [Internal]
1356 *
1357 * Unregisters the status window class.
1358 */
1359
1360void
1362{
1364}
Arabic default style
Definition: afstyles.h:94
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
PVOID Alloc(IN DWORD dwFlags, IN SIZE_T dwBytes)
Definition: main.c:63
#define WARN(fmt,...)
Definition: debug.h:112
#define ERR(fmt,...)
Definition: debug.h:110
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
BOOL COMCTL32_IsReflectedMessage(UINT uMsg) DECLSPEC_HIDDEN
Definition: commctrl.c:1748
void COMCTL32_GetFontMetrics(HFONT hFont, TEXTMETRICW *ptm) DECLSPEC_HIDDEN
Definition: commctrl.c:1721
VOID COMCTL32_RefreshSysColors(void) DECLSPEC_HIDDEN
Definition: commctrl.c:1586
void WINAPI DrawStatusTextW(HDC hdc, LPCRECT lprc, LPCWSTR text, UINT style)
Definition: commctrl.c:677
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int idx
Definition: utils.c:41
static LRESULT STATUSBAR_SendMouseNotify(const STATUS_INFO *infoPtr, UINT code, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: status.c:1153
static LRESULT STATUSBAR_SetUnicodeFormat(STATUS_INFO *infoPtr, BOOL bUnicode)
Definition: status.c:831
#define HORZ_GAP
Definition: status.c:88
static LRESULT STATUSBAR_GetTipTextW(const STATUS_INFO *infoPtr, INT id, LPWSTR tip, INT size)
Definition: status.c:564
static BOOL STATUSBAR_SetMinHeight(STATUS_INFO *infoPtr, INT height)
Definition: status.c:628
static LRESULT theme_changed(const STATUS_INFO *infoPtr)
Definition: status.c:1132
static LRESULT STATUSBAR_WMPaint(STATUS_INFO *infoPtr, HDC hdc)
Definition: status.c:1042
static LRESULT STATUSBAR_WMCreate(HWND hwnd, const CREATESTRUCTA *lpCreate)
Definition: status.c:894
static INT STATUSBAR_GetParts(const STATUS_INFO *infoPtr, INT num_parts, INT parts[])
Definition: status.c:429
static UINT STATUSBAR_ComputeHeight(STATUS_INFO *infoPtr)
Definition: status.c:104
static COLORREF STATUSBAR_SetBkColor(STATUS_INFO *infoPtr, COLORREF color)
Definition: status.c:587
static LRESULT STATUSBAR_Refresh(STATUS_INFO *infoPtr, HDC hdc)
Definition: status.c:257
static BOOL STATUSBAR_WMSetText(const STATUS_INFO *infoPtr, LPCSTR text)
Definition: status.c:1072
#define HORZ_BORDER
Definition: status.c:86
static BOOL STATUSBAR_WMSize(STATUS_INFO *infoPtr, WORD flags)
Definition: status.c:1099
static LRESULT STATUSBAR_GetTextW(STATUS_INFO *infoPtr, INT nPart, LPWSTR buf)
Definition: status.c:491
static BOOL STATUSBAR_Simple(STATUS_INFO *infoPtr, BOOL simple)
Definition: status.c:843
static LRESULT STATUSBAR_Relay2Tip(const STATUS_INFO *infoPtr, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: status.c:371
static int STATUSBAR_InternalHitTest(const STATUS_INFO *infoPtr, const POINT *pt)
Definition: status.c:310
static void STATUSBAR_SetPartBounds(STATUS_INFO *infoPtr)
Definition: status.c:325
static INT STATUSBAR_WMGetText(const STATUS_INFO *infoPtr, INT size, LPWSTR buf)
Definition: status.c:992
static BOOL STATUSBAR_SetTextT(STATUS_INFO *infoPtr, INT nPart, WORD style, LPWSTR text, BOOL isW)
Definition: status.c:713
static LRESULT STATUSBAR_GetTipTextA(const STATUS_INFO *infoPtr, INT id, LPSTR tip, INT size)
Definition: status.c:542
static BOOL STATUSBAR_GetRect(const STATUS_INFO *infoPtr, INT nPart, LPRECT rect)
Definition: status.c:448
static BOOL STATUSBAR_SetParts(STATUS_INFO *infoPtr, INT count, LPINT parts)
Definition: status.c:640
static LRESULT STATUSBAR_SetTipTextW(const STATUS_INFO *infoPtr, INT id, LPWSTR text)
Definition: status.c:813
static void STATUSBAR_RefreshPart(const STATUS_INFO *infoPtr, HDC hdc, const STATUSWINDOWPART *part, int itemID)
Definition: status.c:223
static LRESULT STATUSBAR_SetTipTextA(const STATUS_INFO *infoPtr, INT id, LPSTR text)
Definition: status.c:795
static LRESULT STATUSBAR_WMDestroy(STATUS_INFO *infoPtr)
Definition: status.c:864
static const WCHAR themeClass[]
Definition: status.c:90
static void STATUSBAR_DrawSizeGrip(HTHEME theme, HDC hdc, LPRECT lpRect)
Definition: status.c:135
static HICON STATUSBAR_GetIcon(const STATUS_INFO *infoPtr, INT nPart)
Definition: status.c:414
static LRESULT STATUSBAR_GetTextLength(STATUS_INFO *infoPtr, INT nPart)
Definition: status.c:517
static BOOL STATUSBAR_GetBorders(const STATUS_INFO *infoPtr, INT out[])
Definition: status.c:389
static BOOL STATUSBAR_WMNCHitTest(const STATUS_INFO *infoPtr, INT x, INT y)
Definition: status.c:1017
void STATUS_Register(void)
Definition: status.c:1337
static void STATUSBAR_DrawPart(const STATUS_INFO *infoPtr, HDC hdc, const STATUSWINDOWPART *part, int itemID)
Definition: status.c:161
static LRESULT STATUSBAR_GetTextA(STATUS_INFO *infoPtr, INT nPart, LPSTR buf)
Definition: status.c:462
static LRESULT STATUSBAR_WMSetFont(STATUS_INFO *infoPtr, HFONT font, BOOL redraw)
Definition: status.c:1057
static BOOL STATUSBAR_SetIcon(STATUS_INFO *infoPtr, INT nPart, HICON hIcon)
Definition: status.c:601
#define VERT_BORDER
Definition: status.c:87
void STATUS_Unregister(void)
Definition: status.c:1361
static LRESULT WINAPI StatusWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: status.c:1178
static BOOL STATUSBAR_SetBorders(STATUS_INFO *infoPtr, const INT in[])
Definition: status.c:401
static LRESULT STATUSBAR_NotifyFormat(STATUS_INFO *infoPtr, HWND from, INT cmd)
Definition: status.c:1142
#define CP_ACP
Definition: compat.h:109
#define lstrcpynA
Definition: compat.h:751
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define lstrcpynW
Definition: compat.h:738
#define debugstr_t
Definition: utils.cpp:194
const WCHAR * text
Definition: package.c:1799
HRESULT WINAPI DrawThemeBackground(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect)
Definition: draw.c:128
HRESULT WINAPI GetThemePartSize(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, RECT *prc, THEMESIZE eSize, SIZE *psz)
Definition: draw.c:1777
HRESULT WINAPI GetThemeBackgroundExtent(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pContentRect, RECT *pExtentRect)
Definition: draw.c:1528
HRESULT WINAPI DrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, const RECT *pRect)
Definition: draw.c:1377
HTHEME WINAPI OpenThemeData(HWND hwnd, LPCWSTR classlist)
Definition: system.c:835
HTHEME WINAPI GetWindowTheme(HWND hwnd)
Definition: system.c:851
HRESULT WINAPI CloseThemeData(HTHEME hTheme)
Definition: system.c:950
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
#define pt(x, y)
Definition: drawing.c:79
#define ULONG_PTR
Definition: config.h:101
#define WM_APP
Definition: eventvwr.h:73
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
pKey DeleteObject()
GLint GLint GLsizei GLsizei GLsizei GLint border
Definition: gl.h:1546
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLint GLint GLsizei width
Definition: gl.h:1546
GLsizeiptr size
Definition: glext.h:5919
GLuint res
Definition: glext.h:9613
GLuint color
Definition: glext.h:6243
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint in
Definition: glext.h:9616
GLbitfield flags
Definition: glext.h:7161
GLenum GLsizei len
Definition: glext.h:6722
GLuint64EXT * result
Definition: glext.h:11304
GLuint id
Definition: glext.h:5910
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
if(dx< 0)
Definition: linetemp.h:194
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:92
static HICON
Definition: imagelist.c:84
static const D3D_BLOB_PART parts[]
Definition: blob.c:76
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
static HTHEME(WINAPI *pOpenThemeDataEx)(HWND
HICON hIcon
Definition: msconfig.c:44
Definition: mk_font.cpp:20
unsigned int UINT
Definition: ndis.h:50
#define LRESULT
Definition: ole.h:14
#define LOWORD(l)
Definition: pedump.c:82
#define WS_MAXIMIZE
Definition: pedump.c:623
#define WS_POPUP
Definition: pedump.c:616
#define INT
Definition: polytest.cpp:20
#define NM_RDBLCLK
Definition: commctrl.h:134
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define SB_SIMPLE
Definition: commctrl.h:1958
#define SB_GETTEXTA
Definition: commctrl.h:1943
#define SB_GETTEXTLENGTHA
Definition: commctrl.h:1945
#define SB_GETRECT
Definition: commctrl.h:1959
#define NM_DBLCLK
Definition: commctrl.h:131
#define SB_GETPARTS
Definition: commctrl.h:1955
#define SB_SETBKCOLOR
Definition: commctrl.h:1976
#define SBT_NOBORDERS
Definition: commctrl.h:1971
#define SBT_POPOUT
Definition: commctrl.h:1972
#define TTM_RELAYEVENT
Definition: commctrl.h:1792
#define SB_GETICON
Definition: commctrl.h:1966
#define TTM_DELTOOLW
Definition: commctrl.h:1789
struct tagTOOLINFOW TTTOOLINFOW
#define TTM_GETTEXTW
Definition: commctrl.h:1803
#define TOOLTIPS_CLASSW
Definition: commctrl.h:1707
#define STATUSCLASSNAMEW
Definition: commctrl.h:1936
#define SB_GETTIPTEXTA
Definition: commctrl.h:1964
#define NM_TOOLTIPSCREATED
Definition: commctrl.h:144
#define NM_CLICK
Definition: commctrl.h:130
#define SB_SETICON
Definition: commctrl.h:1961
#define SB_GETTEXTLENGTHW
Definition: commctrl.h:1946
#define SB_SETTEXTA
Definition: commctrl.h:1941
#define SB_SETUNICODEFORMAT
Definition: commctrl.h:1967
#define TTM_NEWTOOLRECTW
Definition: commctrl.h:1791
#define INFOTIPSIZE
Definition: commctrl.h:124
#define SB_GETTEXTW
Definition: commctrl.h:1944
#define TTM_GETTOOLCOUNT
Definition: commctrl.h:1806
#define TTM_ADDTOOLW
Definition: commctrl.h:1787
#define TTS_ALWAYSTIP
Definition: commctrl.h:1757
#define TTM_UPDATETIPTEXTA
Definition: commctrl.h:1804
#define SB_ISSIMPLE
Definition: commctrl.h:1960
#define SBT_TOOLTIPS
Definition: commctrl.h:1925
#define CLR_DEFAULT
Definition: commctrl.h:320
#define SB_GETTIPTEXTW
Definition: commctrl.h:1965
#define SB_SETTIPTEXTW
Definition: commctrl.h:1963
#define SB_SETMINHEIGHT
Definition: commctrl.h:1957
#define TTM_UPDATETIPTEXTW
Definition: commctrl.h:1805
#define SB_SETTIPTEXTA
Definition: commctrl.h:1962
#define NM_RCLICK
Definition: commctrl.h:133
#define SBN_SIMPLEMODECHANGE
Definition: commctrl.h:1978
#define SB_GETUNICODEFORMAT
Definition: commctrl.h:1968
#define SB_SETPARTS
Definition: commctrl.h:1954
#define CCS_NORESIZE
Definition: commctrl.h:2245
#define SB_SETTEXTW
Definition: commctrl.h:1942
#define SBARS_SIZEGRIP
Definition: commctrl.h:1923
#define TTM_GETTEXTA
Definition: commctrl.h:1802
#define SB_GETBORDERS
Definition: commctrl.h:1956
struct tagTOOLINFOA TTTOOLINFOA
#define SBT_OWNERDRAW
Definition: commctrl.h:1970
void redraw(int x, int y, int cx, int cy)
Definition: qtewin.cpp:1248
#define SB_SETBORDERS
Definition: commctrl.h:60
#define strlenW(s)
Definition: unicode.h:28
#define isprintW
Definition: unicode.h:62
#define strcpyW(d, s)
Definition: unicode.h:29
static FILE * out
Definition: regtests2xml.c:44
#define WM_PRINTCLIENT
Definition: richedit.h:70
#define WM_NOTIFY
Definition: richedit.h:61
#define TRACE(s)
Definition: solgame.cpp:4
CardRegion * from
Definition: spigame.cpp:19
& rect
Definition: startmenu.cpp:1413
LPWSTR text
Definition: status.c:56
HICON hIcon
Definition: status.c:57
INT verticalBorder
Definition: status.c:76
HFONT hFont
Definition: status.c:69
UINT height
Definition: status.c:65
BOOL simple
Definition: status.c:67
WORD numParts
Definition: status.c:64
UINT minHeight
Definition: status.c:66
COLORREF clrBk
Definition: status.c:71
STATUSWINDOWPART part0
Definition: status.c:73
HWND Notify
Definition: status.c:63
HFONT hDefaultFont
Definition: status.c:70
HWND Self
Definition: status.c:62
STATUSWINDOWPART * parts
Definition: status.c:74
INT horizontalBorder
Definition: status.c:75
BOOL bUnicode
Definition: status.c:72
HWND hwndToolTip
Definition: status.c:68
INT horizontalGap
Definition: status.c:77
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
LPCWSTR lpszClassName
Definition: winuser.h:3185
HBRUSH hbrBackground
Definition: winuser.h:3183
int cbClsExtra
Definition: winuser.h:3178
UINT style
Definition: winuser.h:3176
WNDPROC lpfnWndProc
Definition: winuser.h:3177
int cbWndExtra
Definition: winuser.h:3179
HCURSOR hCursor
Definition: winuser.h:3182
Definition: ftp_var.h:139
Definition: inflate.c:139
LPCSTR lpszName
Definition: winuser.h:2949
ULONG_PTR itemData
Definition: winuser.h:3093
UINT_PTR idFrom
Definition: winuser.h:3158
UINT code
Definition: winuser.h:3159
HWND hwndFrom
Definition: winuser.h:3157
POINT pt
Definition: commctrl.h:166
DWORD_PTR dwItemData
Definition: commctrl.h:165
DWORD_PTR dwItemSpec
Definition: commctrl.h:164
NMHDR hdr
Definition: commctrl.h:163
LPARAM dwHitInfo
Definition: commctrl.h:167
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
HINSTANCE hinst
Definition: commctrl.h:1733
LPSTR lpszText
Definition: commctrl.h:1734
UINT_PTR uId
Definition: commctrl.h:1731
HINSTANCE hinst
Definition: commctrl.h:1745
UINT_PTR uId
Definition: commctrl.h:1743
LPWSTR lpszText
Definition: commctrl.h:1746
Definition: time.h:68
#define max(a, b)
Definition: svc.c:63
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
uint32_t DWORD_PTR
Definition: typedefs.h:65
int32_t INT
Definition: typedefs.h:58
#define MAKELONG(a, b)
Definition: typedefs.h:249
#define HIWORD(l)
Definition: typedefs.h:247
static const WCHAR isW[]
Definition: lex.c:62
@ SP_GRIPPERPANE
Definition: vsstyle.h:1199
@ SP_PANE
Definition: vsstyle.h:1198
@ SP_GRIPPER
Definition: vsstyle.h:1200
#define ZeroMemory
Definition: winbase.h:1712
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
int * LPINT
Definition: windef.h:178
DWORD COLORREF
Definition: windef.h:300
#define WINAPI
Definition: msvc.h:6
BOOL WINAPI RectVisible(_In_ HDC, _In_ LPCRECT)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
#define DI_NORMAL
Definition: wingdi.h:72
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
#define WM_PAINT
Definition: winuser.h:1620
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define CS_VREDRAW
Definition: winuser.h:658
#define WM_GETTEXTLENGTH
Definition: winuser.h:1619
#define DFC_SCROLL
Definition: winuser.h:475
#define DT_NOPREFIX
Definition: winuser.h:537
#define BDR_SUNKENOUTER
Definition: winuser.h:443
#define GetWindowLongPtrW
Definition: winuser.h:4829
DWORD WINAPI GetMessagePos(void)
Definition: message.c:1351
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define SM_CYSIZE
Definition: winuser.h:992
#define WM_CREATE
Definition: winuser.h:1608
BOOL WINAPI DrawFrameControl(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
#define SM_CXVSCROLL
Definition: winuser.h:961
#define WM_SIZE
Definition: winuser.h:1611
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define HTERROR
Definition: winuser.h:2472
LONG WINAPI SetWindowLongW(_In_ HWND, _In_ int, _In_ LONG)
LONG WINAPI GetWindowLongW(_In_ HWND, _In_ int)
#define DT_SINGLELINE
Definition: winuser.h:540
#define WM_LBUTTONDBLCLK
Definition: winuser.h:1778
ATOM WINAPI RegisterClassW(_In_ CONST WNDCLASSW *)
#define IDC_ARROW
Definition: winuser.h:687
#define WM_NCHITTEST
Definition: winuser.h:1686
#define WM_RBUTTONUP
Definition: winuser.h:1780
#define DFCS_SCROLLSIZEGRIP
Definition: winuser.h:494
#define WM_RBUTTONDBLCLK
Definition: winuser.h:1781
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define BF_ADJUST
Definition: winuser.h:470
#define WM_MOUSEMOVE
Definition: winuser.h:1775
#define WM_GETTEXT
Definition: winuser.h:1618
#define CS_DBLCLKS
Definition: winuser.h:651
#define NF_REQUERY
Definition: winuser.h:2461
#define WM_SYSCOLORCHANGE
Definition: winuser.h:1626
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2105
#define WM_GETFONT
Definition: winuser.h:1651
#define GWLP_HINSTANCE
Definition: winuser.h:856
#define SM_CYHSCROLL
Definition: winuser.h:962
#define WM_DRAWITEM
Definition: winuser.h:1645
#define WM_SETTEXT
Definition: winuser.h:1617
#define SM_CYBORDER
Definition: winuser.h:965
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI DrawEdge(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
#define SIZE_MAXIMIZED
Definition: winuser.h:2507
#define WM_SETFONT
Definition: winuser.h:1650
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
BOOL WINAPI DrawIconEx(_In_ HDC, _In_ int, _In_ int, _In_ HICON, _In_ int, _In_ int, _In_ UINT, _In_opt_ HBRUSH, _In_ UINT)
Definition: cursoricon.c:2028
BOOL WINAPI UpdateWindow(_In_ HWND)
#define HTBOTTOMRIGHT
Definition: winuser.h:2495
HDC WINAPI GetDC(_In_opt_ HWND)
#define WM_LBUTTONUP
Definition: winuser.h:1777
LONG WINAPI GetMessageTime(void)
Definition: message.c:1361
BOOL WINAPI SystemParametersInfoW(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)
#define DT_VCENTER
Definition: winuser.h:543
#define CW_USEDEFAULT
Definition: winuser.h:225
#define CS_GLOBALCLASS
Definition: winuser.h:652
#define NFR_ANSI
Definition: winuser.h:2458
#define SIZE_RESTORED
Definition: winuser.h:2505
#define HTBOTTOMLEFT
Definition: winuser.h:2494
#define WM_NCLBUTTONUP
Definition: winuser.h:1693
#define GWLP_ID
Definition: winuser.h:860
#define WM_USER
Definition: winuser.h:1895
#define BDR_RAISEDOUTER
Definition: winuser.h:442
#define WM_DESTROY
Definition: winuser.h:1609
BOOL WINAPI UnregisterClassW(_In_ LPCWSTR, HINSTANCE)
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
#define SetWindowLongPtrW
Definition: winuser.h:5346
#define NFR_UNICODE
Definition: winuser.h:2459
#define BF_RECT
Definition: winuser.h:462
#define GWL_STYLE
Definition: winuser.h:852
BOOL WINAPI IsWindowVisible(_In_ HWND)
BOOL WINAPI DestroyWindow(_In_ HWND)
int WINAPI GetSystemMetrics(_In_ int)
#define WM_NCLBUTTONDOWN
Definition: winuser.h:1692
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
#define NF_QUERY
Definition: winuser.h:2460
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define COLOR_BTNFACE
Definition: winuser.h:928
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
#define GWL_EXSTYLE
Definition: winuser.h:851
#define COLOR_3DFACE
Definition: winuser.h:929
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION Free
Definition: exfuncs.h:815
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
char CHAR
Definition: xmlstorage.h:175