2 * Interface code to StatusWindow widget/control
4 * Copyright 1996 Bruce Milner
16 * Run tests using Waite Group Windows95 API Bible Vol. 1&2
17 * The second cdrom contains executables drawstat.exe,gettext.exe,
18 * simple.exe, getparts.exe, setparts.exe, statwnd.exe
23 * 1) Add size grip to status bar - SBARS_SIZEGRIP
24 * 2) Don't hard code bar to bottom of window, allow CCS_TOP also
25 * 3) Fix SBT_OWNERDRAW
26 * 4) Add DrawStatusText32A funtion
29 static STATUSWINDOWINFO
*GetStatusInfo(HWND32 hwnd
)
33 wndPtr
= WIN_FindWndPtr(hwnd
);
34 return ((STATUSWINDOWINFO
*) &wndPtr
->wExtra
[0]);
37 static BOOL32
SW_Refresh( HWND32 hwnd
, HDC32 hdc
, STATUSWINDOWINFO
*self
)
41 if (!IsWindowVisible32(hwnd
)) {
46 DrawStatusText32A(hdc
,
52 for (i
= 0; i
< self
->numParts
; i
++) {
53 DrawStatusText32A(hdc
,
54 &self
->parts
[i
].bound
,
56 self
->parts
[i
].style
);
65 SW_GetBorders(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
69 /* FIXME for sizegrips */
70 out
= (LPINT32
) lParam
;
71 out
[0] = 1; /* vertical border width */
72 out
[1] = 1; /* horizontal border width */
73 out
[2] = 1; /* width of border between rectangles */
78 SW_SetPartBounds(HWND32 hwnd
, STATUSWINDOWINFO
*self
)
82 STATUSWINDOWPART
*part
;
85 /* get our window size */
86 GetClientRect32(hwnd
, &rect
);
88 /* set bounds for simple rectangle */
89 self
->part0
.bound
= rect
;
91 /* set bounds for non-simple rectangles */
92 for (i
= 0; i
< self
->numParts
; i
++) {
93 part
= &self
->parts
[i
];
94 r
= &self
->parts
[i
].bound
;
96 r
->bottom
= rect
.bottom
;
100 r
->left
= self
->parts
[i
-1].bound
.right
+sep
;
102 r
->right
= rect
.right
;
109 SW_SetText(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
115 STATUSWINDOWPART
*part
;
117 text
= (LPSTR
) lParam
;
118 part_num
= ((INT32
) wParam
) & 0x00ff;
119 style
= ((INT32
) wParam
) & 0xff00;
121 if ((self
->simple
) || (self
->parts
==NULL
) || (part_num
==255))
124 part
= &self
->parts
[part_num
];
125 if (!part
) return FALSE
;
127 if (style
== SBT_OWNERDRAW
) {
131 /* duplicate string */
133 HeapFree(SystemHeap
, 0, part
->text
);
135 if (text
&& (len
= lstrlen32A(text
))) {
136 part
->text
= HeapAlloc(SystemHeap
, 0, len
+1);
137 lstrcpy32A(part
->text
, text
);
140 InvalidateRect32(hwnd
, &part
->bound
, FALSE
);
145 SW_SetParts(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
149 STATUSWINDOWPART
* tmp
;
154 self
->simple
= FALSE
;
156 oldNumParts
= self
->numParts
;
157 self
->numParts
= (INT32
) wParam
;
158 parts
= (LPINT32
) lParam
;
159 if (oldNumParts
> self
->numParts
) {
160 for (i
= self
->numParts
; i
< oldNumParts
; i
++) {
161 if (self
->parts
[i
].text
&& (self
->parts
[i
].style
!= SBT_OWNERDRAW
))
162 HeapFree(SystemHeap
, 0, self
->parts
[i
].text
);
165 else if (oldNumParts
< self
->numParts
) {
166 tmp
= HeapAlloc(SystemHeap
, HEAP_ZERO_MEMORY
,
167 sizeof(STATUSWINDOWPART
) * self
->numParts
);
168 for (i
= 0; i
< oldNumParts
; i
++) {
169 tmp
[i
] = self
->parts
[i
];
172 HeapFree(SystemHeap
, 0, self
->parts
);
176 for (i
= 0; i
< self
->numParts
; i
++) {
177 self
->parts
[i
].x
= parts
[i
];
179 SW_SetPartBounds(hwnd
, self
);
182 SW_Refresh(hwnd
, hdc
, self
);
183 ReleaseDC32(hwnd
, hdc
);
188 SW_GetParts(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
194 self
= GetStatusInfo(hwnd
);
195 num_parts
= (INT32
) wParam
;
196 parts
= (LPINT32
) lParam
;
198 return (self
->numParts
);
199 for (i
= 0; i
< num_parts
; i
++) {
200 parts
[i
] = self
->parts
[i
].x
;
203 return (self
->numParts
);
207 SW_Create(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
210 LPCREATESTRUCT32A lpCreate
= (LPCREATESTRUCT32A
) lParam
;
218 GetClientRect32(hwnd
, &rect
);
220 /* initialize simple case */
221 self
->part0
.bound
= rect
;
222 self
->part0
.text
= 0;
224 self
->part0
.style
= 0;
227 if ((hdc
= GetDC32(0))) {
229 GetTextMetrics32A(hdc
, &tm
);
230 self
->textHeight
= tm
.tmHeight
;
234 parent
= GetParent32(hwnd
);
235 GetClientRect32(parent
, &rect
);
236 width
= rect
.right
- rect
.left
;
237 height
= (self
->textHeight
* 3)/2;
238 MoveWindow32(hwnd
, lpCreate
->x
, lpCreate
->y
-1, width
, height
, FALSE
);
239 SW_SetPartBounds(hwnd
, self
);
244 SW_GetRect(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
249 part_num
= ((INT32
) wParam
) & 0x00ff;
250 rect
= (LPRECT32
) lParam
;
252 *rect
= self
->part0
.bound
;
254 *rect
= self
->parts
[part_num
].bound
;
259 SW_GetText(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
263 STATUSWINDOWPART
*part
;
266 part_num
= ((INT32
) wParam
) & 0x00ff;
267 out_text
= (LPSTR
) lParam
;
271 part
= &self
->parts
[part_num
];
273 if (part
->style
== SBT_OWNERDRAW
)
274 result
= (LRESULT
) part
->text
;
276 result
= part
->text
? lstrlen32A(part
->text
) : 0;
277 result
|= (part
->style
<< 16);
279 lstrcpy32A(out_text
, part
->text
);
286 SW_GetTextLength(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
289 STATUSWINDOWPART
*part
;
292 part_num
= ((INT32
) wParam
) & 0x00ff;
297 part
= &self
->parts
[part_num
];
300 result
= lstrlen32A(part
->text
);
304 result
|= (part
->style
<< 16);
309 SW_SetMinHeight(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
312 /* size is wParam | 2*pixels_of_horz_border */
317 SW_Simple(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
322 simple
= (BOOL32
) wParam
;
323 self
->simple
= simple
;
325 SW_Refresh(hwnd
, hdc
, self
);
326 ReleaseDC32(hwnd
, hdc
);
331 SW_Size(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
333 /* Need to resize width to match parent */
334 INT32 width
, height
, x
, y
;
340 flags
= (INT32
) wParam
;
343 * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED, SIZE_RESTORED
346 if (flags
== SIZE_RESTORED
) {
347 /* width and height don't apply */
348 parent
= GetParent32(hwnd
);
349 GetClientRect32(parent
, &parent_rect
);
350 height
= (self
->textHeight
* 3)/2;
351 width
= parent_rect
.right
- parent_rect
.left
;
352 x
= parent_rect
.left
;
353 y
= parent_rect
.bottom
- height
;
354 MoveWindow32(hwnd
, parent_rect
.left
, parent_rect
.bottom
- height
- 1,
355 width
, height
, TRUE
);
356 SW_SetPartBounds(hwnd
, self
);
362 SW_Destroy(STATUSWINDOWINFO
*self
, HWND32 hwnd
, WPARAM32 wParam
, LPARAM lParam
)
366 for (i
= 0; i
< self
->numParts
; i
++) {
367 if (self
->parts
[i
].text
&& (self
->parts
[i
].style
!= SBT_OWNERDRAW
))
368 HeapFree(SystemHeap
, 0, self
->parts
[i
].text
);
370 if (self
->part0
.text
&& (self
->part0
.style
!= SBT_OWNERDRAW
))
371 HeapFree(SystemHeap
, 0, self
->part0
.text
);
372 HeapFree(SystemHeap
, 0, self
->parts
);
379 SW_Paint(STATUSWINDOWINFO
*self
, HWND32 hwnd
)
384 hdc
= BeginPaint32(hwnd
, &ps
);
385 SW_Refresh(hwnd
, hdc
, self
);
386 EndPaint32(hwnd
, &ps
);
390 LRESULT WINAPI
StatusWindowProc( HWND32 hwnd
, UINT32 msg
,
391 WPARAM32 wParam
, LPARAM lParam
)
393 STATUSWINDOWINFO
*self
;
395 self
= GetStatusInfo(hwnd
);
399 return SW_GetBorders(self
, hwnd
, wParam
, lParam
);
401 return SW_GetParts(self
, hwnd
, wParam
, lParam
);
403 return SW_GetRect(self
, hwnd
, wParam
, lParam
);
405 return SW_GetText(self
, hwnd
, wParam
, lParam
);
406 case SB_GETTEXTLENGTH32A
:
407 return SW_GetTextLength(self
, hwnd
, wParam
, lParam
);
408 case SB_SETMINHEIGHT
:
409 return SW_SetMinHeight(self
, hwnd
, wParam
, lParam
);
411 return SW_SetParts(self
, hwnd
, wParam
, lParam
);
413 return SW_SetText(self
, hwnd
, wParam
, lParam
);
415 return SW_Simple(self
, hwnd
, wParam
, lParam
);
418 return SW_Create(self
, hwnd
, wParam
, lParam
);
420 return SW_Destroy(self
, hwnd
, wParam
, lParam
);
422 return SW_Paint(self
, hwnd
);
424 return SW_Size(self
, hwnd
, wParam
, lParam
);
426 return DefWindowProc32A(hwnd
, msg
, wParam
, lParam
);