1 /* Unit tests for rebar.
3 * Copyright 2007 Mikolaj Zalewski
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 /* make sure the structures work with a comctl32 v5.x */
21 #define _WIN32_WINNT 0x500
22 #define _WIN32_IE 0x500
31 #include "wine/heap.h"
32 #include "wine/test.h"
34 static BOOL (WINAPI
*pImageList_Destroy
)(HIMAGELIST
);
35 static HIMAGELIST (WINAPI
*pImageList_LoadImageA
)(HINSTANCE
, LPCSTR
, int, int, COLORREF
, UINT
, UINT
);
37 static RECT height_change_notify_rect
;
39 static int system_font_height
;
42 #define check_rect(name, val, exp) ok(EqualRect(&val, &exp), \
43 "invalid rect (" name ") %s - expected %s\n", wine_dbgstr_rect(&val), wine_dbgstr_rect(&exp));
45 #define check_rect_no_top(name, val, exp) { \
46 ok((val.bottom - val.top == exp.bottom - exp.top) && \
47 val.left == exp.left && val.right == exp.right, \
48 "invalid rect (" name ") %s - expected %s, ignoring top\n", \
49 wine_dbgstr_rect(&val), wine_dbgstr_rect(&exp)); }
51 #define compare(val, exp, format) ok((val) == (exp), #val " value " format " expected " format "\n", (val), (exp));
53 #define expect_eq(line, expr, value, type, format) { type ret = expr;\
54 ok((value) == ret, #expr " expected " format " got " format " from line %d\n", (value), (ret), line); }
56 static INT CALLBACK
is_font_installed_proc(const LOGFONTA
*elf
, const TEXTMETRICA
*ntm
, DWORD type
, LPARAM lParam
)
61 static BOOL
is_font_installed(const char *name
)
66 if(!EnumFontFamiliesA(hdc
, name
, is_font_installed_proc
, 0))
73 static void init_system_font_height(void) {
77 hDC
= CreateCompatibleDC(NULL
);
78 GetTextMetricsA(hDC
, &tm
);
81 system_font_height
= tm
.tmHeight
;
84 static HWND
create_rebar_control(void)
88 hwnd
= CreateWindowA(REBARCLASSNAMEA
, NULL
, WS_CHILD
| WS_VISIBLE
, 0, 0, 0, 0,
89 hMainWnd
, (HMENU
)17, GetModuleHandleA(NULL
), NULL
);
90 ok(hwnd
!= NULL
, "Failed to create Rebar\n");
92 SendMessageA(hwnd
, WM_SETFONT
, (WPARAM
)GetStockObject(SYSTEM_FONT
), 0);
97 static HWND
build_toolbar(int nr
, HWND hParent
)
100 HWND hToolbar
= CreateWindowExA(0, TOOLBARCLASSNAMEA
, NULL
, WS_CHILD
| WS_VISIBLE
| CCS_NORESIZE
, 0, 0, 0, 0,
101 hParent
, (HMENU
)5, GetModuleHandleA(NULL
), NULL
);
105 ok(hToolbar
!= NULL
, "Toolbar creation problem\n");
106 ok(SendMessageA(hToolbar
, TB_BUTTONSTRUCTSIZE
, sizeof(TBBUTTON
), 0) == 0, "TB_BUTTONSTRUCTSIZE failed\n");
107 ok(SendMessageA(hToolbar
, TB_AUTOSIZE
, 0, 0) == 0, "TB_AUTOSIZE failed\n");
108 ok(SendMessageA(hToolbar
, WM_SETFONT
, (WPARAM
)GetStockObject(SYSTEM_FONT
), 0)==1, "WM_SETFONT\n");
110 for (i
=0; i
<5+nr
; i
++)
113 btns
[i
].idCommand
= i
;
114 btns
[i
].fsStyle
= BTNS_BUTTON
;
115 btns
[i
].fsState
= TBSTATE_ENABLED
;
121 case 0: iBitmapId
= IDB_HIST_SMALL_COLOR
; break;
122 case 1: iBitmapId
= IDB_VIEW_SMALL_COLOR
; break;
123 case 2: iBitmapId
= IDB_STD_SMALL_COLOR
; break;
125 ok(SendMessageA(hToolbar
, TB_LOADIMAGES
, iBitmapId
, (LPARAM
)HINST_COMMCTRL
) == 0, "TB_LOADIMAGES failed\n");
126 ok(SendMessageA(hToolbar
, TB_ADDBUTTONSA
, 5+nr
, (LPARAM
)btns
), "TB_ADDBUTTONSA failed\n");
130 static int g_parent_measureitem
;
132 static LRESULT CALLBACK
parent_wndproc(HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
138 NMHDR
*lpnm
= (NMHDR
*)lParam
;
139 if (lpnm
->code
== RBN_HEIGHTCHANGE
)
140 GetClientRect(lpnm
->hwndFrom
, &height_change_notify_rect
);
144 g_parent_measureitem
++;
147 return DefWindowProcA(hWnd
, msg
, wParam
, lParam
);
150 #if 0 /* use this to generate more tests*/
152 static void dump_sizes(HWND hRebar
)
159 GetClientRect(hRebar
, &r
);
160 count
= SendMessageA(hRebar
, RB_GETROWCOUNT
, 0, 0);
161 printf(" { {%d, %d, %d, %d}, %d, %d, {", r
.left
, r
.top
, r
.right
, r
.bottom
,
162 SendMessageA(hRebar
, RB_GETBARHEIGHT
, 0, 0), count
);
165 for (i
= 0; i
< count
; i
++) /* rows */
166 printf("%d, ", SendMessageA(hRebar
, RB_GETROWHEIGHT
, i
, 0));
169 count
= SendMessageA(hRebar
, RB_GETBANDCOUNT
, 0, 0);
170 printf("%d, {", count
);
172 printf("{{0, 0, 0, 0}, 0, 0},");
173 for (i
=0; i
<count
; i
++)
176 rbi
.cbSize
= REBARBANDINFOA_V6_SIZE
;
177 rbi
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_STYLE
;
178 ok(SendMessageA(hRebar
, RB_GETBANDINFOA
, i
, (LPARAM
)&rbi
), "RB_GETBANDINFOA failed\n");
179 ok(SendMessageA(hRebar
, RB_GETRECT
, i
, (LPARAM
)&r
), "RB_GETRECT failed\n");
180 printf("%s{ {%3d, %3d, %3d, %3d}, 0x%02x, %d}, ", (i
%2==0 ? "\n " : ""), r
.left
, r
.top
, r
.right
, r
.bottom
,
183 printf("\n }, },\n");
186 #define check_sizes() dump_sizes(hRebar);
187 #define check_sizes_todo(todomask) dump_sizes(hRebar);
191 static int string_width(const CHAR
*s
) {
195 hdc
= CreateCompatibleDC(NULL
);
196 GetTextExtentPoint32A(hdc
, s
, strlen(s
), &sz
);
214 rbband_result_t
*bands
;
217 static rbsize_result_t
rbsize_init(int cleft
, int ctop
, int cright
, int cbottom
, int cyBarHeight
, int nRows
, int nBands
)
221 SetRect(&ret
.rcClient
, cleft
, ctop
, cright
, cbottom
);
222 ret
.cyBarHeight
= cyBarHeight
;
224 ret
.cyRowHeights
= heap_alloc_zero(nRows
* sizeof(int));
226 ret
.bands
= heap_alloc_zero(nBands
* sizeof(*ret
.bands
));
231 static void rbsize_add_row(rbsize_result_t
*rbsr
, int rowHeight
) {
232 rbsr
->cyRowHeights
[rbsr
->nRows
] = rowHeight
;
236 static void rbsize_add_band(rbsize_result_t
*rbsr
, int left
, int top
, int right
, int bottom
, DWORD fStyle
, UINT cx
)
238 SetRect(&(rbsr
->bands
[rbsr
->nBands
].rc
), left
, top
, right
, bottom
);
239 rbsr
->bands
[rbsr
->nBands
].fStyle
= fStyle
;
240 rbsr
->bands
[rbsr
->nBands
].cx
= cx
;
244 static rbsize_result_t
*rbsize_results
;
246 #define rbsize_results_num 27
248 static void rbsize_results_init(void)
250 rbsize_results
= heap_alloc(rbsize_results_num
* sizeof(*rbsize_results
));
252 rbsize_results
[0] = rbsize_init(0, 0, 672, 0, 0, 0, 0);
254 rbsize_results
[1] = rbsize_init(0, 0, 672, 4, 4, 1, 1);
255 rbsize_add_row(&rbsize_results
[1], 4);
256 rbsize_add_band(&rbsize_results
[1], 0, 0, 672, 4, 0x00, 200);
258 rbsize_results
[2] = rbsize_init(0, 0, 672, 4, 4, 1, 2);
259 rbsize_add_row(&rbsize_results
[2], 4);
260 rbsize_add_band(&rbsize_results
[2], 0, 0, 200, 4, 0x00, 200);
261 rbsize_add_band(&rbsize_results
[2], 200, 0, 672, 4, 0x04, 200);
263 rbsize_results
[3] = rbsize_init(0, 0, 672, 30, 30, 1, 3);
264 rbsize_add_row(&rbsize_results
[3], 30);
265 rbsize_add_band(&rbsize_results
[3], 0, 0, 200, 30, 0x00, 200);
266 rbsize_add_band(&rbsize_results
[3], 200, 0, 400, 30, 0x04, 200);
267 rbsize_add_band(&rbsize_results
[3], 400, 0, 672, 30, 0x00, 200);
269 rbsize_results
[4] = rbsize_init(0, 0, 672, 34, 34, 1, 4);
270 rbsize_add_row(&rbsize_results
[4], 34);
271 rbsize_add_band(&rbsize_results
[4], 0, 0, 200, 34, 0x00, 200);
272 rbsize_add_band(&rbsize_results
[4], 200, 0, 400, 34, 0x04, 200);
273 rbsize_add_band(&rbsize_results
[4], 400, 0, 604, 34, 0x00, 200);
274 rbsize_add_band(&rbsize_results
[4], 604, 0, 672, 34, 0x04, 68);
276 rbsize_results
[5] = rbsize_init(0, 0, 672, 34, 34, 1, 4);
277 rbsize_add_row(&rbsize_results
[5], 34);
278 rbsize_add_band(&rbsize_results
[5], 0, 0, 200, 34, 0x00, 200);
279 rbsize_add_band(&rbsize_results
[5], 200, 0, 400, 34, 0x04, 200);
280 rbsize_add_band(&rbsize_results
[5], 400, 0, 604, 34, 0x00, 200);
281 rbsize_add_band(&rbsize_results
[5], 604, 0, 672, 34, 0x04, 68);
283 rbsize_results
[6] = rbsize_init(0, 0, 672, 34, 34, 1, 4);
284 rbsize_add_row(&rbsize_results
[6], 34);
285 rbsize_add_band(&rbsize_results
[6], 0, 0, 200, 34, 0x00, 200);
286 rbsize_add_band(&rbsize_results
[6], 202, 0, 402, 34, 0x04, 200);
287 rbsize_add_band(&rbsize_results
[6], 404, 0, 604, 34, 0x00, 200);
288 rbsize_add_band(&rbsize_results
[6], 606, 0, 672, 34, 0x04, 66);
290 rbsize_results
[7] = rbsize_init(0, 0, 672, 70, 70, 2, 5);
291 rbsize_add_row(&rbsize_results
[7], 34);
292 rbsize_add_row(&rbsize_results
[7], 34);
293 rbsize_add_band(&rbsize_results
[7], 0, 0, 142, 34, 0x00, 200);
294 rbsize_add_band(&rbsize_results
[7], 144, 0, 557, 34, 0x00, 200);
295 rbsize_add_band(&rbsize_results
[7], 559, 0, 672, 34, 0x04, 200);
296 rbsize_add_band(&rbsize_results
[7], 0, 36, 200, 70, 0x00, 200);
297 rbsize_add_band(&rbsize_results
[7], 202, 36, 672, 70, 0x04, 66);
299 rbsize_results
[8] = rbsize_init(0, 0, 672, 34, 34, 1, 5);
300 rbsize_add_row(&rbsize_results
[8], 34);
301 rbsize_add_band(&rbsize_results
[8], 0, 0, 167, 34, 0x00, 200);
302 rbsize_add_band(&rbsize_results
[8], 169, 0, 582, 34, 0x00, 200);
303 rbsize_add_band(&rbsize_results
[8], 559, 0, 759, 34, 0x08, 200);
304 rbsize_add_band(&rbsize_results
[8], 584, 0, 627, 34, 0x00, 200);
305 rbsize_add_band(&rbsize_results
[8], 629, 0, 672, 34, 0x04, 66);
307 rbsize_results
[9] = rbsize_init(0, 0, 672, 34, 34, 1, 4);
308 rbsize_add_row(&rbsize_results
[9], 34);
309 rbsize_add_band(&rbsize_results
[9], 0, 0, 167, 34, 0x00, 200);
310 rbsize_add_band(&rbsize_results
[9], 169, 0, 582, 34, 0x00, 200);
311 rbsize_add_band(&rbsize_results
[9], 584, 0, 627, 34, 0x00, 200);
312 rbsize_add_band(&rbsize_results
[9], 629, 0, 672, 34, 0x04, 66);
314 rbsize_results
[10] = rbsize_init(0, 0, 672, 34, 34, 1, 3);
315 rbsize_add_row(&rbsize_results
[10], 34);
316 rbsize_add_band(&rbsize_results
[10], 0, 0, 413, 34, 0x00, 200);
317 rbsize_add_band(&rbsize_results
[10], 415, 0, 615, 34, 0x00, 200);
318 rbsize_add_band(&rbsize_results
[10], 617, 0, 672, 34, 0x04, 66);
320 rbsize_results
[11] = rbsize_init(0, 0, 672, 34, 34, 1, 2);
321 rbsize_add_row(&rbsize_results
[11], 34);
322 rbsize_add_band(&rbsize_results
[11], 0, 0, 604, 34, 0x00, 200);
323 rbsize_add_band(&rbsize_results
[11], 606, 0, 672, 34, 0x04, 66);
325 rbsize_results
[12] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
326 rbsize_add_row(&rbsize_results
[12], 4 + system_font_height
);
327 rbsize_add_row(&rbsize_results
[12], 4 + system_font_height
);
328 rbsize_add_band(&rbsize_results
[12], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
329 rbsize_add_band(&rbsize_results
[12], 87 + string_width("ABC"), 0, 157 + string_width("ABC"), 4 + system_font_height
, 0x00, 70);
330 rbsize_add_band(&rbsize_results
[12], 157 + string_width("ABC"), 0, 397 + string_width("ABC"), 4 + system_font_height
, 0x00, 240);
331 rbsize_add_band(&rbsize_results
[12], 397 + string_width("ABC"), 0, 672, 4 + system_font_height
, 0x00, 60);
332 rbsize_add_band(&rbsize_results
[12], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
334 rbsize_results
[13] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
335 rbsize_add_row(&rbsize_results
[13], 4 + system_font_height
);
336 rbsize_add_row(&rbsize_results
[13], 4 + system_font_height
);
337 rbsize_add_band(&rbsize_results
[13], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
338 rbsize_add_band(&rbsize_results
[13], 87 + string_width("ABC"), 0, 200 + string_width("ABC"), 4 + system_font_height
, 0x00, 113);
339 rbsize_add_band(&rbsize_results
[13], 200 + string_width("ABC"), 0, 397 + string_width("ABC"), 4 + system_font_height
, 0x00, 197);
340 rbsize_add_band(&rbsize_results
[13], 397 + string_width("ABC"), 0, 672, 4 + system_font_height
, 0x00, 60);
341 rbsize_add_band(&rbsize_results
[13], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
343 rbsize_results
[14] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
344 rbsize_add_row(&rbsize_results
[14], 4 + system_font_height
);
345 rbsize_add_row(&rbsize_results
[14], 4 + system_font_height
);
346 rbsize_add_band(&rbsize_results
[14], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
347 rbsize_add_band(&rbsize_results
[14], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM"));
348 rbsize_add_band(&rbsize_results
[14], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 183);
349 rbsize_add_band(&rbsize_results
[14], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height
, 0x00, 77 + string_width("MMMMMMM"));
350 rbsize_add_band(&rbsize_results
[14], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
352 rbsize_results
[15] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
353 rbsize_add_row(&rbsize_results
[15], 4 + system_font_height
);
354 rbsize_add_row(&rbsize_results
[15], 4 + system_font_height
);
355 rbsize_add_band(&rbsize_results
[15], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
356 rbsize_add_band(&rbsize_results
[15], 87 + string_width("ABC"), 0, 140 + string_width("ABC"), 4 + system_font_height
, 0x00, 53);
357 rbsize_add_band(&rbsize_results
[15], 140 + string_width("ABC"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 455 - string_width("MMMMMMM") - string_width("ABC"));
358 rbsize_add_band(&rbsize_results
[15], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height
, 0x00, 77 + string_width("MMMMMMM"));
359 rbsize_add_band(&rbsize_results
[15], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
361 rbsize_results
[16] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
362 rbsize_add_row(&rbsize_results
[16], 4 + system_font_height
);
363 rbsize_add_row(&rbsize_results
[16], 4 + system_font_height
);
364 rbsize_add_band(&rbsize_results
[16], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
365 rbsize_add_band(&rbsize_results
[16], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM"));
366 rbsize_add_band(&rbsize_results
[16], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 183);
367 rbsize_add_band(&rbsize_results
[16], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height
, 0x00, 77 + string_width("MMMMMMM"));
368 rbsize_add_band(&rbsize_results
[16], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
370 rbsize_results
[17] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
371 rbsize_add_row(&rbsize_results
[17], 4 + system_font_height
);
372 rbsize_add_row(&rbsize_results
[17], 4 + system_font_height
);
373 rbsize_add_band(&rbsize_results
[17], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
374 rbsize_add_band(&rbsize_results
[17], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM"));
375 rbsize_add_band(&rbsize_results
[17], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 183);
376 rbsize_add_band(&rbsize_results
[17], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height
, 0x00, 77 + string_width("MMMMMMM"));
377 rbsize_add_band(&rbsize_results
[17], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
379 rbsize_results
[18] = rbsize_init(0, 0, 672, 56, 56, 2, 5);
380 rbsize_add_row(&rbsize_results
[18], 28);
381 rbsize_add_row(&rbsize_results
[18], 28);
382 rbsize_add_band(&rbsize_results
[18], 0, 0, 87 + string_width("ABC"), 28, 0x00, 40);
383 rbsize_add_band(&rbsize_results
[18], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 28, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM"));
384 rbsize_add_band(&rbsize_results
[18], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 28, 0x00, 183);
385 rbsize_add_band(&rbsize_results
[18], 595 - string_width("MMMMMMM"), 0, 672, 28, 0x00, 77 + string_width("MMMMMMM"));
386 rbsize_add_band(&rbsize_results
[18], 0, 28, 672, 56, 0x00, 200);
388 rbsize_results
[19] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
389 rbsize_add_row(&rbsize_results
[19], 4 + system_font_height
);
390 rbsize_add_row(&rbsize_results
[19], 4 + system_font_height
);
391 rbsize_add_band(&rbsize_results
[19], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
392 rbsize_add_band(&rbsize_results
[19], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM"));
393 rbsize_add_band(&rbsize_results
[19], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 183);
394 rbsize_add_band(&rbsize_results
[19], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height
, 0x00, 77 + string_width("MMMMMMM"));
395 rbsize_add_band(&rbsize_results
[19], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
397 rbsize_results
[20] = rbsize_init(0, 0, 672, 56, 56, 2, 5);
398 rbsize_add_row(&rbsize_results
[20], 28);
399 rbsize_add_row(&rbsize_results
[20], 28);
400 rbsize_add_band(&rbsize_results
[20], 0, 0, 87 + string_width("ABC"), 28, 0x00, 40);
401 rbsize_add_band(&rbsize_results
[20], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 28, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM"));
402 rbsize_add_band(&rbsize_results
[20], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 28, 0x00, 183);
403 rbsize_add_band(&rbsize_results
[20], 595 - string_width("MMMMMMM"), 0, 672, 28, 0x00, 77 + string_width("MMMMMMM"));
404 rbsize_add_band(&rbsize_results
[20], 0, 28, 672, 56, 0x00, 200);
406 rbsize_results
[21] = rbsize_init(0, 0, 672, 0, 0, 0, 0);
408 rbsize_results
[22] = rbsize_init(0, 0, 672, 65, 56, 1, 3);
409 rbsize_add_row(&rbsize_results
[22], 65);
410 rbsize_add_band(&rbsize_results
[22], 0, 0, 90, 65, 0x40, 90);
411 rbsize_add_band(&rbsize_results
[22], 90, 0, 180, 65, 0x40, 90);
412 rbsize_add_band(&rbsize_results
[22], 180, 0, 672, 65, 0x40, 90);
414 rbsize_results
[23] = rbsize_init(0, 0, 0, 226, 0, 0, 0);
416 rbsize_results
[24] = rbsize_init(0, 0, 65, 226, 65, 1, 1);
417 rbsize_add_row(&rbsize_results
[24], 65);
418 rbsize_add_band(&rbsize_results
[24], 0, 0, 226, 65, 0x40, 90);
420 rbsize_results
[25] = rbsize_init(0, 0, 65, 226, 65, 1, 2);
421 rbsize_add_row(&rbsize_results
[25], 65);
422 rbsize_add_band(&rbsize_results
[25], 0, 0, 90, 65, 0x40, 90);
423 rbsize_add_band(&rbsize_results
[25], 90, 0, 226, 65, 0x40, 90);
425 rbsize_results
[26] = rbsize_init(0, 0, 65, 226, 65, 1, 3);
426 rbsize_add_row(&rbsize_results
[26], 65);
427 rbsize_add_band(&rbsize_results
[26], 0, 0, 90, 65, 0x40, 90);
428 rbsize_add_band(&rbsize_results
[26], 90, 0, 163, 65, 0x40, 90);
429 rbsize_add_band(&rbsize_results
[26], 163, 0, 226, 65, 0x40, 90);
432 static void rbsize_results_free(void)
436 for (i
= 0; i
< rbsize_results_num
; i
++) {
437 heap_free(rbsize_results
[i
].cyRowHeights
);
438 heap_free(rbsize_results
[i
].bands
);
440 heap_free(rbsize_results
);
441 rbsize_results
= NULL
;
444 static int rbsize_numtests
= 0;
446 #define check_sizes_todo(todomask) { \
448 REBARBANDINFOA rbi; \
449 int count, i/*, mask=(todomask)*/; \
450 const rbsize_result_t *res = &rbsize_results[rbsize_numtests]; \
451 GetClientRect(hRebar, &rc); \
452 check_rect("client", rc, res->rcClient); \
453 count = SendMessageA(hRebar, RB_GETROWCOUNT, 0, 0); \
454 compare(count, res->nRows, "%d"); \
455 for (i=0; i<min(count, res->nRows); i++) { \
456 int height = SendMessageA(hRebar, RB_GETROWHEIGHT, 0, 0);\
457 ok(height == res->cyRowHeights[i], "Height mismatch for row %d - %d vs %d\n", i, res->cyRowHeights[i], height); \
459 count = SendMessageA(hRebar, RB_GETBANDCOUNT, 0, 0); \
460 compare(count, res->nBands, "%d"); \
461 for (i=0; i<min(count, res->nBands); i++) { \
462 ok(SendMessageA(hRebar, RB_GETRECT, i, (LPARAM)&rc) == 1, "RB_GETRECT\n"); \
463 if (!(res->bands[i].fStyle & RBBS_HIDDEN)) \
464 check_rect("band", rc, res->bands[i].rc); \
465 rbi.cbSize = REBARBANDINFOA_V6_SIZE; \
466 rbi.fMask = RBBIM_STYLE | RBBIM_SIZE; \
467 ok(SendMessageA(hRebar, RB_GETBANDINFOA, i, (LPARAM)&rbi) == 1, "RB_GETBANDINFOA\n"); \
468 compare(rbi.fStyle, res->bands[i].fStyle, "%x"); \
469 compare(rbi.cx, res->bands[i].cx, "%d"); \
474 #define check_sizes() check_sizes_todo(0)
478 static void add_band_w(HWND hRebar
, LPCSTR lpszText
, int cxMinChild
, int cx
, int cxIdeal
)
480 CHAR buffer
[MAX_PATH
];
483 if (lpszText
!= NULL
)
484 strcpy(buffer
, lpszText
);
485 rbi
.cbSize
= REBARBANDINFOA_V6_SIZE
;
486 rbi
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_CHILD
| RBBIM_IDEALSIZE
| RBBIM_TEXT
;
488 rbi
.cxMinChild
= cxMinChild
;
489 rbi
.cxIdeal
= cxIdeal
;
491 rbi
.hwndChild
= build_toolbar(1, hRebar
);
492 rbi
.lpText
= (lpszText
? buffer
: NULL
);
493 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
496 static void test_layout(void)
503 rbsize_results_init();
505 hRebar
= create_rebar_control();
507 rbi
.cbSize
= REBARBANDINFOA_V6_SIZE
;
508 rbi
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_CHILD
;
510 rbi
.cxMinChild
= 100;
512 rbi
.hwndChild
= NULL
;
513 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
516 rbi
.fMask
|= RBBIM_STYLE
;
517 rbi
.fStyle
= RBBS_CHILDEDGE
;
518 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
525 rbi
.hwndChild
= build_toolbar(0, hRebar
);
526 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
529 rbi
.fStyle
= RBBS_CHILDEDGE
;
531 rbi
.hwndChild
= build_toolbar(0, hRebar
);
532 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
535 SetWindowLongA(hRebar
, GWL_STYLE
, GetWindowLongA(hRebar
, GWL_STYLE
) | RBS_BANDBORDERS
);
536 check_sizes(); /* a style change won't start a relayout */
537 rbi
.fMask
= RBBIM_SIZE
;
539 SendMessageA(hRebar
, RB_SETBANDINFOA
, 3, (LPARAM
)&rbi
);
540 check_sizes(); /* here it will be relayouted */
542 /* this will force a new row */
543 rbi
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_CHILD
;
545 rbi
.cxMinChild
= 400;
547 rbi
.hwndChild
= build_toolbar(0, hRebar
);
548 SendMessageA(hRebar
, RB_INSERTBANDA
, 1, (LPARAM
)&rbi
);
551 rbi
.fMask
= RBBIM_STYLE
;
552 rbi
.fStyle
= RBBS_HIDDEN
;
553 SendMessageA(hRebar
, RB_SETBANDINFOA
, 2, (LPARAM
)&rbi
);
556 SendMessageA(hRebar
, RB_DELETEBAND
, 2, 0);
558 SendMessageA(hRebar
, RB_DELETEBAND
, 0, 0);
560 SendMessageA(hRebar
, RB_DELETEBAND
, 1, 0);
563 DestroyWindow(hRebar
);
565 hRebar
= create_rebar_control();
566 add_band_w(hRebar
, "ABC", 70, 40, 100);
567 add_band_w(hRebar
, NULL
, 40, 70, 100);
568 add_band_w(hRebar
, NULL
, 170, 240, 100);
569 add_band_w(hRebar
, "MMMMMMM", 60, 60, 100);
570 add_band_w(hRebar
, NULL
, 200, 200, 100);
572 SendMessageA(hRebar
, RB_MAXIMIZEBAND
, 1, TRUE
);
574 SendMessageA(hRebar
, RB_MAXIMIZEBAND
, 1, TRUE
);
576 SendMessageA(hRebar
, RB_MAXIMIZEBAND
, 2, FALSE
);
578 SendMessageA(hRebar
, RB_MINIMIZEBAND
, 2, 0);
580 SendMessageA(hRebar
, RB_MINIMIZEBAND
, 0, 0);
583 /* an image will increase the band height */
584 himl
= pImageList_LoadImageA(GetModuleHandleA("comctl32"), MAKEINTRESOURCEA(121), 24, 2,
585 CLR_NONE
, IMAGE_BITMAP
, LR_DEFAULTCOLOR
);
586 ri
.cbSize
= sizeof(ri
);
587 ri
.fMask
= RBIM_IMAGELIST
;
589 ok(SendMessageA(hRebar
, RB_SETBARINFO
, 0, (LPARAM
)&ri
), "RB_SETBARINFO failed\n");
590 rbi
.fMask
= RBBIM_IMAGE
;
592 SendMessageA(hRebar
, RB_SETBANDINFOA
, 1, (LPARAM
)&rbi
);
595 /* after removing it everything is back to normal*/
597 SendMessageA(hRebar
, RB_SETBANDINFOA
, 1, (LPARAM
)&rbi
);
600 /* Only -1 means that the image is not present. Other invalid values increase the height */
602 SendMessageA(hRebar
, RB_SETBANDINFOA
, 1, (LPARAM
)&rbi
);
605 DestroyWindow(hRebar
);
607 /* VARHEIGHT resizing test on a horizontal rebar */
608 hRebar
= create_rebar_control();
609 SetWindowLongA(hRebar
, GWL_STYLE
, GetWindowLongA(hRebar
, GWL_STYLE
) | RBS_AUTOSIZE
);
611 rbi
.fMask
= RBBIM_CHILD
| RBBIM_CHILDSIZE
| RBBIM_SIZE
| RBBIM_STYLE
;
612 rbi
.fStyle
= RBBS_VARIABLEHEIGHT
;
617 rbi
.cyMaxChild
= 200;
619 rbi
.hwndChild
= build_toolbar(0, hRebar
);
620 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
623 rbi
.hwndChild
= build_toolbar(0, hRebar
);
624 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
629 rbi
.hwndChild
= build_toolbar(0, hRebar
);
630 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
633 DestroyWindow(hRebar
);
635 /* VARHEIGHT resizing on a vertical rebar */
636 hRebar
= create_rebar_control();
637 SetWindowLongA(hRebar
, GWL_STYLE
, GetWindowLongA(hRebar
, GWL_STYLE
) | CCS_VERT
| RBS_AUTOSIZE
);
639 rbi
.fMask
= RBBIM_CHILD
| RBBIM_CHILDSIZE
| RBBIM_SIZE
| RBBIM_STYLE
;
640 rbi
.fStyle
= RBBS_VARIABLEHEIGHT
;
647 rbi
.hwndChild
= build_toolbar(0, hRebar
);
648 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
652 rbi
.hwndChild
= build_toolbar(0, hRebar
);
653 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
659 rbi
.hwndChild
= build_toolbar(0, hRebar
);
660 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
663 rbsize_results_free();
664 DestroyWindow(hRebar
);
665 pImageList_Destroy(himl
);
668 #if 0 /* use this to generate more tests */
670 static void dump_client(HWND hRebar
)
674 GetWindowRect(hRebar
, &r
);
675 MapWindowPoints(HWND_DESKTOP
, hMainWnd
, &r
, 2);
676 if (height_change_notify_rect
.top
!= -1)
679 GetClientRect(hRebar
, &rcClient
);
680 assert(EqualRect(&rcClient
, &height_change_notify_rect
));
685 printf(" {{%d, %d, %d, %d}, %d, %s},\n", r
.left
, r
.top
, r
.right
, r
.bottom
, SendMessageA(hRebar
, RB_GETROWCOUNT
, 0, 0),
686 notify
? "TRUE" : "FALSE");
687 SetRect(&height_change_notify_rect
, -1, -1, -1, -1);
690 #define comment(fmt, arg1) printf("/* " fmt " */\n", arg1);
691 #define check_client() dump_client(hRebar)
699 } rbresize_test_result_t
;
701 static const rbresize_test_result_t resize_results
[] = {
703 {{0, 2, 672, 2}, 0, FALSE
},
704 {{0, 2, 672, 22}, 1, TRUE
},
705 {{0, 2, 672, 22}, 1, FALSE
},
706 {{0, 2, 672, 22}, 1, FALSE
},
707 {{0, 2, 672, 22}, 1, FALSE
},
708 {{0, 2, 672, 22}, 0, FALSE
},
710 {{0, 0, 672, 0}, 0, FALSE
},
711 {{0, 0, 672, 20}, 1, TRUE
},
712 {{0, 0, 672, 20}, 1, FALSE
},
713 {{0, 0, 672, 20}, 1, FALSE
},
714 {{0, 0, 672, 20}, 1, FALSE
},
715 {{0, 0, 672, 20}, 0, FALSE
},
717 {{0, 226, 672, 226}, 0, FALSE
},
718 {{0, 206, 672, 226}, 1, TRUE
},
719 {{0, 206, 672, 226}, 1, FALSE
},
720 {{0, 206, 672, 226}, 1, FALSE
},
721 {{0, 206, 672, 226}, 1, FALSE
},
722 {{0, 206, 672, 226}, 0, FALSE
},
724 {{0, 226, 672, 226}, 0, FALSE
},
725 {{0, 206, 672, 226}, 1, TRUE
},
726 {{0, 206, 672, 226}, 1, FALSE
},
727 {{0, 206, 672, 226}, 1, FALSE
},
728 {{0, 206, 672, 226}, 1, FALSE
},
729 {{0, 206, 672, 226}, 0, FALSE
},
731 {{2, 0, 2, 226}, 0, FALSE
},
732 {{2, 0, 22, 226}, 1, TRUE
},
733 {{2, 0, 22, 226}, 1, FALSE
},
734 {{2, 0, 22, 226}, 1, FALSE
},
735 {{2, 0, 22, 226}, 1, FALSE
},
736 {{2, 0, 22, 226}, 0, FALSE
},
738 {{672, 0, 672, 226}, 0, FALSE
},
739 {{652, 0, 672, 226}, 1, TRUE
},
740 {{652, 0, 672, 226}, 1, FALSE
},
741 {{652, 0, 672, 226}, 1, FALSE
},
742 {{652, 0, 672, 226}, 1, FALSE
},
743 {{652, 0, 672, 226}, 0, FALSE
},
745 {{10, 11, 510, 11}, 0, FALSE
},
746 {{10, 15, 510, 35}, 1, TRUE
},
747 {{10, 17, 510, 37}, 1, FALSE
},
748 {{10, 14, 110, 54}, 2, TRUE
},
749 {{0, 4, 0, 44}, 2, FALSE
},
750 {{0, 6, 0, 46}, 2, FALSE
},
751 {{0, 8, 0, 48}, 2, FALSE
},
752 {{0, 12, 0, 32}, 1, TRUE
},
753 {{0, 4, 100, 24}, 0, FALSE
},
755 {{10, 5, 510, 5}, 0, FALSE
},
756 {{10, 5, 510, 25}, 1, TRUE
},
757 {{10, 5, 510, 25}, 1, FALSE
},
758 {{10, 10, 110, 50}, 2, TRUE
},
759 {{0, 0, 0, 40}, 2, FALSE
},
760 {{0, 0, 0, 40}, 2, FALSE
},
761 {{0, 0, 0, 40}, 2, FALSE
},
762 {{0, 0, 0, 20}, 1, TRUE
},
763 {{0, 0, 100, 20}, 0, FALSE
},
765 {{10, 5, 510, 20}, 0, FALSE
},
766 {{10, 5, 510, 20}, 1, TRUE
},
767 {{10, 10, 110, 110}, 2, TRUE
},
768 {{0, 0, 0, 0}, 2, FALSE
},
769 {{0, 0, 0, 0}, 2, FALSE
},
770 {{0, 0, 0, 0}, 2, FALSE
},
771 {{0, 0, 0, 0}, 1, TRUE
},
772 {{0, 0, 100, 100}, 0, FALSE
},
774 {{0, 5, 672, 5}, 0, FALSE
},
775 {{0, 5, 672, 25}, 1, TRUE
},
776 {{0, 10, 672, 30}, 1, FALSE
},
777 {{0, 0, 672, 20}, 1, FALSE
},
778 {{0, 0, 672, 20}, 1, FALSE
},
779 {{0, 0, 672, 20}, 0, FALSE
},
781 {{10, 0, 10, 226}, 0, FALSE
},
782 {{10, 0, 30, 226}, 1, TRUE
},
783 {{10, 0, 30, 226}, 1, FALSE
},
784 {{0, 0, 20, 226}, 1, FALSE
},
785 {{0, 0, 20, 226}, 1, FALSE
},
786 {{0, 0, 20, 226}, 0, FALSE
},
788 {{-2, 0, 674, 4}, 0, FALSE
},
789 {{-2, 0, 674, 24}, 1, TRUE
},
790 {{-2, 0, 674, 24}, 1, FALSE
},
791 {{-2, 0, 674, 24}, 1, FALSE
},
792 {{-2, 0, 674, 24}, 1, FALSE
},
793 {{-2, 0, 674, 24}, 0, FALSE
},
795 {{10, 5, 510, 9}, 0, FALSE
},
796 {{10, 5, 510, 29}, 1, TRUE
},
797 {{10, 5, 510, 29}, 1, FALSE
},
798 {{10, 10, 110, 54}, 2, TRUE
},
799 {{0, 0, 0, 44}, 2, FALSE
},
800 {{0, 0, 0, 44}, 2, FALSE
},
801 {{0, 0, 0, 44}, 2, FALSE
},
802 {{0, 0, 0, 24}, 1, TRUE
},
803 {{0, 0, 100, 24}, 0, FALSE
},
805 {{10, 5, 510, 20}, 0, FALSE
},
806 {{10, 5, 510, 20}, 1, TRUE
},
807 {{10, 10, 110, 110}, 2, TRUE
},
808 {{0, 0, 0, 0}, 2, FALSE
},
809 {{0, 0, 0, 0}, 2, FALSE
},
810 {{0, 0, 0, 0}, 2, FALSE
},
811 {{0, 0, 0, 0}, 1, TRUE
},
812 {{0, 0, 100, 100}, 0, FALSE
},
814 {{-2, 5, 674, 9}, 0, FALSE
},
815 {{-2, 5, 674, 29}, 1, TRUE
},
816 {{-2, 10, 674, 34}, 1, FALSE
},
817 {{-2, 0, 674, 24}, 1, FALSE
},
818 {{-2, 0, 674, 24}, 1, FALSE
},
819 {{-2, 0, 674, 24}, 0, FALSE
},
822 static DWORD resize_numtests
= 0;
824 #define comment(fmt, arg1)
825 #define check_client() { \
828 const rbresize_test_result_t *res = &resize_results[resize_numtests++]; \
829 assert(resize_numtests <= sizeof(resize_results)/sizeof(resize_results[0])); \
830 GetWindowRect(hRebar, &r); \
831 MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); \
832 if ((dwStyles[i] & (CCS_NOPARENTALIGN|CCS_NODIVIDER)) == CCS_NOPARENTALIGN) {\
833 check_rect_no_top("client", r, res->rc); /* the top coordinate changes after every layout and is very implementation-dependent */ \
835 check_rect("client", r, res->rc); \
837 value = (int)SendMessageA(hRebar, RB_GETROWCOUNT, 0, 0); \
838 ok(res->iNumRows == value, "RB_GETROWCOUNT expected %d got %d\n", res->iNumRows, value); \
839 if (res->heightNotify) { \
841 GetClientRect(hRebar, &rcClient); \
842 check_rect("notify", height_change_notify_rect, rcClient); \
843 } else ok(height_change_notify_rect.top == -1, "Unexpected RBN_HEIGHTCHANGE received\n"); \
844 SetRect(&height_change_notify_rect, -1, -1, -1, -1); \
849 static void test_resize(void)
851 DWORD dwStyles
[] = {CCS_TOP
, CCS_TOP
| CCS_NODIVIDER
, CCS_BOTTOM
, CCS_BOTTOM
| CCS_NODIVIDER
, CCS_VERT
, CCS_RIGHT
,
852 CCS_NOPARENTALIGN
, CCS_NOPARENTALIGN
| CCS_NODIVIDER
, CCS_NORESIZE
, CCS_NOMOVEY
, CCS_NOMOVEY
| CCS_VERT
,
853 CCS_TOP
| WS_BORDER
, CCS_NOPARENTALIGN
| CCS_NODIVIDER
| WS_BORDER
, CCS_NORESIZE
| WS_BORDER
,
854 CCS_NOMOVEY
| WS_BORDER
};
856 const int styles_count
= sizeof(dwStyles
) / sizeof(dwStyles
[0]);
859 for (i
= 0; i
< styles_count
; i
++)
863 comment("style %08x", dwStyles
[i
]);
864 SetRect(&height_change_notify_rect
, -1, -1, -1, -1);
865 hRebar
= CreateWindowA(REBARCLASSNAMEA
, "A", dwStyles
[i
] | WS_CHILD
| WS_VISIBLE
, 10, 5, 500, 15, hMainWnd
, NULL
, GetModuleHandleA(NULL
), 0);
867 add_band_w(hRebar
, NULL
, 70, 100, 0);
868 if (dwStyles
[i
] & CCS_NOPARENTALIGN
) /* the window drifts downward for CCS_NOPARENTALIGN without CCS_NODIVIDER */
870 add_band_w(hRebar
, NULL
, 70, 100, 0);
872 MoveWindow(hRebar
, 10, 10, 100, 100, TRUE
);
874 MoveWindow(hRebar
, 0, 0, 0, 0, TRUE
);
876 /* try to fool the rebar by sending invalid width/height - won't work */
877 if (dwStyles
[i
] & (CCS_NORESIZE
| CCS_NOPARENTALIGN
))
881 pos
.hwndInsertAfter
= NULL
;
887 SendMessageA(hRebar
, WM_WINDOWPOSCHANGING
, 0, (LPARAM
)&pos
);
888 SendMessageA(hRebar
, WM_WINDOWPOSCHANGED
, 0, (LPARAM
)&pos
);
890 SendMessageA(hRebar
, WM_SIZE
, SIZE_RESTORED
, MAKELONG(500, 500));
893 SendMessageA(hRebar
, RB_DELETEBAND
, 0, 0);
895 SendMessageA(hRebar
, RB_DELETEBAND
, 0, 0);
896 MoveWindow(hRebar
, 0, 0, 100, 100, TRUE
);
898 DestroyWindow(hRebar
);
902 static void expect_band_content_(int line
, HWND hRebar
, UINT uBand
, INT fStyle
, COLORREF clrFore
,
903 COLORREF clrBack
, LPCSTR lpText
, int iImage
, HWND hwndChild
,
904 INT cxMinChild
, INT cyMinChild
, INT cx
, HBITMAP hbmBack
, INT wID
,
905 INT cyChild
, INT cyMaxChild
, INT cyIntegral
, INT cxIdeal
, LPARAM lParam
,
906 UINT cxHeader
, UINT cxHeader_broken
)
908 CHAR buf
[MAX_PATH
] = "abc";
911 memset(&rb
, 0xdd, sizeof(rb
));
912 rb
.cbSize
= REBARBANDINFOA_V6_SIZE
;
913 rb
.fMask
= RBBIM_BACKGROUND
| RBBIM_CHILD
| RBBIM_CHILDSIZE
| RBBIM_COLORS
914 | RBBIM_HEADERSIZE
| RBBIM_ID
| RBBIM_IDEALSIZE
| RBBIM_IMAGE
| RBBIM_LPARAM
915 | RBBIM_SIZE
| RBBIM_STYLE
| RBBIM_TEXT
;
918 ok(SendMessageA(hRebar
, RB_GETBANDINFOA
, uBand
, (LPARAM
)&rb
), "RB_GETBANDINFOA failed from line %d\n", line
);
919 expect_eq(line
, rb
.fStyle
, fStyle
, int, "%x");
920 expect_eq(line
, rb
.clrFore
, clrFore
, COLORREF
, "%x");
921 expect_eq(line
, rb
.clrBack
, clrBack
, COLORREF
, "%x");
922 expect_eq(line
, strcmp(rb
.lpText
, lpText
), 0, int, "%d");
923 expect_eq(line
, rb
.iImage
, iImage
, int, "%x");
924 expect_eq(line
, rb
.hwndChild
, hwndChild
, HWND
, "%p");
925 expect_eq(line
, rb
.cxMinChild
, cxMinChild
, int, "%d");
926 expect_eq(line
, rb
.cyMinChild
, cyMinChild
, int, "%d");
927 expect_eq(line
, rb
.cx
, cx
, int, "%d");
928 expect_eq(line
, rb
.hbmBack
, hbmBack
, HBITMAP
, "%p");
929 expect_eq(line
, rb
.wID
, wID
, int, "%d");
930 /* the values of cyChild, cyMaxChild and cyIntegral can't be read unless the band is RBBS_VARIABLEHEIGHT */
931 expect_eq(line
, rb
.cyChild
, cyChild
, int, "%x");
932 expect_eq(line
, rb
.cyMaxChild
, cyMaxChild
, int, "%x");
933 expect_eq(line
, rb
.cyIntegral
, cyIntegral
, int, "%x");
934 expect_eq(line
, rb
.cxIdeal
, cxIdeal
, int, "%d");
935 expect_eq(line
, rb
.lParam
, lParam
, LPARAM
, "%ld");
936 ok(rb
.cxHeader
== cxHeader
|| rb
.cxHeader
== cxHeader
+ 1 || broken(rb
.cxHeader
== cxHeader_broken
),
937 "expected %d for %d from line %d\n", cxHeader
, rb
.cxHeader
, line
);
940 #define expect_band_content(hRebar, uBand, fStyle, clrFore, clrBack,\
941 lpText, iImage, hwndChild, cxMinChild, cyMinChild, cx, hbmBack, wID,\
942 cyChild, cyMaxChild, cyIntegral, cxIdeal, lParam, cxHeader, cxHeader_broken) \
943 expect_band_content_(__LINE__, hRebar, uBand, fStyle, clrFore, clrBack,\
944 lpText, iImage, hwndChild, cxMinChild, cyMinChild, cx, hbmBack, wID,\
945 cyChild, cyMaxChild, cyIntegral, cxIdeal, lParam, cxHeader, cxHeader_broken)
947 static void test_bandinfo(void)
950 CHAR szABC
[] = "ABC";
951 CHAR szABCD
[] = "ABCD";
954 hRebar
= create_rebar_control();
955 rb
.cbSize
= REBARBANDINFOA_V6_SIZE
;
957 if (!SendMessageA(hRebar
, RB_INSERTBANDA
, 0, (LPARAM
)&rb
))
959 win_skip( "V6 info not supported\n" );
960 DestroyWindow(hRebar
);
963 expect_band_content(hRebar
, 0, 0, 0, GetSysColor(COLOR_3DFACE
), "", -1, NULL
, 0, 0, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 0, -1);
965 rb
.fMask
= RBBIM_CHILDSIZE
;
971 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
972 expect_band_content(hRebar
, 0, 0, 0, GetSysColor(COLOR_3DFACE
), "", -1, NULL
, 15, 20, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 0, -1);
974 rb
.fMask
= RBBIM_TEXT
;
976 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
977 expect_band_content(hRebar
, 0, 0, 0, GetSysColor(COLOR_3DFACE
), "ABC", -1, NULL
, 15, 20, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 3 + 2*system_font_height
, -1);
979 rb
.cbSize
= REBARBANDINFOA_V6_SIZE
;
981 ok(SendMessageA(hRebar
, RB_INSERTBANDA
, 1, (LPARAM
)&rb
), "RB_INSERTBANDA failed\n");
982 expect_band_content(hRebar
, 1, 0, 0, GetSysColor(COLOR_3DFACE
), "", -1, NULL
, 0, 0, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 9, -1);
983 expect_band_content(hRebar
, 0, 0, 0, GetSysColor(COLOR_3DFACE
), "ABC", -1, NULL
, 15, 20, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 8 + 2*system_font_height
, -1);
985 rb
.fMask
= RBBIM_HEADERSIZE
;
987 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
988 expect_band_content(hRebar
, 0, 0x40000000, 0, GetSysColor(COLOR_3DFACE
), "ABC", -1, NULL
, 15, 20, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 50, -1);
991 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
992 expect_band_content(hRebar
, 0, 0x40000000, 0, GetSysColor(COLOR_3DFACE
), "ABC", -1, NULL
, 15, 20, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 5, -1);
994 rb
.fMask
= RBBIM_TEXT
;
996 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
997 expect_band_content(hRebar
, 0, 0x40000000, 0, GetSysColor(COLOR_3DFACE
), "ABCD", -1, NULL
, 15, 20, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 5, -1);
998 rb
.fMask
= RBBIM_STYLE
| RBBIM_TEXT
;
999 rb
.fStyle
= RBBS_VARIABLEHEIGHT
;
1001 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
1002 expect_band_content(hRebar
, 0, RBBS_VARIABLEHEIGHT
, 0, GetSysColor(COLOR_3DFACE
), "ABC", -1, NULL
, 15, 20, 0, NULL
, 0, 20, 0x7fffffff, 0, 0, 0, 8 + 2*system_font_height
, 5);
1004 DestroyWindow(hRebar
);
1007 static void test_colors(void)
1015 hRebar
= create_rebar_control();
1017 /* test default colors */
1018 clr
= SendMessageA(hRebar
, RB_GETTEXTCOLOR
, 0, 0);
1019 compare(clr
, CLR_NONE
, "%x");
1020 clr
= SendMessageA(hRebar
, RB_GETBKCOLOR
, 0, 0);
1021 compare(clr
, CLR_NONE
, "%x");
1023 scheme
.dwSize
= sizeof(scheme
);
1024 scheme
.clrBtnHighlight
= 0;
1025 scheme
.clrBtnShadow
= 0;
1026 ret
= SendMessageA(hRebar
, RB_GETCOLORSCHEME
, 0, (LPARAM
)&scheme
);
1029 compare(scheme
.clrBtnHighlight
, CLR_DEFAULT
, "%x");
1030 compare(scheme
.clrBtnShadow
, CLR_DEFAULT
, "%x");
1033 skip("RB_GETCOLORSCHEME not supported\n");
1035 /* check default band colors */
1036 add_band_w(hRebar
, "", 0, 10, 10);
1037 bi
.cbSize
= REBARBANDINFOA_V6_SIZE
;
1038 bi
.fMask
= RBBIM_COLORS
;
1039 bi
.clrFore
= bi
.clrBack
= 0xc0ffe;
1040 ret
= SendMessageA(hRebar
, RB_GETBANDINFOA
, 0, (LPARAM
)&bi
);
1041 ok(ret
, "RB_GETBANDINFOA failed\n");
1042 compare(bi
.clrFore
, RGB(0, 0, 0), "%x");
1043 compare(bi
.clrBack
, GetSysColor(COLOR_3DFACE
), "%x");
1045 SendMessageA(hRebar
, RB_SETTEXTCOLOR
, 0, RGB(255, 0, 0));
1046 bi
.clrFore
= bi
.clrBack
= 0xc0ffe;
1047 ret
= SendMessageA(hRebar
, RB_GETBANDINFOA
, 0, (LPARAM
)&bi
);
1048 ok(ret
, "RB_GETBANDINFOA failed\n");
1049 compare(bi
.clrFore
, RGB(0, 0, 0), "%x");
1051 DestroyWindow(hRebar
);
1055 static BOOL
register_parent_wnd_class(void)
1059 wc
.style
= CS_HREDRAW
| CS_VREDRAW
;
1062 wc
.hInstance
= GetModuleHandleA(NULL
);
1064 wc
.hCursor
= LoadCursorA(NULL
, (LPCSTR
)IDC_IBEAM
);
1065 wc
.hbrBackground
= GetSysColorBrush(COLOR_WINDOW
);
1066 wc
.lpszMenuName
= NULL
;
1067 wc
.lpszClassName
= "MyTestWnd";
1068 wc
.lpfnWndProc
= parent_wndproc
;
1070 return RegisterClassA(&wc
);
1073 static HWND
create_parent_window(void)
1077 if (!register_parent_wnd_class()) return NULL
;
1079 hwnd
= CreateWindowExA(0, "MyTestWnd", "Blah", WS_OVERLAPPEDWINDOW
,
1080 CW_USEDEFAULT
, CW_USEDEFAULT
, 672+2*GetSystemMetrics(SM_CXSIZEFRAME
),
1081 226+GetSystemMetrics(SM_CYCAPTION
)+2*GetSystemMetrics(SM_CYSIZEFRAME
),
1082 NULL
, NULL
, GetModuleHandleA(NULL
), 0);
1084 ShowWindow(hwnd
, SW_SHOW
);
1088 static void test_showband(void)
1094 hRebar
= create_rebar_control();
1097 ret
= SendMessageA(hRebar
, RB_SHOWBAND
, 0, TRUE
);
1098 ok(ret
== FALSE
, "got %d\n", ret
);
1100 rbi
.cbSize
= REBARBANDINFOA_V6_SIZE
;
1101 rbi
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_CHILD
;
1103 rbi
.cxMinChild
= 100;
1104 rbi
.cyMinChild
= 30;
1105 rbi
.hwndChild
= NULL
;
1106 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
1108 /* index out of range */
1109 ret
= SendMessageA(hRebar
, RB_SHOWBAND
, 1, TRUE
);
1110 ok(ret
== FALSE
, "got %d\n", ret
);
1112 ret
= SendMessageA(hRebar
, RB_SHOWBAND
, 0, TRUE
);
1113 ok(ret
== TRUE
, "got %d\n", ret
);
1115 DestroyWindow(hRebar
);
1118 static void test_notification(void)
1120 MEASUREITEMSTRUCT mis
;
1123 rebar
= create_rebar_control();
1125 g_parent_measureitem
= 0;
1126 SendMessageA(rebar
, WM_MEASUREITEM
, 0, (LPARAM
)&mis
);
1127 ok(g_parent_measureitem
== 1, "got %d\n", g_parent_measureitem
);
1129 DestroyWindow(rebar
);
1132 static void init_functions(void)
1134 HMODULE hComCtl32
= LoadLibraryA("comctl32.dll");
1136 #define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f);
1137 X(ImageList_Destroy
);
1138 X(ImageList_LoadImageA
);
1146 init_system_font_height();
1149 hMainWnd
= create_parent_window();
1154 test_notification();
1156 if(!is_font_installed("System") || !is_font_installed("Tahoma"))
1158 skip("Missing System or Tahoma font\n");
1167 while(GetMessageA(&msg
,0,0,0)) {
1168 TranslateMessage(&msg
);
1169 DispatchMessageA(&msg
);
1171 DestroyWindow(hMainWnd
);