comctl32/tests: Use the global memory allocation helpers.
[wine.git] / dlls / comctl32 / tests / rebar.c
blob7dae3a7dbea403040ae51c9ef1e08b5a640fb010
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
24 #include <assert.h>
25 #include <stdarg.h>
27 #include <windows.h>
28 #include <commctrl.h>
29 #include <uxtheme.h>
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;
38 static HWND hMainWnd;
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)
58 return 0;
61 static BOOL is_font_installed(const char *name)
63 HDC hdc = GetDC(0);
64 BOOL ret = FALSE;
66 if(!EnumFontFamiliesA(hdc, name, is_font_installed_proc, 0))
67 ret = TRUE;
69 ReleaseDC(0, hdc);
70 return ret;
73 static void init_system_font_height(void) {
74 HDC hDC;
75 TEXTMETRICA tm;
77 hDC = CreateCompatibleDC(NULL);
78 GetTextMetricsA(hDC, &tm);
79 DeleteDC(NULL);
81 system_font_height = tm.tmHeight;
84 static HWND create_rebar_control(void)
86 HWND hwnd;
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);
94 return hwnd;
97 static HWND build_toolbar(int nr, HWND hParent)
99 TBBUTTON btns[8];
100 HWND hToolbar = CreateWindowExA(0, TOOLBARCLASSNAMEA, NULL, WS_CHILD | WS_VISIBLE | CCS_NORESIZE, 0, 0, 0, 0,
101 hParent, (HMENU)5, GetModuleHandleA(NULL), NULL);
102 int iBitmapId = 0;
103 int i;
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++)
112 btns[i].iBitmap = i;
113 btns[i].idCommand = i;
114 btns[i].fsStyle = BTNS_BUTTON;
115 btns[i].fsState = TBSTATE_ENABLED;
116 btns[i].iString = 0;
119 switch (nr)
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");
127 return hToolbar;
130 static int g_parent_measureitem;
132 static LRESULT CALLBACK parent_wndproc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
134 switch (msg)
136 case WM_NOTIFY:
138 NMHDR *lpnm = (NMHDR *)lParam;
139 if (lpnm->code == RBN_HEIGHTCHANGE)
140 GetClientRect(lpnm->hwndFrom, &height_change_notify_rect);
142 break;
143 case WM_MEASUREITEM:
144 g_parent_measureitem++;
145 break;
147 return DefWindowProcA(hWnd, msg, wParam, lParam);
150 #if 0 /* use this to generate more tests*/
152 static void dump_sizes(HWND hRebar)
154 SIZE sz;
155 RECT r;
156 int count;
157 int i, h;
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);
163 if (count == 0)
164 printf("0, ");
165 for (i = 0; i < count; i++) /* rows */
166 printf("%d, ", SendMessageA(hRebar, RB_GETROWHEIGHT, i, 0));
167 printf("}, ");
169 count = SendMessageA(hRebar, RB_GETBANDCOUNT, 0, 0);
170 printf("%d, {", count);
171 if (count == 0)
172 printf("{{0, 0, 0, 0}, 0, 0},");
173 for (i=0; i<count; i++)
175 REBARBANDINFOA rbi;
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,
181 rbi.fStyle, rbi.cx);
183 printf("\n }, },\n");
186 #define check_sizes() dump_sizes(hRebar);
187 #define check_sizes_todo(todomask) dump_sizes(hRebar);
189 #else
191 static int string_width(const CHAR *s) {
192 SIZE sz;
193 HDC hdc;
195 hdc = CreateCompatibleDC(NULL);
196 GetTextExtentPoint32A(hdc, s, strlen(s), &sz);
197 DeleteDC(hdc);
199 return sz.cx;
202 typedef struct {
203 RECT rc;
204 DWORD fStyle;
205 UINT cx;
206 } rbband_result_t;
208 typedef struct {
209 RECT rcClient;
210 int cyBarHeight;
211 int nRows;
212 int *cyRowHeights;
213 int nBands;
214 rbband_result_t *bands;
215 } rbsize_result_t;
217 static rbsize_result_t rbsize_init(int cleft, int ctop, int cright, int cbottom, int cyBarHeight, int nRows, int nBands)
219 rbsize_result_t ret;
221 SetRect(&ret.rcClient, cleft, ctop, cright, cbottom);
222 ret.cyBarHeight = cyBarHeight;
223 ret.nRows = 0;
224 ret.cyRowHeights = heap_alloc_zero(nRows * sizeof(int));
225 ret.nBands = 0;
226 ret.bands = heap_alloc_zero(nBands * sizeof(*ret.bands));
228 return ret;
231 static void rbsize_add_row(rbsize_result_t *rbsr, int rowHeight) {
232 rbsr->cyRowHeights[rbsr->nRows] = rowHeight;
233 rbsr->nRows++;
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;
241 rbsr->nBands++;
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)
434 int i;
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) { \
447 RECT rc; \
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"); \
471 rbsize_numtests++; \
474 #define check_sizes() check_sizes_todo(0)
476 #endif
478 static void add_band_w(HWND hRebar, LPCSTR lpszText, int cxMinChild, int cx, int cxIdeal)
480 CHAR buffer[MAX_PATH];
481 REBARBANDINFOA rbi;
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;
487 rbi.cx = cx;
488 rbi.cxMinChild = cxMinChild;
489 rbi.cxIdeal = cxIdeal;
490 rbi.cyMinChild = 20;
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)
498 HWND hRebar;
499 REBARBANDINFOA rbi;
500 HIMAGELIST himl;
501 REBARINFO ri;
503 rbsize_results_init();
505 hRebar = create_rebar_control();
506 check_sizes();
507 rbi.cbSize = REBARBANDINFOA_V6_SIZE;
508 rbi.fMask = RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_CHILD;
509 rbi.cx = 200;
510 rbi.cxMinChild = 100;
511 rbi.cyMinChild = 30;
512 rbi.hwndChild = NULL;
513 SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi);
514 check_sizes();
516 rbi.fMask |= RBBIM_STYLE;
517 rbi.fStyle = RBBS_CHILDEDGE;
518 SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi);
519 check_sizes();
521 rbi.fStyle = 0;
522 rbi.cx = 200;
523 rbi.cxMinChild = 30;
524 rbi.cyMinChild = 30;
525 rbi.hwndChild = build_toolbar(0, hRebar);
526 SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi);
527 check_sizes();
529 rbi.fStyle = RBBS_CHILDEDGE;
530 rbi.cx = 68;
531 rbi.hwndChild = build_toolbar(0, hRebar);
532 SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi);
533 check_sizes();
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;
538 rbi.cx = 66;
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;
544 rbi.cx = 200;
545 rbi.cxMinChild = 400;
546 rbi.cyMinChild = 30;
547 rbi.hwndChild = build_toolbar(0, hRebar);
548 SendMessageA(hRebar, RB_INSERTBANDA, 1, (LPARAM)&rbi);
549 check_sizes();
551 rbi.fMask = RBBIM_STYLE;
552 rbi.fStyle = RBBS_HIDDEN;
553 SendMessageA(hRebar, RB_SETBANDINFOA, 2, (LPARAM)&rbi);
554 check_sizes();
556 SendMessageA(hRebar, RB_DELETEBAND, 2, 0);
557 check_sizes();
558 SendMessageA(hRebar, RB_DELETEBAND, 0, 0);
559 check_sizes();
560 SendMessageA(hRebar, RB_DELETEBAND, 1, 0);
561 check_sizes();
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);
571 check_sizes();
572 SendMessageA(hRebar, RB_MAXIMIZEBAND, 1, TRUE);
573 check_sizes();
574 SendMessageA(hRebar, RB_MAXIMIZEBAND, 1, TRUE);
575 check_sizes();
576 SendMessageA(hRebar, RB_MAXIMIZEBAND, 2, FALSE);
577 check_sizes();
578 SendMessageA(hRebar, RB_MINIMIZEBAND, 2, 0);
579 check_sizes();
580 SendMessageA(hRebar, RB_MINIMIZEBAND, 0, 0);
581 check_sizes();
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;
588 ri.himl = himl;
589 ok(SendMessageA(hRebar, RB_SETBARINFO, 0, (LPARAM)&ri), "RB_SETBARINFO failed\n");
590 rbi.fMask = RBBIM_IMAGE;
591 rbi.iImage = 1;
592 SendMessageA(hRebar, RB_SETBANDINFOA, 1, (LPARAM)&rbi);
593 check_sizes();
595 /* after removing it everything is back to normal*/
596 rbi.iImage = -1;
597 SendMessageA(hRebar, RB_SETBANDINFOA, 1, (LPARAM)&rbi);
598 check_sizes();
600 /* Only -1 means that the image is not present. Other invalid values increase the height */
601 rbi.iImage = -2;
602 SendMessageA(hRebar, RB_SETBANDINFOA, 1, (LPARAM)&rbi);
603 check_sizes();
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);
610 check_sizes();
611 rbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_STYLE;
612 rbi.fStyle = RBBS_VARIABLEHEIGHT;
613 rbi.cxMinChild = 50;
614 rbi.cyMinChild = 10;
615 rbi.cyIntegral = 11;
616 rbi.cyChild = 70;
617 rbi.cyMaxChild = 200;
618 rbi.cx = 90;
619 rbi.hwndChild = build_toolbar(0, hRebar);
620 SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi);
622 rbi.cyChild = 50;
623 rbi.hwndChild = build_toolbar(0, hRebar);
624 SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi);
626 rbi.cyMinChild = 40;
627 rbi.cyChild = 50;
628 rbi.cyIntegral = 5;
629 rbi.hwndChild = build_toolbar(0, hRebar);
630 SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi);
631 check_sizes();
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);
638 check_sizes();
639 rbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_STYLE;
640 rbi.fStyle = RBBS_VARIABLEHEIGHT;
641 rbi.cxMinChild = 50;
642 rbi.cyMinChild = 10;
643 rbi.cyIntegral = 11;
644 rbi.cyChild = 70;
645 rbi.cyMaxChild = 90;
646 rbi.cx = 90;
647 rbi.hwndChild = build_toolbar(0, hRebar);
648 SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi);
649 check_sizes();
651 rbi.cyChild = 50;
652 rbi.hwndChild = build_toolbar(0, hRebar);
653 SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi);
654 check_sizes();
656 rbi.cyMinChild = 40;
657 rbi.cyChild = 50;
658 rbi.cyIntegral = 5;
659 rbi.hwndChild = build_toolbar(0, hRebar);
660 SendMessageA(hRebar, RB_INSERTBANDA, -1, (LPARAM)&rbi);
661 check_sizes();
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)
672 RECT r;
673 BOOL notify;
674 GetWindowRect(hRebar, &r);
675 MapWindowPoints(HWND_DESKTOP, hMainWnd, &r, 2);
676 if (height_change_notify_rect.top != -1)
678 RECT rcClient;
679 GetClientRect(hRebar, &rcClient);
680 assert(EqualRect(&rcClient, &height_change_notify_rect));
681 notify = TRUE;
683 else
684 notify = FALSE;
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)
693 #else
695 typedef struct {
696 RECT rc;
697 INT iNumRows;
698 BOOL heightNotify;
699 } rbresize_test_result_t;
701 static const rbresize_test_result_t resize_results[] = {
702 /* style 00000001 */
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},
709 /* style 00000041 */
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},
716 /* style 00000003 */
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},
723 /* style 00000043 */
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},
730 /* style 00000080 */
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},
737 /* style 00000083 */
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},
744 /* style 00000008 */
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},
754 /* style 00000048 */
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},
764 /* style 00000004 */
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},
773 /* style 00000002 */
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},
780 /* style 00000082 */
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},
787 /* style 00800001 */
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},
794 /* style 00800048 */
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},
804 /* style 00800004 */
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},
813 /* style 00800002 */
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() { \
826 RECT r; \
827 int value; \
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 */ \
834 } else { \
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) { \
840 RECT rcClient; \
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); \
847 #endif
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]);
857 int i;
859 for (i = 0; i < styles_count; i++)
861 HWND hRebar;
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);
866 check_client();
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 */
869 check_client();
870 add_band_w(hRebar, NULL, 70, 100, 0);
871 check_client();
872 MoveWindow(hRebar, 10, 10, 100, 100, TRUE);
873 check_client();
874 MoveWindow(hRebar, 0, 0, 0, 0, TRUE);
875 check_client();
876 /* try to fool the rebar by sending invalid width/height - won't work */
877 if (dwStyles[i] & (CCS_NORESIZE | CCS_NOPARENTALIGN))
879 WINDOWPOS pos;
880 pos.hwnd = hRebar;
881 pos.hwndInsertAfter = NULL;
882 pos.cx = 500;
883 pos.cy = 500;
884 pos.x = 10;
885 pos.y = 10;
886 pos.flags = 0;
887 SendMessageA(hRebar, WM_WINDOWPOSCHANGING, 0, (LPARAM)&pos);
888 SendMessageA(hRebar, WM_WINDOWPOSCHANGED, 0, (LPARAM)&pos);
889 check_client();
890 SendMessageA(hRebar, WM_SIZE, SIZE_RESTORED, MAKELONG(500, 500));
891 check_client();
893 SendMessageA(hRebar, RB_DELETEBAND, 0, 0);
894 check_client();
895 SendMessageA(hRebar, RB_DELETEBAND, 0, 0);
896 MoveWindow(hRebar, 0, 0, 100, 100, TRUE);
897 check_client();
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";
909 REBARBANDINFOA rb;
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;
916 rb.lpText = buf;
917 rb.cch = MAX_PATH;
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)
949 REBARBANDINFOA rb;
950 CHAR szABC[] = "ABC";
951 CHAR szABCD[] = "ABCD";
952 HWND hRebar;
954 hRebar = create_rebar_control();
955 rb.cbSize = REBARBANDINFOA_V6_SIZE;
956 rb.fMask = 0;
957 if (!SendMessageA(hRebar, RB_INSERTBANDA, 0, (LPARAM)&rb))
959 win_skip( "V6 info not supported\n" );
960 DestroyWindow(hRebar);
961 return;
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;
966 rb.cxMinChild = 15;
967 rb.cyMinChild = 20;
968 rb.cyChild = 30;
969 rb.cyMaxChild = 20;
970 rb.cyIntegral = 10;
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;
975 rb.lpText = szABC;
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;
980 rb.fMask = 0;
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;
986 rb.cxHeader = 50;
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);
990 rb.cxHeader = 5;
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;
995 rb.lpText = szABCD;
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;
1000 rb.lpText = szABC;
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)
1009 COLORSCHEME scheme;
1010 COLORREF clr;
1011 BOOL ret;
1012 HWND hRebar;
1013 REBARBANDINFOA bi;
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);
1027 if (ret)
1029 compare(scheme.clrBtnHighlight, CLR_DEFAULT, "%x");
1030 compare(scheme.clrBtnShadow, CLR_DEFAULT, "%x");
1032 else
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)
1057 WNDCLASSA wc;
1059 wc.style = CS_HREDRAW | CS_VREDRAW;
1060 wc.cbClsExtra = 0;
1061 wc.cbWndExtra = 0;
1062 wc.hInstance = GetModuleHandleA(NULL);
1063 wc.hIcon = 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)
1075 HWND hwnd;
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);
1085 return hwnd;
1088 static void test_showband(void)
1090 HWND hRebar;
1091 REBARBANDINFOA rbi;
1092 BOOL ret;
1094 hRebar = create_rebar_control();
1096 /* no bands */
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;
1102 rbi.cx = 200;
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;
1121 HWND rebar;
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);
1139 #undef X
1142 START_TEST(rebar)
1144 MSG msg;
1146 init_system_font_height();
1147 init_functions();
1149 hMainWnd = create_parent_window();
1151 test_bandinfo();
1152 test_colors();
1153 test_showband();
1154 test_notification();
1156 if(!is_font_installed("System") || !is_font_installed("Tahoma"))
1158 skip("Missing System or Tahoma font\n");
1159 goto out;
1162 test_layout();
1163 test_resize();
1165 out:
1166 PostQuitMessage(0);
1167 while(GetMessageA(&msg,0,0,0)) {
1168 TranslateMessage(&msg);
1169 DispatchMessageA(&msg);
1171 DestroyWindow(hMainWnd);