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/test.h"
33 static RECT height_change_notify_rect
;
35 static int system_font_height
;
38 #define check_rect(name, val, exp) ok(val.top == exp.top && val.bottom == exp.bottom && \
39 val.left == exp.left && val.right == exp.right, "invalid rect (" name ") (%d,%d) (%d,%d) - expected (%d,%d) (%d,%d)\n", \
40 val.left, val.top, val.right, val.bottom, exp.left, exp.top, exp.right, exp.bottom);
42 #define check_rect_no_top(name, val, exp) { \
43 ok((val.bottom - val.top == exp.bottom - exp.top) && \
44 val.left == exp.left && val.right == exp.right, "invalid rect (" name ") (%d,%d) (%d,%d) - expected (%d,%d) (%d,%d), ignoring top\n", \
45 val.left, val.top, val.right, val.bottom, exp.left, exp.top, exp.right, exp.bottom); \
48 #define compare(val, exp, format) ok((val) == (exp), #val " value " format " expected " format "\n", (val), (exp));
50 #define expect_eq(line, expr, value, type, format) { type ret = expr;\
51 ok((value) == ret, #expr " expected " format " got " format " from line %d\n", (value), (ret), line); }
53 static INT CALLBACK
is_font_installed_proc(const LOGFONTA
*elf
, const TEXTMETRICA
*ntm
, DWORD type
, LPARAM lParam
)
58 static BOOL
is_font_installed(const char *name
)
63 if(!EnumFontFamiliesA(hdc
, name
, is_font_installed_proc
, 0))
70 static void init_system_font_height(void) {
74 hDC
= CreateCompatibleDC(NULL
);
75 GetTextMetricsA(hDC
, &tm
);
78 system_font_height
= tm
.tmHeight
;
81 static HWND
create_rebar_control(void)
85 hwnd
= CreateWindowA(REBARCLASSNAMEA
, NULL
, WS_CHILD
| WS_VISIBLE
, 0, 0, 0, 0,
86 hMainWnd
, (HMENU
)17, GetModuleHandleA(NULL
), NULL
);
87 ok(hwnd
!= NULL
, "Failed to create Rebar\n");
89 SendMessageA(hwnd
, WM_SETFONT
, (WPARAM
)GetStockObject(SYSTEM_FONT
), 0);
94 static HWND
build_toolbar(int nr
, HWND hParent
)
97 HWND hToolbar
= CreateWindowExA(0, TOOLBARCLASSNAMEA
, NULL
, WS_CHILD
| WS_VISIBLE
| CCS_NORESIZE
, 0, 0, 0, 0,
98 hParent
, (HMENU
)5, GetModuleHandleA(NULL
), NULL
);
102 ok(hToolbar
!= NULL
, "Toolbar creation problem\n");
103 ok(SendMessageA(hToolbar
, TB_BUTTONSTRUCTSIZE
, sizeof(TBBUTTON
), 0) == 0, "TB_BUTTONSTRUCTSIZE failed\n");
104 ok(SendMessageA(hToolbar
, TB_AUTOSIZE
, 0, 0) == 0, "TB_AUTOSIZE failed\n");
105 ok(SendMessageA(hToolbar
, WM_SETFONT
, (WPARAM
)GetStockObject(SYSTEM_FONT
), 0)==1, "WM_SETFONT\n");
107 for (i
=0; i
<5+nr
; i
++)
110 btns
[i
].idCommand
= i
;
111 btns
[i
].fsStyle
= BTNS_BUTTON
;
112 btns
[i
].fsState
= TBSTATE_ENABLED
;
118 case 0: iBitmapId
= IDB_HIST_SMALL_COLOR
; break;
119 case 1: iBitmapId
= IDB_VIEW_SMALL_COLOR
; break;
120 case 2: iBitmapId
= IDB_STD_SMALL_COLOR
; break;
122 ok(SendMessageA(hToolbar
, TB_LOADIMAGES
, iBitmapId
, (LPARAM
)HINST_COMMCTRL
) == 0, "TB_LOADIMAGES failed\n");
123 ok(SendMessageA(hToolbar
, TB_ADDBUTTONSA
, 5+nr
, (LPARAM
)btns
), "TB_ADDBUTTONSA failed\n");
127 static int g_parent_measureitem
;
129 static LRESULT CALLBACK
parent_wndproc(HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
135 NMHDR
*lpnm
= (NMHDR
*)lParam
;
136 if (lpnm
->code
== RBN_HEIGHTCHANGE
)
137 GetClientRect(lpnm
->hwndFrom
, &height_change_notify_rect
);
141 g_parent_measureitem
++;
144 return DefWindowProcA(hWnd
, msg
, wParam
, lParam
);
147 #if 0 /* use this to generate more tests*/
149 static void dump_sizes(HWND hRebar
)
156 GetClientRect(hRebar
, &r
);
157 count
= SendMessageA(hRebar
, RB_GETROWCOUNT
, 0, 0);
158 printf(" { {%d, %d, %d, %d}, %d, %d, {", r
.left
, r
.top
, r
.right
, r
.bottom
,
159 SendMessageA(hRebar
, RB_GETBARHEIGHT
, 0, 0), count
);
162 for (i
= 0; i
< count
; i
++) /* rows */
163 printf("%d, ", SendMessageA(hRebar
, RB_GETROWHEIGHT
, i
, 0));
166 count
= SendMessageA(hRebar
, RB_GETBANDCOUNT
, 0, 0);
167 printf("%d, {", count
);
169 printf("{{0, 0, 0, 0}, 0, 0},");
170 for (i
=0; i
<count
; i
++)
173 rbi
.cbSize
= REBARBANDINFOA_V6_SIZE
;
174 rbi
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_STYLE
;
175 ok(SendMessageA(hRebar
, RB_GETBANDINFOA
, i
, (LPARAM
)&rbi
), "RB_GETBANDINFOA failed\n");
176 ok(SendMessageA(hRebar
, RB_GETRECT
, i
, (LPARAM
)&r
), "RB_GETRECT failed\n");
177 printf("%s{ {%3d, %3d, %3d, %3d}, 0x%02x, %d}, ", (i
%2==0 ? "\n " : ""), r
.left
, r
.top
, r
.right
, r
.bottom
,
180 printf("\n }, },\n");
183 #define check_sizes() dump_sizes(hRebar);
184 #define check_sizes_todo(todomask) dump_sizes(hRebar);
188 static int string_width(const CHAR
*s
) {
192 hdc
= CreateCompatibleDC(NULL
);
193 GetTextExtentPoint32A(hdc
, s
, strlen(s
), &sz
);
211 rbband_result_t
*bands
;
214 static rbsize_result_t
rbsize_init(int cleft
, int ctop
, int cright
, int cbottom
, int cyBarHeight
, int nRows
, int nBands
)
218 SetRect(&ret
.rcClient
, cleft
, ctop
, cright
, cbottom
);
219 ret
.cyBarHeight
= cyBarHeight
;
221 ret
.cyRowHeights
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, nRows
*sizeof(int));
223 ret
.bands
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, nBands
*sizeof(rbband_result_t
));
228 static void rbsize_add_row(rbsize_result_t
*rbsr
, int rowHeight
) {
229 rbsr
->cyRowHeights
[rbsr
->nRows
] = rowHeight
;
233 static void rbsize_add_band(rbsize_result_t
*rbsr
, int left
, int top
, int right
, int bottom
, DWORD fStyle
, UINT cx
)
235 SetRect(&(rbsr
->bands
[rbsr
->nBands
].rc
), left
, top
, right
, bottom
);
236 rbsr
->bands
[rbsr
->nBands
].fStyle
= fStyle
;
237 rbsr
->bands
[rbsr
->nBands
].cx
= cx
;
241 static rbsize_result_t
*rbsize_results
;
243 #define rbsize_results_num 27
245 static void rbsize_results_init(void)
247 rbsize_results
= HeapAlloc(GetProcessHeap(), 0, rbsize_results_num
*sizeof(rbsize_result_t
));
249 rbsize_results
[0] = rbsize_init(0, 0, 672, 0, 0, 0, 0);
251 rbsize_results
[1] = rbsize_init(0, 0, 672, 4, 4, 1, 1);
252 rbsize_add_row(&rbsize_results
[1], 4);
253 rbsize_add_band(&rbsize_results
[1], 0, 0, 672, 4, 0x00, 200);
255 rbsize_results
[2] = rbsize_init(0, 0, 672, 4, 4, 1, 2);
256 rbsize_add_row(&rbsize_results
[2], 4);
257 rbsize_add_band(&rbsize_results
[2], 0, 0, 200, 4, 0x00, 200);
258 rbsize_add_band(&rbsize_results
[2], 200, 0, 672, 4, 0x04, 200);
260 rbsize_results
[3] = rbsize_init(0, 0, 672, 30, 30, 1, 3);
261 rbsize_add_row(&rbsize_results
[3], 30);
262 rbsize_add_band(&rbsize_results
[3], 0, 0, 200, 30, 0x00, 200);
263 rbsize_add_band(&rbsize_results
[3], 200, 0, 400, 30, 0x04, 200);
264 rbsize_add_band(&rbsize_results
[3], 400, 0, 672, 30, 0x00, 200);
266 rbsize_results
[4] = rbsize_init(0, 0, 672, 34, 34, 1, 4);
267 rbsize_add_row(&rbsize_results
[4], 34);
268 rbsize_add_band(&rbsize_results
[4], 0, 0, 200, 34, 0x00, 200);
269 rbsize_add_band(&rbsize_results
[4], 200, 0, 400, 34, 0x04, 200);
270 rbsize_add_band(&rbsize_results
[4], 400, 0, 604, 34, 0x00, 200);
271 rbsize_add_band(&rbsize_results
[4], 604, 0, 672, 34, 0x04, 68);
273 rbsize_results
[5] = rbsize_init(0, 0, 672, 34, 34, 1, 4);
274 rbsize_add_row(&rbsize_results
[5], 34);
275 rbsize_add_band(&rbsize_results
[5], 0, 0, 200, 34, 0x00, 200);
276 rbsize_add_band(&rbsize_results
[5], 200, 0, 400, 34, 0x04, 200);
277 rbsize_add_band(&rbsize_results
[5], 400, 0, 604, 34, 0x00, 200);
278 rbsize_add_band(&rbsize_results
[5], 604, 0, 672, 34, 0x04, 68);
280 rbsize_results
[6] = rbsize_init(0, 0, 672, 34, 34, 1, 4);
281 rbsize_add_row(&rbsize_results
[6], 34);
282 rbsize_add_band(&rbsize_results
[6], 0, 0, 200, 34, 0x00, 200);
283 rbsize_add_band(&rbsize_results
[6], 202, 0, 402, 34, 0x04, 200);
284 rbsize_add_band(&rbsize_results
[6], 404, 0, 604, 34, 0x00, 200);
285 rbsize_add_band(&rbsize_results
[6], 606, 0, 672, 34, 0x04, 66);
287 rbsize_results
[7] = rbsize_init(0, 0, 672, 70, 70, 2, 5);
288 rbsize_add_row(&rbsize_results
[7], 34);
289 rbsize_add_row(&rbsize_results
[7], 34);
290 rbsize_add_band(&rbsize_results
[7], 0, 0, 142, 34, 0x00, 200);
291 rbsize_add_band(&rbsize_results
[7], 144, 0, 557, 34, 0x00, 200);
292 rbsize_add_band(&rbsize_results
[7], 559, 0, 672, 34, 0x04, 200);
293 rbsize_add_band(&rbsize_results
[7], 0, 36, 200, 70, 0x00, 200);
294 rbsize_add_band(&rbsize_results
[7], 202, 36, 672, 70, 0x04, 66);
296 rbsize_results
[8] = rbsize_init(0, 0, 672, 34, 34, 1, 5);
297 rbsize_add_row(&rbsize_results
[8], 34);
298 rbsize_add_band(&rbsize_results
[8], 0, 0, 167, 34, 0x00, 200);
299 rbsize_add_band(&rbsize_results
[8], 169, 0, 582, 34, 0x00, 200);
300 rbsize_add_band(&rbsize_results
[8], 559, 0, 759, 34, 0x08, 200);
301 rbsize_add_band(&rbsize_results
[8], 584, 0, 627, 34, 0x00, 200);
302 rbsize_add_band(&rbsize_results
[8], 629, 0, 672, 34, 0x04, 66);
304 rbsize_results
[9] = rbsize_init(0, 0, 672, 34, 34, 1, 4);
305 rbsize_add_row(&rbsize_results
[9], 34);
306 rbsize_add_band(&rbsize_results
[9], 0, 0, 167, 34, 0x00, 200);
307 rbsize_add_band(&rbsize_results
[9], 169, 0, 582, 34, 0x00, 200);
308 rbsize_add_band(&rbsize_results
[9], 584, 0, 627, 34, 0x00, 200);
309 rbsize_add_band(&rbsize_results
[9], 629, 0, 672, 34, 0x04, 66);
311 rbsize_results
[10] = rbsize_init(0, 0, 672, 34, 34, 1, 3);
312 rbsize_add_row(&rbsize_results
[10], 34);
313 rbsize_add_band(&rbsize_results
[10], 0, 0, 413, 34, 0x00, 200);
314 rbsize_add_band(&rbsize_results
[10], 415, 0, 615, 34, 0x00, 200);
315 rbsize_add_band(&rbsize_results
[10], 617, 0, 672, 34, 0x04, 66);
317 rbsize_results
[11] = rbsize_init(0, 0, 672, 34, 34, 1, 2);
318 rbsize_add_row(&rbsize_results
[11], 34);
319 rbsize_add_band(&rbsize_results
[11], 0, 0, 604, 34, 0x00, 200);
320 rbsize_add_band(&rbsize_results
[11], 606, 0, 672, 34, 0x04, 66);
322 rbsize_results
[12] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
323 rbsize_add_row(&rbsize_results
[12], 4 + system_font_height
);
324 rbsize_add_row(&rbsize_results
[12], 4 + system_font_height
);
325 rbsize_add_band(&rbsize_results
[12], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
326 rbsize_add_band(&rbsize_results
[12], 87 + string_width("ABC"), 0, 157 + string_width("ABC"), 4 + system_font_height
, 0x00, 70);
327 rbsize_add_band(&rbsize_results
[12], 157 + string_width("ABC"), 0, 397 + string_width("ABC"), 4 + system_font_height
, 0x00, 240);
328 rbsize_add_band(&rbsize_results
[12], 397 + string_width("ABC"), 0, 672, 4 + system_font_height
, 0x00, 60);
329 rbsize_add_band(&rbsize_results
[12], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
331 rbsize_results
[13] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
332 rbsize_add_row(&rbsize_results
[13], 4 + system_font_height
);
333 rbsize_add_row(&rbsize_results
[13], 4 + system_font_height
);
334 rbsize_add_band(&rbsize_results
[13], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
335 rbsize_add_band(&rbsize_results
[13], 87 + string_width("ABC"), 0, 200 + string_width("ABC"), 4 + system_font_height
, 0x00, 113);
336 rbsize_add_band(&rbsize_results
[13], 200 + string_width("ABC"), 0, 397 + string_width("ABC"), 4 + system_font_height
, 0x00, 197);
337 rbsize_add_band(&rbsize_results
[13], 397 + string_width("ABC"), 0, 672, 4 + system_font_height
, 0x00, 60);
338 rbsize_add_band(&rbsize_results
[13], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
340 rbsize_results
[14] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
341 rbsize_add_row(&rbsize_results
[14], 4 + system_font_height
);
342 rbsize_add_row(&rbsize_results
[14], 4 + system_font_height
);
343 rbsize_add_band(&rbsize_results
[14], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
344 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"));
345 rbsize_add_band(&rbsize_results
[14], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 183);
346 rbsize_add_band(&rbsize_results
[14], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height
, 0x00, 77 + string_width("MMMMMMM"));
347 rbsize_add_band(&rbsize_results
[14], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
349 rbsize_results
[15] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
350 rbsize_add_row(&rbsize_results
[15], 4 + system_font_height
);
351 rbsize_add_row(&rbsize_results
[15], 4 + system_font_height
);
352 rbsize_add_band(&rbsize_results
[15], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
353 rbsize_add_band(&rbsize_results
[15], 87 + string_width("ABC"), 0, 140 + string_width("ABC"), 4 + system_font_height
, 0x00, 53);
354 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"));
355 rbsize_add_band(&rbsize_results
[15], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height
, 0x00, 77 + string_width("MMMMMMM"));
356 rbsize_add_band(&rbsize_results
[15], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
358 rbsize_results
[16] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
359 rbsize_add_row(&rbsize_results
[16], 4 + system_font_height
);
360 rbsize_add_row(&rbsize_results
[16], 4 + system_font_height
);
361 rbsize_add_band(&rbsize_results
[16], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
362 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"));
363 rbsize_add_band(&rbsize_results
[16], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 183);
364 rbsize_add_band(&rbsize_results
[16], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height
, 0x00, 77 + string_width("MMMMMMM"));
365 rbsize_add_band(&rbsize_results
[16], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
367 rbsize_results
[17] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
368 rbsize_add_row(&rbsize_results
[17], 4 + system_font_height
);
369 rbsize_add_row(&rbsize_results
[17], 4 + system_font_height
);
370 rbsize_add_band(&rbsize_results
[17], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
371 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"));
372 rbsize_add_band(&rbsize_results
[17], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 183);
373 rbsize_add_band(&rbsize_results
[17], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height
, 0x00, 77 + string_width("MMMMMMM"));
374 rbsize_add_band(&rbsize_results
[17], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
376 rbsize_results
[18] = rbsize_init(0, 0, 672, 56, 56, 2, 5);
377 rbsize_add_row(&rbsize_results
[18], 28);
378 rbsize_add_row(&rbsize_results
[18], 28);
379 rbsize_add_band(&rbsize_results
[18], 0, 0, 87 + string_width("ABC"), 28, 0x00, 40);
380 rbsize_add_band(&rbsize_results
[18], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 28, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM"));
381 rbsize_add_band(&rbsize_results
[18], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 28, 0x00, 183);
382 rbsize_add_band(&rbsize_results
[18], 595 - string_width("MMMMMMM"), 0, 672, 28, 0x00, 77 + string_width("MMMMMMM"));
383 rbsize_add_band(&rbsize_results
[18], 0, 28, 672, 56, 0x00, 200);
385 rbsize_results
[19] = rbsize_init(0, 0, 672, 8 + 2*system_font_height
, 40, 2, 5);
386 rbsize_add_row(&rbsize_results
[19], 4 + system_font_height
);
387 rbsize_add_row(&rbsize_results
[19], 4 + system_font_height
);
388 rbsize_add_band(&rbsize_results
[19], 0, 0, 87 + string_width("ABC"), 4 + system_font_height
, 0x00, 40);
389 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"));
390 rbsize_add_band(&rbsize_results
[19], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height
, 0x00, 183);
391 rbsize_add_band(&rbsize_results
[19], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height
, 0x00, 77 + string_width("MMMMMMM"));
392 rbsize_add_band(&rbsize_results
[19], 0, 4 + system_font_height
, 672, 8 + 2*system_font_height
, 0x00, 200);
394 rbsize_results
[20] = rbsize_init(0, 0, 672, 56, 56, 2, 5);
395 rbsize_add_row(&rbsize_results
[20], 28);
396 rbsize_add_row(&rbsize_results
[20], 28);
397 rbsize_add_band(&rbsize_results
[20], 0, 0, 87 + string_width("ABC"), 28, 0x00, 40);
398 rbsize_add_band(&rbsize_results
[20], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 28, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM"));
399 rbsize_add_band(&rbsize_results
[20], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 28, 0x00, 183);
400 rbsize_add_band(&rbsize_results
[20], 595 - string_width("MMMMMMM"), 0, 672, 28, 0x00, 77 + string_width("MMMMMMM"));
401 rbsize_add_band(&rbsize_results
[20], 0, 28, 672, 56, 0x00, 200);
403 rbsize_results
[21] = rbsize_init(0, 0, 672, 0, 0, 0, 0);
405 rbsize_results
[22] = rbsize_init(0, 0, 672, 65, 56, 1, 3);
406 rbsize_add_row(&rbsize_results
[22], 65);
407 rbsize_add_band(&rbsize_results
[22], 0, 0, 90, 65, 0x40, 90);
408 rbsize_add_band(&rbsize_results
[22], 90, 0, 180, 65, 0x40, 90);
409 rbsize_add_band(&rbsize_results
[22], 180, 0, 672, 65, 0x40, 90);
411 rbsize_results
[23] = rbsize_init(0, 0, 0, 226, 0, 0, 0);
413 rbsize_results
[24] = rbsize_init(0, 0, 65, 226, 65, 1, 1);
414 rbsize_add_row(&rbsize_results
[24], 65);
415 rbsize_add_band(&rbsize_results
[24], 0, 0, 226, 65, 0x40, 90);
417 rbsize_results
[25] = rbsize_init(0, 0, 65, 226, 65, 1, 2);
418 rbsize_add_row(&rbsize_results
[25], 65);
419 rbsize_add_band(&rbsize_results
[25], 0, 0, 90, 65, 0x40, 90);
420 rbsize_add_band(&rbsize_results
[25], 90, 0, 226, 65, 0x40, 90);
422 rbsize_results
[26] = rbsize_init(0, 0, 65, 226, 65, 1, 3);
423 rbsize_add_row(&rbsize_results
[26], 65);
424 rbsize_add_band(&rbsize_results
[26], 0, 0, 90, 65, 0x40, 90);
425 rbsize_add_band(&rbsize_results
[26], 90, 0, 163, 65, 0x40, 90);
426 rbsize_add_band(&rbsize_results
[26], 163, 0, 226, 65, 0x40, 90);
429 static void rbsize_results_free(void)
433 for (i
= 0; i
< rbsize_results_num
; i
++) {
434 HeapFree(GetProcessHeap(), 0, rbsize_results
[i
].cyRowHeights
);
435 HeapFree(GetProcessHeap(), 0, rbsize_results
[i
].bands
);
437 HeapFree(GetProcessHeap(), 0, rbsize_results
);
438 rbsize_results
= NULL
;
441 static int rbsize_numtests
= 0;
443 #define check_sizes_todo(todomask) { \
445 REBARBANDINFOA rbi; \
446 int count, i/*, mask=(todomask)*/; \
447 const rbsize_result_t *res = &rbsize_results[rbsize_numtests]; \
448 GetClientRect(hRebar, &rc); \
449 check_rect("client", rc, res->rcClient); \
450 count = SendMessageA(hRebar, RB_GETROWCOUNT, 0, 0); \
451 compare(count, res->nRows, "%d"); \
452 for (i=0; i<min(count, res->nRows); i++) { \
453 int height = SendMessageA(hRebar, RB_GETROWHEIGHT, 0, 0);\
454 ok(height == res->cyRowHeights[i], "Height mismatch for row %d - %d vs %d\n", i, res->cyRowHeights[i], height); \
456 count = SendMessageA(hRebar, RB_GETBANDCOUNT, 0, 0); \
457 compare(count, res->nBands, "%d"); \
458 for (i=0; i<min(count, res->nBands); i++) { \
459 ok(SendMessageA(hRebar, RB_GETRECT, i, (LPARAM)&rc) == 1, "RB_GETRECT\n"); \
460 if (!(res->bands[i].fStyle & RBBS_HIDDEN)) \
461 check_rect("band", rc, res->bands[i].rc); \
462 rbi.cbSize = REBARBANDINFOA_V6_SIZE; \
463 rbi.fMask = RBBIM_STYLE | RBBIM_SIZE; \
464 ok(SendMessageA(hRebar, RB_GETBANDINFOA, i, (LPARAM)&rbi) == 1, "RB_GETBANDINFOA\n"); \
465 compare(rbi.fStyle, res->bands[i].fStyle, "%x"); \
466 compare(rbi.cx, res->bands[i].cx, "%d"); \
471 #define check_sizes() check_sizes_todo(0)
475 static void add_band_w(HWND hRebar
, LPCSTR lpszText
, int cxMinChild
, int cx
, int cxIdeal
)
477 CHAR buffer
[MAX_PATH
];
480 if (lpszText
!= NULL
)
481 strcpy(buffer
, lpszText
);
482 rbi
.cbSize
= REBARBANDINFOA_V6_SIZE
;
483 rbi
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_CHILD
| RBBIM_IDEALSIZE
| RBBIM_TEXT
;
485 rbi
.cxMinChild
= cxMinChild
;
486 rbi
.cxIdeal
= cxIdeal
;
488 rbi
.hwndChild
= build_toolbar(1, hRebar
);
489 rbi
.lpText
= (lpszText
? buffer
: NULL
);
490 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
493 static void test_layout(void)
500 rbsize_results_init();
502 hRebar
= create_rebar_control();
504 rbi
.cbSize
= REBARBANDINFOA_V6_SIZE
;
505 rbi
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_CHILD
;
507 rbi
.cxMinChild
= 100;
509 rbi
.hwndChild
= NULL
;
510 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
513 rbi
.fMask
|= RBBIM_STYLE
;
514 rbi
.fStyle
= RBBS_CHILDEDGE
;
515 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
522 rbi
.hwndChild
= build_toolbar(0, hRebar
);
523 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
526 rbi
.fStyle
= RBBS_CHILDEDGE
;
528 rbi
.hwndChild
= build_toolbar(0, hRebar
);
529 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
532 SetWindowLongA(hRebar
, GWL_STYLE
, GetWindowLongA(hRebar
, GWL_STYLE
) | RBS_BANDBORDERS
);
533 check_sizes(); /* a style change won't start a relayout */
534 rbi
.fMask
= RBBIM_SIZE
;
536 SendMessageA(hRebar
, RB_SETBANDINFOA
, 3, (LPARAM
)&rbi
);
537 check_sizes(); /* here it will be relayouted */
539 /* this will force a new row */
540 rbi
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_CHILD
;
542 rbi
.cxMinChild
= 400;
544 rbi
.hwndChild
= build_toolbar(0, hRebar
);
545 SendMessageA(hRebar
, RB_INSERTBANDA
, 1, (LPARAM
)&rbi
);
548 rbi
.fMask
= RBBIM_STYLE
;
549 rbi
.fStyle
= RBBS_HIDDEN
;
550 SendMessageA(hRebar
, RB_SETBANDINFOA
, 2, (LPARAM
)&rbi
);
553 SendMessageA(hRebar
, RB_DELETEBAND
, 2, 0);
555 SendMessageA(hRebar
, RB_DELETEBAND
, 0, 0);
557 SendMessageA(hRebar
, RB_DELETEBAND
, 1, 0);
560 DestroyWindow(hRebar
);
562 hRebar
= create_rebar_control();
563 add_band_w(hRebar
, "ABC", 70, 40, 100);
564 add_band_w(hRebar
, NULL
, 40, 70, 100);
565 add_band_w(hRebar
, NULL
, 170, 240, 100);
566 add_band_w(hRebar
, "MMMMMMM", 60, 60, 100);
567 add_band_w(hRebar
, NULL
, 200, 200, 100);
569 SendMessageA(hRebar
, RB_MAXIMIZEBAND
, 1, TRUE
);
571 SendMessageA(hRebar
, RB_MAXIMIZEBAND
, 1, TRUE
);
573 SendMessageA(hRebar
, RB_MAXIMIZEBAND
, 2, FALSE
);
575 SendMessageA(hRebar
, RB_MINIMIZEBAND
, 2, 0);
577 SendMessageA(hRebar
, RB_MINIMIZEBAND
, 0, 0);
580 /* an image will increase the band height */
581 himl
= ImageList_LoadImageA(GetModuleHandleA("comctl32"), MAKEINTRESOURCEA(121), 24, 2,
582 CLR_NONE
, IMAGE_BITMAP
, LR_DEFAULTCOLOR
);
583 ri
.cbSize
= sizeof(ri
);
584 ri
.fMask
= RBIM_IMAGELIST
;
586 ok(SendMessageA(hRebar
, RB_SETBARINFO
, 0, (LPARAM
)&ri
), "RB_SETBARINFO failed\n");
587 rbi
.fMask
= RBBIM_IMAGE
;
589 SendMessageA(hRebar
, RB_SETBANDINFOA
, 1, (LPARAM
)&rbi
);
592 /* after removing it everything is back to normal*/
594 SendMessageA(hRebar
, RB_SETBANDINFOA
, 1, (LPARAM
)&rbi
);
597 /* Only -1 means that the image is not present. Other invalid values increase the height */
599 SendMessageA(hRebar
, RB_SETBANDINFOA
, 1, (LPARAM
)&rbi
);
602 DestroyWindow(hRebar
);
604 /* VARHEIGHT resizing test on a horizontal rebar */
605 hRebar
= create_rebar_control();
606 SetWindowLongA(hRebar
, GWL_STYLE
, GetWindowLongA(hRebar
, GWL_STYLE
) | RBS_AUTOSIZE
);
608 rbi
.fMask
= RBBIM_CHILD
| RBBIM_CHILDSIZE
| RBBIM_SIZE
| RBBIM_STYLE
;
609 rbi
.fStyle
= RBBS_VARIABLEHEIGHT
;
614 rbi
.cyMaxChild
= 200;
616 rbi
.hwndChild
= build_toolbar(0, hRebar
);
617 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
620 rbi
.hwndChild
= build_toolbar(0, hRebar
);
621 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
626 rbi
.hwndChild
= build_toolbar(0, hRebar
);
627 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
630 DestroyWindow(hRebar
);
632 /* VARHEIGHT resizing on a vertical rebar */
633 hRebar
= create_rebar_control();
634 SetWindowLongA(hRebar
, GWL_STYLE
, GetWindowLongA(hRebar
, GWL_STYLE
) | CCS_VERT
| RBS_AUTOSIZE
);
636 rbi
.fMask
= RBBIM_CHILD
| RBBIM_CHILDSIZE
| RBBIM_SIZE
| RBBIM_STYLE
;
637 rbi
.fStyle
= RBBS_VARIABLEHEIGHT
;
644 rbi
.hwndChild
= build_toolbar(0, hRebar
);
645 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
649 rbi
.hwndChild
= build_toolbar(0, hRebar
);
650 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
656 rbi
.hwndChild
= build_toolbar(0, hRebar
);
657 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
660 rbsize_results_free();
661 DestroyWindow(hRebar
);
662 ImageList_Destroy(himl
);
665 #if 0 /* use this to generate more tests */
667 static void dump_client(HWND hRebar
)
671 GetWindowRect(hRebar
, &r
);
672 MapWindowPoints(HWND_DESKTOP
, hMainWnd
, &r
, 2);
673 if (height_change_notify_rect
.top
!= -1)
676 GetClientRect(hRebar
, &rcClient
);
677 assert(EqualRect(&rcClient
, &height_change_notify_rect
));
682 printf(" {{%d, %d, %d, %d}, %d, %s},\n", r
.left
, r
.top
, r
.right
, r
.bottom
, SendMessageA(hRebar
, RB_GETROWCOUNT
, 0, 0),
683 notify
? "TRUE" : "FALSE");
684 SetRect(&height_change_notify_rect
, -1, -1, -1, -1);
687 #define comment(fmt, arg1) printf("/* " fmt " */\n", arg1);
688 #define check_client() dump_client(hRebar)
696 } rbresize_test_result_t
;
698 static const rbresize_test_result_t resize_results
[] = {
700 {{0, 2, 672, 2}, 0, FALSE
},
701 {{0, 2, 672, 22}, 1, TRUE
},
702 {{0, 2, 672, 22}, 1, FALSE
},
703 {{0, 2, 672, 22}, 1, FALSE
},
704 {{0, 2, 672, 22}, 1, FALSE
},
705 {{0, 2, 672, 22}, 0, FALSE
},
707 {{0, 0, 672, 0}, 0, FALSE
},
708 {{0, 0, 672, 20}, 1, TRUE
},
709 {{0, 0, 672, 20}, 1, FALSE
},
710 {{0, 0, 672, 20}, 1, FALSE
},
711 {{0, 0, 672, 20}, 1, FALSE
},
712 {{0, 0, 672, 20}, 0, FALSE
},
714 {{0, 226, 672, 226}, 0, FALSE
},
715 {{0, 206, 672, 226}, 1, TRUE
},
716 {{0, 206, 672, 226}, 1, FALSE
},
717 {{0, 206, 672, 226}, 1, FALSE
},
718 {{0, 206, 672, 226}, 1, FALSE
},
719 {{0, 206, 672, 226}, 0, FALSE
},
721 {{0, 226, 672, 226}, 0, FALSE
},
722 {{0, 206, 672, 226}, 1, TRUE
},
723 {{0, 206, 672, 226}, 1, FALSE
},
724 {{0, 206, 672, 226}, 1, FALSE
},
725 {{0, 206, 672, 226}, 1, FALSE
},
726 {{0, 206, 672, 226}, 0, FALSE
},
728 {{2, 0, 2, 226}, 0, FALSE
},
729 {{2, 0, 22, 226}, 1, TRUE
},
730 {{2, 0, 22, 226}, 1, FALSE
},
731 {{2, 0, 22, 226}, 1, FALSE
},
732 {{2, 0, 22, 226}, 1, FALSE
},
733 {{2, 0, 22, 226}, 0, FALSE
},
735 {{672, 0, 672, 226}, 0, FALSE
},
736 {{652, 0, 672, 226}, 1, TRUE
},
737 {{652, 0, 672, 226}, 1, FALSE
},
738 {{652, 0, 672, 226}, 1, FALSE
},
739 {{652, 0, 672, 226}, 1, FALSE
},
740 {{652, 0, 672, 226}, 0, FALSE
},
742 {{10, 11, 510, 11}, 0, FALSE
},
743 {{10, 15, 510, 35}, 1, TRUE
},
744 {{10, 17, 510, 37}, 1, FALSE
},
745 {{10, 14, 110, 54}, 2, TRUE
},
746 {{0, 4, 0, 44}, 2, FALSE
},
747 {{0, 6, 0, 46}, 2, FALSE
},
748 {{0, 8, 0, 48}, 2, FALSE
},
749 {{0, 12, 0, 32}, 1, TRUE
},
750 {{0, 4, 100, 24}, 0, FALSE
},
752 {{10, 5, 510, 5}, 0, FALSE
},
753 {{10, 5, 510, 25}, 1, TRUE
},
754 {{10, 5, 510, 25}, 1, FALSE
},
755 {{10, 10, 110, 50}, 2, TRUE
},
756 {{0, 0, 0, 40}, 2, FALSE
},
757 {{0, 0, 0, 40}, 2, FALSE
},
758 {{0, 0, 0, 40}, 2, FALSE
},
759 {{0, 0, 0, 20}, 1, TRUE
},
760 {{0, 0, 100, 20}, 0, FALSE
},
762 {{10, 5, 510, 20}, 0, FALSE
},
763 {{10, 5, 510, 20}, 1, TRUE
},
764 {{10, 10, 110, 110}, 2, TRUE
},
765 {{0, 0, 0, 0}, 2, FALSE
},
766 {{0, 0, 0, 0}, 2, FALSE
},
767 {{0, 0, 0, 0}, 2, FALSE
},
768 {{0, 0, 0, 0}, 1, TRUE
},
769 {{0, 0, 100, 100}, 0, FALSE
},
771 {{0, 5, 672, 5}, 0, FALSE
},
772 {{0, 5, 672, 25}, 1, TRUE
},
773 {{0, 10, 672, 30}, 1, FALSE
},
774 {{0, 0, 672, 20}, 1, FALSE
},
775 {{0, 0, 672, 20}, 1, FALSE
},
776 {{0, 0, 672, 20}, 0, FALSE
},
778 {{10, 0, 10, 226}, 0, FALSE
},
779 {{10, 0, 30, 226}, 1, TRUE
},
780 {{10, 0, 30, 226}, 1, FALSE
},
781 {{0, 0, 20, 226}, 1, FALSE
},
782 {{0, 0, 20, 226}, 1, FALSE
},
783 {{0, 0, 20, 226}, 0, FALSE
},
785 {{-2, 0, 674, 4}, 0, FALSE
},
786 {{-2, 0, 674, 24}, 1, TRUE
},
787 {{-2, 0, 674, 24}, 1, FALSE
},
788 {{-2, 0, 674, 24}, 1, FALSE
},
789 {{-2, 0, 674, 24}, 1, FALSE
},
790 {{-2, 0, 674, 24}, 0, FALSE
},
792 {{10, 5, 510, 9}, 0, FALSE
},
793 {{10, 5, 510, 29}, 1, TRUE
},
794 {{10, 5, 510, 29}, 1, FALSE
},
795 {{10, 10, 110, 54}, 2, TRUE
},
796 {{0, 0, 0, 44}, 2, FALSE
},
797 {{0, 0, 0, 44}, 2, FALSE
},
798 {{0, 0, 0, 44}, 2, FALSE
},
799 {{0, 0, 0, 24}, 1, TRUE
},
800 {{0, 0, 100, 24}, 0, FALSE
},
802 {{10, 5, 510, 20}, 0, FALSE
},
803 {{10, 5, 510, 20}, 1, TRUE
},
804 {{10, 10, 110, 110}, 2, TRUE
},
805 {{0, 0, 0, 0}, 2, FALSE
},
806 {{0, 0, 0, 0}, 2, FALSE
},
807 {{0, 0, 0, 0}, 2, FALSE
},
808 {{0, 0, 0, 0}, 1, TRUE
},
809 {{0, 0, 100, 100}, 0, FALSE
},
811 {{-2, 5, 674, 9}, 0, FALSE
},
812 {{-2, 5, 674, 29}, 1, TRUE
},
813 {{-2, 10, 674, 34}, 1, FALSE
},
814 {{-2, 0, 674, 24}, 1, FALSE
},
815 {{-2, 0, 674, 24}, 1, FALSE
},
816 {{-2, 0, 674, 24}, 0, FALSE
},
819 static DWORD resize_numtests
= 0;
821 #define comment(fmt, arg1)
822 #define check_client() { \
825 const rbresize_test_result_t *res = &resize_results[resize_numtests++]; \
826 assert(resize_numtests <= sizeof(resize_results)/sizeof(resize_results[0])); \
827 GetWindowRect(hRebar, &r); \
828 MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); \
829 if ((dwStyles[i] & (CCS_NOPARENTALIGN|CCS_NODIVIDER)) == CCS_NOPARENTALIGN) {\
830 check_rect_no_top("client", r, res->rc); /* the top coordinate changes after every layout and is very implementation-dependent */ \
832 check_rect("client", r, res->rc); \
834 value = (int)SendMessageA(hRebar, RB_GETROWCOUNT, 0, 0); \
835 ok(res->iNumRows == value, "RB_GETROWCOUNT expected %d got %d\n", res->iNumRows, value); \
836 if (res->heightNotify) { \
838 GetClientRect(hRebar, &rcClient); \
839 check_rect("notify", height_change_notify_rect, rcClient); \
840 } else ok(height_change_notify_rect.top == -1, "Unexpected RBN_HEIGHTCHANGE received\n"); \
841 SetRect(&height_change_notify_rect, -1, -1, -1, -1); \
846 static void test_resize(void)
848 DWORD dwStyles
[] = {CCS_TOP
, CCS_TOP
| CCS_NODIVIDER
, CCS_BOTTOM
, CCS_BOTTOM
| CCS_NODIVIDER
, CCS_VERT
, CCS_RIGHT
,
849 CCS_NOPARENTALIGN
, CCS_NOPARENTALIGN
| CCS_NODIVIDER
, CCS_NORESIZE
, CCS_NOMOVEY
, CCS_NOMOVEY
| CCS_VERT
,
850 CCS_TOP
| WS_BORDER
, CCS_NOPARENTALIGN
| CCS_NODIVIDER
| WS_BORDER
, CCS_NORESIZE
| WS_BORDER
,
851 CCS_NOMOVEY
| WS_BORDER
};
853 const int styles_count
= sizeof(dwStyles
) / sizeof(dwStyles
[0]);
856 for (i
= 0; i
< styles_count
; i
++)
860 comment("style %08x", dwStyles
[i
]);
861 SetRect(&height_change_notify_rect
, -1, -1, -1, -1);
862 hRebar
= CreateWindowA(REBARCLASSNAMEA
, "A", dwStyles
[i
] | WS_CHILD
| WS_VISIBLE
, 10, 5, 500, 15, hMainWnd
, NULL
, GetModuleHandleA(NULL
), 0);
864 add_band_w(hRebar
, NULL
, 70, 100, 0);
865 if (dwStyles
[i
] & CCS_NOPARENTALIGN
) /* the window drifts downward for CCS_NOPARENTALIGN without CCS_NODIVIDER */
867 add_band_w(hRebar
, NULL
, 70, 100, 0);
869 MoveWindow(hRebar
, 10, 10, 100, 100, TRUE
);
871 MoveWindow(hRebar
, 0, 0, 0, 0, TRUE
);
873 /* try to fool the rebar by sending invalid width/height - won't work */
874 if (dwStyles
[i
] & (CCS_NORESIZE
| CCS_NOPARENTALIGN
))
878 pos
.hwndInsertAfter
= NULL
;
884 SendMessageA(hRebar
, WM_WINDOWPOSCHANGING
, 0, (LPARAM
)&pos
);
885 SendMessageA(hRebar
, WM_WINDOWPOSCHANGED
, 0, (LPARAM
)&pos
);
887 SendMessageA(hRebar
, WM_SIZE
, SIZE_RESTORED
, MAKELONG(500, 500));
890 SendMessageA(hRebar
, RB_DELETEBAND
, 0, 0);
892 SendMessageA(hRebar
, RB_DELETEBAND
, 0, 0);
893 MoveWindow(hRebar
, 0, 0, 100, 100, TRUE
);
895 DestroyWindow(hRebar
);
899 static void expect_band_content_(int line
, HWND hRebar
, UINT uBand
, INT fStyle
, COLORREF clrFore
,
900 COLORREF clrBack
, LPCSTR lpText
, int iImage
, HWND hwndChild
,
901 INT cxMinChild
, INT cyMinChild
, INT cx
, HBITMAP hbmBack
, INT wID
,
902 INT cyChild
, INT cyMaxChild
, INT cyIntegral
, INT cxIdeal
, LPARAM lParam
,
903 UINT cxHeader
, UINT cxHeader_broken
)
905 CHAR buf
[MAX_PATH
] = "abc";
908 memset(&rb
, 0xdd, sizeof(rb
));
909 rb
.cbSize
= REBARBANDINFOA_V6_SIZE
;
910 rb
.fMask
= RBBIM_BACKGROUND
| RBBIM_CHILD
| RBBIM_CHILDSIZE
| RBBIM_COLORS
911 | RBBIM_HEADERSIZE
| RBBIM_ID
| RBBIM_IDEALSIZE
| RBBIM_IMAGE
| RBBIM_LPARAM
912 | RBBIM_SIZE
| RBBIM_STYLE
| RBBIM_TEXT
;
915 ok(SendMessageA(hRebar
, RB_GETBANDINFOA
, uBand
, (LPARAM
)&rb
), "RB_GETBANDINFOA failed from line %d\n", line
);
916 expect_eq(line
, rb
.fStyle
, fStyle
, int, "%x");
917 expect_eq(line
, rb
.clrFore
, clrFore
, COLORREF
, "%x");
918 expect_eq(line
, rb
.clrBack
, clrBack
, COLORREF
, "%x");
919 expect_eq(line
, strcmp(rb
.lpText
, lpText
), 0, int, "%d");
920 expect_eq(line
, rb
.iImage
, iImage
, int, "%x");
921 expect_eq(line
, rb
.hwndChild
, hwndChild
, HWND
, "%p");
922 expect_eq(line
, rb
.cxMinChild
, cxMinChild
, int, "%d");
923 expect_eq(line
, rb
.cyMinChild
, cyMinChild
, int, "%d");
924 expect_eq(line
, rb
.cx
, cx
, int, "%d");
925 expect_eq(line
, rb
.hbmBack
, hbmBack
, HBITMAP
, "%p");
926 expect_eq(line
, rb
.wID
, wID
, int, "%d");
927 /* the values of cyChild, cyMaxChild and cyIntegral can't be read unless the band is RBBS_VARIABLEHEIGHT */
928 expect_eq(line
, rb
.cyChild
, cyChild
, int, "%x");
929 expect_eq(line
, rb
.cyMaxChild
, cyMaxChild
, int, "%x");
930 expect_eq(line
, rb
.cyIntegral
, cyIntegral
, int, "%x");
931 expect_eq(line
, rb
.cxIdeal
, cxIdeal
, int, "%d");
932 expect_eq(line
, rb
.lParam
, lParam
, LPARAM
, "%ld");
933 ok(rb
.cxHeader
== cxHeader
|| rb
.cxHeader
== cxHeader
+ 1 || broken(rb
.cxHeader
== cxHeader_broken
),
934 "expected %d for %d from line %d\n", cxHeader
, rb
.cxHeader
, line
);
937 #define expect_band_content(hRebar, uBand, fStyle, clrFore, clrBack,\
938 lpText, iImage, hwndChild, cxMinChild, cyMinChild, cx, hbmBack, wID,\
939 cyChild, cyMaxChild, cyIntegral, cxIdeal, lParam, cxHeader, cxHeader_broken) \
940 expect_band_content_(__LINE__, hRebar, uBand, fStyle, clrFore, clrBack,\
941 lpText, iImage, hwndChild, cxMinChild, cyMinChild, cx, hbmBack, wID,\
942 cyChild, cyMaxChild, cyIntegral, cxIdeal, lParam, cxHeader, cxHeader_broken)
944 static void test_bandinfo(void)
947 CHAR szABC
[] = "ABC";
948 CHAR szABCD
[] = "ABCD";
951 hRebar
= create_rebar_control();
952 rb
.cbSize
= REBARBANDINFOA_V6_SIZE
;
954 if (!SendMessageA(hRebar
, RB_INSERTBANDA
, 0, (LPARAM
)&rb
))
956 win_skip( "V6 info not supported\n" );
957 DestroyWindow(hRebar
);
960 expect_band_content(hRebar
, 0, 0, 0, GetSysColor(COLOR_3DFACE
), "", -1, NULL
, 0, 0, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 0, -1);
962 rb
.fMask
= RBBIM_CHILDSIZE
;
968 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
969 expect_band_content(hRebar
, 0, 0, 0, GetSysColor(COLOR_3DFACE
), "", -1, NULL
, 15, 20, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 0, -1);
971 rb
.fMask
= RBBIM_TEXT
;
973 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
974 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);
976 rb
.cbSize
= REBARBANDINFOA_V6_SIZE
;
978 ok(SendMessageA(hRebar
, RB_INSERTBANDA
, 1, (LPARAM
)&rb
), "RB_INSERTBANDA failed\n");
979 expect_band_content(hRebar
, 1, 0, 0, GetSysColor(COLOR_3DFACE
), "", -1, NULL
, 0, 0, 0, NULL
, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 9, -1);
980 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);
982 rb
.fMask
= RBBIM_HEADERSIZE
;
984 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
985 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);
988 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
989 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);
991 rb
.fMask
= RBBIM_TEXT
;
993 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
994 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);
995 rb
.fMask
= RBBIM_STYLE
| RBBIM_TEXT
;
996 rb
.fStyle
= RBBS_VARIABLEHEIGHT
;
998 ok(SendMessageA(hRebar
, RB_SETBANDINFOA
, 0, (LPARAM
)&rb
), "RB_SETBANDINFOA failed\n");
999 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);
1001 DestroyWindow(hRebar
);
1004 static void test_colors(void)
1012 hRebar
= create_rebar_control();
1014 /* test default colors */
1015 clr
= SendMessageA(hRebar
, RB_GETTEXTCOLOR
, 0, 0);
1016 compare(clr
, CLR_NONE
, "%x");
1017 clr
= SendMessageA(hRebar
, RB_GETBKCOLOR
, 0, 0);
1018 compare(clr
, CLR_NONE
, "%x");
1020 scheme
.dwSize
= sizeof(scheme
);
1021 scheme
.clrBtnHighlight
= 0;
1022 scheme
.clrBtnShadow
= 0;
1023 ret
= SendMessageA(hRebar
, RB_GETCOLORSCHEME
, 0, (LPARAM
)&scheme
);
1026 compare(scheme
.clrBtnHighlight
, CLR_DEFAULT
, "%x");
1027 compare(scheme
.clrBtnShadow
, CLR_DEFAULT
, "%x");
1030 skip("RB_GETCOLORSCHEME not supported\n");
1032 /* check default band colors */
1033 add_band_w(hRebar
, "", 0, 10, 10);
1034 bi
.cbSize
= REBARBANDINFOA_V6_SIZE
;
1035 bi
.fMask
= RBBIM_COLORS
;
1036 bi
.clrFore
= bi
.clrBack
= 0xc0ffe;
1037 ret
= SendMessageA(hRebar
, RB_GETBANDINFOA
, 0, (LPARAM
)&bi
);
1038 ok(ret
, "RB_GETBANDINFOA failed\n");
1039 compare(bi
.clrFore
, RGB(0, 0, 0), "%x");
1040 compare(bi
.clrBack
, GetSysColor(COLOR_3DFACE
), "%x");
1042 SendMessageA(hRebar
, RB_SETTEXTCOLOR
, 0, RGB(255, 0, 0));
1043 bi
.clrFore
= bi
.clrBack
= 0xc0ffe;
1044 ret
= SendMessageA(hRebar
, RB_GETBANDINFOA
, 0, (LPARAM
)&bi
);
1045 ok(ret
, "RB_GETBANDINFOA failed\n");
1046 compare(bi
.clrFore
, RGB(0, 0, 0), "%x");
1048 DestroyWindow(hRebar
);
1052 static BOOL
register_parent_wnd_class(void)
1056 wc
.style
= CS_HREDRAW
| CS_VREDRAW
;
1059 wc
.hInstance
= GetModuleHandleA(NULL
);
1061 wc
.hCursor
= LoadCursorA(NULL
, (LPCSTR
)IDC_IBEAM
);
1062 wc
.hbrBackground
= GetSysColorBrush(COLOR_WINDOW
);
1063 wc
.lpszMenuName
= NULL
;
1064 wc
.lpszClassName
= "MyTestWnd";
1065 wc
.lpfnWndProc
= parent_wndproc
;
1067 return RegisterClassA(&wc
);
1070 static HWND
create_parent_window(void)
1074 if (!register_parent_wnd_class()) return NULL
;
1076 hwnd
= CreateWindowExA(0, "MyTestWnd", "Blah", WS_OVERLAPPEDWINDOW
,
1077 CW_USEDEFAULT
, CW_USEDEFAULT
, 672+2*GetSystemMetrics(SM_CXSIZEFRAME
),
1078 226+GetSystemMetrics(SM_CYCAPTION
)+2*GetSystemMetrics(SM_CYSIZEFRAME
),
1079 NULL
, NULL
, GetModuleHandleA(NULL
), 0);
1081 ShowWindow(hwnd
, SW_SHOW
);
1085 static void test_showband(void)
1091 hRebar
= create_rebar_control();
1094 ret
= SendMessageA(hRebar
, RB_SHOWBAND
, 0, TRUE
);
1095 ok(ret
== FALSE
, "got %d\n", ret
);
1097 rbi
.cbSize
= REBARBANDINFOA_V6_SIZE
;
1098 rbi
.fMask
= RBBIM_SIZE
| RBBIM_CHILDSIZE
| RBBIM_CHILD
;
1100 rbi
.cxMinChild
= 100;
1101 rbi
.cyMinChild
= 30;
1102 rbi
.hwndChild
= NULL
;
1103 SendMessageA(hRebar
, RB_INSERTBANDA
, -1, (LPARAM
)&rbi
);
1105 /* index out of range */
1106 ret
= SendMessageA(hRebar
, RB_SHOWBAND
, 1, TRUE
);
1107 ok(ret
== FALSE
, "got %d\n", ret
);
1109 ret
= SendMessageA(hRebar
, RB_SHOWBAND
, 0, TRUE
);
1110 ok(ret
== TRUE
, "got %d\n", ret
);
1112 DestroyWindow(hRebar
);
1115 static void test_notification(void)
1117 MEASUREITEMSTRUCT mis
;
1120 rebar
= create_rebar_control();
1122 g_parent_measureitem
= 0;
1123 SendMessageA(rebar
, WM_MEASUREITEM
, 0, (LPARAM
)&mis
);
1124 ok(g_parent_measureitem
== 1, "got %d\n", g_parent_measureitem
);
1126 DestroyWindow(rebar
);
1132 BOOL (WINAPI
*pInitCommonControlsEx
)(const INITCOMMONCONTROLSEX
*);
1133 INITCOMMONCONTROLSEX iccex
;
1136 init_system_font_height();
1138 /* LoadLibrary is needed. This file has no reference to functions in comctl32 */
1139 hComctl32
= LoadLibraryA("comctl32.dll");
1140 pInitCommonControlsEx
= (void*)GetProcAddress(hComctl32
, "InitCommonControlsEx");
1141 if (!pInitCommonControlsEx
)
1143 win_skip("InitCommonControlsEx() is missing. Skipping the tests\n");
1146 iccex
.dwSize
= sizeof(iccex
);
1147 iccex
.dwICC
= ICC_COOL_CLASSES
;
1148 pInitCommonControlsEx(&iccex
);
1150 hMainWnd
= create_parent_window();
1155 test_notification();
1157 if(!is_font_installed("System") || !is_font_installed("Tahoma"))
1159 skip("Missing System or Tahoma font\n");
1168 while(GetMessageA(&msg
,0,0,0)) {
1169 TranslateMessage(&msg
);
1170 DispatchMessageA(&msg
);
1172 DestroyWindow(hMainWnd
);
1174 FreeLibrary(hComctl32
);