Release 1.6-rc2.
[wine/testsucceed.git] / dlls / comctl32 / tests / rebar.c
blob331af287770aaa5752fe4176cea09f43e769f558
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/test.h"
33 static RECT height_change_notify_rect;
34 static HWND hMainWnd;
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 LOGFONT *elf, const TEXTMETRIC *ntm, DWORD type, LPARAM lParam)
55 return 0;
58 static BOOL is_font_installed(const char *name)
60 HDC hdc = GetDC(0);
61 BOOL ret = FALSE;
63 if(!EnumFontFamiliesA(hdc, name, is_font_installed_proc, 0))
64 ret = TRUE;
66 ReleaseDC(0, hdc);
67 return ret;
70 static void init_system_font_height(void) {
71 HDC hDC;
72 TEXTMETRIC tm;
74 hDC = CreateCompatibleDC(NULL);
75 GetTextMetrics(hDC, &tm);
76 DeleteDC(NULL);
78 system_font_height = tm.tmHeight;
81 static HWND create_rebar_control(void)
83 HWND hwnd;
85 hwnd = CreateWindow(REBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
86 hMainWnd, (HMENU)17, GetModuleHandle(NULL), NULL);
87 ok(hwnd != NULL, "Failed to create Rebar\n");
89 SendMessageA(hwnd, WM_SETFONT, (WPARAM)GetStockObject(SYSTEM_FONT), 0);
91 return hwnd;
94 static HWND build_toolbar(int nr, HWND hParent)
96 TBBUTTON btns[8];
97 HWND hToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | CCS_NORESIZE, 0, 0, 0, 0,
98 hParent, (HMENU)5, GetModuleHandle(NULL), NULL);
99 int iBitmapId = 0;
100 int i;
102 ok(hToolbar != NULL, "Toolbar creation problem\n");
103 ok(SendMessage(hToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0) == 0, "TB_BUTTONSTRUCTSIZE failed\n");
104 ok(SendMessage(hToolbar, TB_AUTOSIZE, 0, 0) == 0, "TB_AUTOSIZE failed\n");
105 ok(SendMessage(hToolbar, WM_SETFONT, (WPARAM)GetStockObject(SYSTEM_FONT), 0)==1, "WM_SETFONT\n");
107 for (i=0; i<5+nr; i++)
109 btns[i].iBitmap = i;
110 btns[i].idCommand = i;
111 btns[i].fsStyle = BTNS_BUTTON;
112 btns[i].fsState = TBSTATE_ENABLED;
113 btns[i].iString = 0;
116 switch (nr)
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(SendMessage(hToolbar, TB_LOADIMAGES, iBitmapId, (LPARAM)HINST_COMMCTRL) == 0, "TB_LOADIMAGES failed\n");
123 ok(SendMessage(hToolbar, TB_ADDBUTTONS, 5+nr, (LPARAM)btns), "TB_ADDBUTTONS failed\n");
124 return hToolbar;
127 static int g_parent_measureitem;
129 static LRESULT CALLBACK parent_wndproc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
131 switch (msg)
133 case WM_NOTIFY:
135 NMHDR *lpnm = (NMHDR *)lParam;
136 if (lpnm->code == RBN_HEIGHTCHANGE)
137 GetClientRect(lpnm->hwndFrom, &height_change_notify_rect);
139 break;
140 case WM_MEASUREITEM:
141 g_parent_measureitem++;
142 break;
144 return DefWindowProcA(hWnd, msg, wParam, lParam);
147 #if 0 /* use this to generate more tests*/
149 static void dump_sizes(HWND hRebar)
151 SIZE sz;
152 RECT r;
153 int count;
154 int i, h;
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);
160 if (count == 0)
161 printf("0, ");
162 for (i = 0; i < count; i++) /* rows */
163 printf("%d, ", SendMessageA(hRebar, RB_GETROWHEIGHT, i, 0));
164 printf("}, ");
166 count = SendMessageA(hRebar, RB_GETBANDCOUNT, 0, 0);
167 printf("%d, {", count);
168 if (count == 0)
169 printf("{{0, 0, 0, 0}, 0, 0},");
170 for (i=0; i<count; i++)
172 REBARBANDINFO rbi;
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_GETBANDINFO 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,
178 rbi.fStyle, rbi.cx);
180 printf("\n }, },\n");
183 #define check_sizes() dump_sizes(hRebar);
184 #define check_sizes_todo(todomask) dump_sizes(hRebar);
186 #else
188 static int string_width(const CHAR *s) {
189 SIZE sz;
190 HDC hdc;
192 hdc = CreateCompatibleDC(NULL);
193 GetTextExtentPoint32A(hdc, s, strlen(s), &sz);
194 DeleteDC(hdc);
196 return sz.cx;
199 typedef struct {
200 RECT rc;
201 DWORD fStyle;
202 UINT cx;
203 } rbband_result_t;
205 typedef struct {
206 RECT rcClient;
207 int cyBarHeight;
208 int nRows;
209 int *cyRowHeights;
210 int nBands;
211 rbband_result_t *bands;
212 } rbsize_result_t;
214 static rbsize_result_t rbsize_init(int cleft, int ctop, int cright, int cbottom, int cyBarHeight, int nRows, int nBands)
216 rbsize_result_t ret;
218 SetRect(&ret.rcClient, cleft, ctop, cright, cbottom);
219 ret.cyBarHeight = cyBarHeight;
220 ret.nRows = 0;
221 ret.cyRowHeights = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nRows*sizeof(int));
222 ret.nBands = 0;
223 ret.bands = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nBands*sizeof(rbband_result_t));
225 return ret;
228 static void rbsize_add_row(rbsize_result_t *rbsr, int rowHeight) {
229 rbsr->cyRowHeights[rbsr->nRows] = rowHeight;
230 rbsr->nRows++;
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;
238 rbsr->nBands++;
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)
431 int i;
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) { \
444 RECT rc; \
445 REBARBANDINFO 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 = SendMessage(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 = SendMessage(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_GETBANDINFO, i, (LPARAM)&rbi) == 1, "RB_GETBANDINFO\n"); \
465 compare(rbi.fStyle, res->bands[i].fStyle, "%x"); \
466 compare(rbi.cx, res->bands[i].cx, "%d"); \
468 rbsize_numtests++; \
471 #define check_sizes() check_sizes_todo(0)
473 #endif
475 static void add_band_w(HWND hRebar, LPCSTR lpszText, int cxMinChild, int cx, int cxIdeal)
477 CHAR buffer[MAX_PATH];
478 REBARBANDINFOA rbi;
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;
484 rbi.cx = cx;
485 rbi.cxMinChild = cxMinChild;
486 rbi.cxIdeal = cxIdeal;
487 rbi.cyMinChild = 20;
488 rbi.hwndChild = build_toolbar(1, hRebar);
489 rbi.lpText = (lpszText ? buffer : NULL);
490 SendMessage(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
493 static void test_layout(void)
495 HWND hRebar;
496 REBARBANDINFO rbi;
497 HIMAGELIST himl;
498 REBARINFO ri;
500 rbsize_results_init();
502 hRebar = create_rebar_control();
503 check_sizes();
504 rbi.cbSize = REBARBANDINFOA_V6_SIZE;
505 rbi.fMask = RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_CHILD;
506 rbi.cx = 200;
507 rbi.cxMinChild = 100;
508 rbi.cyMinChild = 30;
509 rbi.hwndChild = NULL;
510 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
511 check_sizes();
513 rbi.fMask |= RBBIM_STYLE;
514 rbi.fStyle = RBBS_CHILDEDGE;
515 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
516 check_sizes();
518 rbi.fStyle = 0;
519 rbi.cx = 200;
520 rbi.cxMinChild = 30;
521 rbi.cyMinChild = 30;
522 rbi.hwndChild = build_toolbar(0, hRebar);
523 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
524 check_sizes();
526 rbi.fStyle = RBBS_CHILDEDGE;
527 rbi.cx = 68;
528 rbi.hwndChild = build_toolbar(0, hRebar);
529 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
530 check_sizes();
532 SetWindowLong(hRebar, GWL_STYLE, GetWindowLong(hRebar, GWL_STYLE) | RBS_BANDBORDERS);
533 check_sizes(); /* a style change won't start a relayout */
534 rbi.fMask = RBBIM_SIZE;
535 rbi.cx = 66;
536 SendMessageA(hRebar, RB_SETBANDINFO, 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;
541 rbi.cx = 200;
542 rbi.cxMinChild = 400;
543 rbi.cyMinChild = 30;
544 rbi.hwndChild = build_toolbar(0, hRebar);
545 SendMessageA(hRebar, RB_INSERTBAND, 1, (LPARAM)&rbi);
546 check_sizes();
548 rbi.fMask = RBBIM_STYLE;
549 rbi.fStyle = RBBS_HIDDEN;
550 SendMessageA(hRebar, RB_SETBANDINFO, 2, (LPARAM)&rbi);
551 check_sizes();
553 SendMessageA(hRebar, RB_DELETEBAND, 2, 0);
554 check_sizes();
555 SendMessageA(hRebar, RB_DELETEBAND, 0, 0);
556 check_sizes();
557 SendMessageA(hRebar, RB_DELETEBAND, 1, 0);
558 check_sizes();
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);
568 check_sizes();
569 SendMessageA(hRebar, RB_MAXIMIZEBAND, 1, TRUE);
570 check_sizes();
571 SendMessageA(hRebar, RB_MAXIMIZEBAND, 1, TRUE);
572 check_sizes();
573 SendMessageA(hRebar, RB_MAXIMIZEBAND, 2, FALSE);
574 check_sizes();
575 SendMessageA(hRebar, RB_MINIMIZEBAND, 2, 0);
576 check_sizes();
577 SendMessageA(hRebar, RB_MINIMIZEBAND, 0, 0);
578 check_sizes();
580 /* an image will increase the band height */
581 himl = ImageList_LoadImage(LoadLibrary("comctl32"), MAKEINTRESOURCE(121), 24, 2, CLR_NONE, IMAGE_BITMAP, LR_DEFAULTCOLOR);
582 ri.cbSize = sizeof(ri);
583 ri.fMask = RBIM_IMAGELIST;
584 ri.himl = himl;
585 ok(SendMessage(hRebar, RB_SETBARINFO, 0, (LPARAM)&ri), "RB_SETBARINFO failed\n");
586 rbi.fMask = RBBIM_IMAGE;
587 rbi.iImage = 1;
588 SendMessage(hRebar, RB_SETBANDINFO, 1, (LPARAM)&rbi);
589 check_sizes();
591 /* after removing it everything is back to normal*/
592 rbi.iImage = -1;
593 SendMessage(hRebar, RB_SETBANDINFO, 1, (LPARAM)&rbi);
594 check_sizes();
596 /* Only -1 means that the image is not present. Other invalid values increase the height */
597 rbi.iImage = -2;
598 SendMessage(hRebar, RB_SETBANDINFO, 1, (LPARAM)&rbi);
599 check_sizes();
601 DestroyWindow(hRebar);
603 /* VARHEIGHT resizing test on a horizontal rebar */
604 hRebar = create_rebar_control();
605 SetWindowLong(hRebar, GWL_STYLE, GetWindowLong(hRebar, GWL_STYLE) | RBS_AUTOSIZE);
606 check_sizes();
607 rbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_STYLE;
608 rbi.fStyle = RBBS_VARIABLEHEIGHT;
609 rbi.cxMinChild = 50;
610 rbi.cyMinChild = 10;
611 rbi.cyIntegral = 11;
612 rbi.cyChild = 70;
613 rbi.cyMaxChild = 200;
614 rbi.cx = 90;
615 rbi.hwndChild = build_toolbar(0, hRebar);
616 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
618 rbi.cyChild = 50;
619 rbi.hwndChild = build_toolbar(0, hRebar);
620 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
622 rbi.cyMinChild = 40;
623 rbi.cyChild = 50;
624 rbi.cyIntegral = 5;
625 rbi.hwndChild = build_toolbar(0, hRebar);
626 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
627 check_sizes();
629 DestroyWindow(hRebar);
631 /* VARHEIGHT resizing on a vertical rebar */
632 hRebar = create_rebar_control();
633 SetWindowLong(hRebar, GWL_STYLE, GetWindowLong(hRebar, GWL_STYLE) | CCS_VERT | RBS_AUTOSIZE);
634 check_sizes();
635 rbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_STYLE;
636 rbi.fStyle = RBBS_VARIABLEHEIGHT;
637 rbi.cxMinChild = 50;
638 rbi.cyMinChild = 10;
639 rbi.cyIntegral = 11;
640 rbi.cyChild = 70;
641 rbi.cyMaxChild = 90;
642 rbi.cx = 90;
643 rbi.hwndChild = build_toolbar(0, hRebar);
644 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
645 check_sizes();
647 rbi.cyChild = 50;
648 rbi.hwndChild = build_toolbar(0, hRebar);
649 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
650 check_sizes();
652 rbi.cyMinChild = 40;
653 rbi.cyChild = 50;
654 rbi.cyIntegral = 5;
655 rbi.hwndChild = build_toolbar(0, hRebar);
656 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
657 check_sizes();
659 rbsize_results_free();
660 DestroyWindow(hRebar);
661 ImageList_Destroy(himl);
664 #if 0 /* use this to generate more tests */
666 static void dump_client(HWND hRebar)
668 RECT r;
669 BOOL notify;
670 GetWindowRect(hRebar, &r);
671 MapWindowPoints(HWND_DESKTOP, hMainWnd, &r, 2);
672 if (height_change_notify_rect.top != -1)
674 RECT rcClient;
675 GetClientRect(hRebar, &rcClient);
676 assert(EqualRect(&rcClient, &height_change_notify_rect));
677 notify = TRUE;
679 else
680 notify = FALSE;
681 printf(" {{%d, %d, %d, %d}, %d, %s},\n", r.left, r.top, r.right, r.bottom, SendMessage(hRebar, RB_GETROWCOUNT, 0, 0),
682 notify ? "TRUE" : "FALSE");
683 SetRect(&height_change_notify_rect, -1, -1, -1, -1);
686 #define comment(fmt, arg1) printf("/* " fmt " */\n", arg1);
687 #define check_client() dump_client(hRebar)
689 #else
691 typedef struct {
692 RECT rc;
693 INT iNumRows;
694 BOOL heightNotify;
695 } rbresize_test_result_t;
697 static const rbresize_test_result_t resize_results[] = {
698 /* style 00000001 */
699 {{0, 2, 672, 2}, 0, FALSE},
700 {{0, 2, 672, 22}, 1, TRUE},
701 {{0, 2, 672, 22}, 1, FALSE},
702 {{0, 2, 672, 22}, 1, FALSE},
703 {{0, 2, 672, 22}, 1, FALSE},
704 {{0, 2, 672, 22}, 0, FALSE},
705 /* style 00000041 */
706 {{0, 0, 672, 0}, 0, FALSE},
707 {{0, 0, 672, 20}, 1, TRUE},
708 {{0, 0, 672, 20}, 1, FALSE},
709 {{0, 0, 672, 20}, 1, FALSE},
710 {{0, 0, 672, 20}, 1, FALSE},
711 {{0, 0, 672, 20}, 0, FALSE},
712 /* style 00000003 */
713 {{0, 226, 672, 226}, 0, FALSE},
714 {{0, 206, 672, 226}, 1, TRUE},
715 {{0, 206, 672, 226}, 1, FALSE},
716 {{0, 206, 672, 226}, 1, FALSE},
717 {{0, 206, 672, 226}, 1, FALSE},
718 {{0, 206, 672, 226}, 0, FALSE},
719 /* style 00000043 */
720 {{0, 226, 672, 226}, 0, FALSE},
721 {{0, 206, 672, 226}, 1, TRUE},
722 {{0, 206, 672, 226}, 1, FALSE},
723 {{0, 206, 672, 226}, 1, FALSE},
724 {{0, 206, 672, 226}, 1, FALSE},
725 {{0, 206, 672, 226}, 0, FALSE},
726 /* style 00000080 */
727 {{2, 0, 2, 226}, 0, FALSE},
728 {{2, 0, 22, 226}, 1, TRUE},
729 {{2, 0, 22, 226}, 1, FALSE},
730 {{2, 0, 22, 226}, 1, FALSE},
731 {{2, 0, 22, 226}, 1, FALSE},
732 {{2, 0, 22, 226}, 0, FALSE},
733 /* style 00000083 */
734 {{672, 0, 672, 226}, 0, FALSE},
735 {{652, 0, 672, 226}, 1, TRUE},
736 {{652, 0, 672, 226}, 1, FALSE},
737 {{652, 0, 672, 226}, 1, FALSE},
738 {{652, 0, 672, 226}, 1, FALSE},
739 {{652, 0, 672, 226}, 0, FALSE},
740 /* style 00000008 */
741 {{10, 11, 510, 11}, 0, FALSE},
742 {{10, 15, 510, 35}, 1, TRUE},
743 {{10, 17, 510, 37}, 1, FALSE},
744 {{10, 14, 110, 54}, 2, TRUE},
745 {{0, 4, 0, 44}, 2, FALSE},
746 {{0, 6, 0, 46}, 2, FALSE},
747 {{0, 8, 0, 48}, 2, FALSE},
748 {{0, 12, 0, 32}, 1, TRUE},
749 {{0, 4, 100, 24}, 0, FALSE},
750 /* style 00000048 */
751 {{10, 5, 510, 5}, 0, FALSE},
752 {{10, 5, 510, 25}, 1, TRUE},
753 {{10, 5, 510, 25}, 1, FALSE},
754 {{10, 10, 110, 50}, 2, TRUE},
755 {{0, 0, 0, 40}, 2, FALSE},
756 {{0, 0, 0, 40}, 2, FALSE},
757 {{0, 0, 0, 40}, 2, FALSE},
758 {{0, 0, 0, 20}, 1, TRUE},
759 {{0, 0, 100, 20}, 0, FALSE},
760 /* style 00000004 */
761 {{10, 5, 510, 20}, 0, FALSE},
762 {{10, 5, 510, 20}, 1, TRUE},
763 {{10, 10, 110, 110}, 2, TRUE},
764 {{0, 0, 0, 0}, 2, FALSE},
765 {{0, 0, 0, 0}, 2, FALSE},
766 {{0, 0, 0, 0}, 2, FALSE},
767 {{0, 0, 0, 0}, 1, TRUE},
768 {{0, 0, 100, 100}, 0, FALSE},
769 /* style 00000002 */
770 {{0, 5, 672, 5}, 0, FALSE},
771 {{0, 5, 672, 25}, 1, TRUE},
772 {{0, 10, 672, 30}, 1, FALSE},
773 {{0, 0, 672, 20}, 1, FALSE},
774 {{0, 0, 672, 20}, 1, FALSE},
775 {{0, 0, 672, 20}, 0, FALSE},
776 /* style 00000082 */
777 {{10, 0, 10, 226}, 0, FALSE},
778 {{10, 0, 30, 226}, 1, TRUE},
779 {{10, 0, 30, 226}, 1, FALSE},
780 {{0, 0, 20, 226}, 1, FALSE},
781 {{0, 0, 20, 226}, 1, FALSE},
782 {{0, 0, 20, 226}, 0, FALSE},
783 /* style 00800001 */
784 {{-2, 0, 674, 4}, 0, FALSE},
785 {{-2, 0, 674, 24}, 1, TRUE},
786 {{-2, 0, 674, 24}, 1, FALSE},
787 {{-2, 0, 674, 24}, 1, FALSE},
788 {{-2, 0, 674, 24}, 1, FALSE},
789 {{-2, 0, 674, 24}, 0, FALSE},
790 /* style 00800048 */
791 {{10, 5, 510, 9}, 0, FALSE},
792 {{10, 5, 510, 29}, 1, TRUE},
793 {{10, 5, 510, 29}, 1, FALSE},
794 {{10, 10, 110, 54}, 2, TRUE},
795 {{0, 0, 0, 44}, 2, FALSE},
796 {{0, 0, 0, 44}, 2, FALSE},
797 {{0, 0, 0, 44}, 2, FALSE},
798 {{0, 0, 0, 24}, 1, TRUE},
799 {{0, 0, 100, 24}, 0, FALSE},
800 /* style 00800004 */
801 {{10, 5, 510, 20}, 0, FALSE},
802 {{10, 5, 510, 20}, 1, TRUE},
803 {{10, 10, 110, 110}, 2, TRUE},
804 {{0, 0, 0, 0}, 2, FALSE},
805 {{0, 0, 0, 0}, 2, FALSE},
806 {{0, 0, 0, 0}, 2, FALSE},
807 {{0, 0, 0, 0}, 1, TRUE},
808 {{0, 0, 100, 100}, 0, FALSE},
809 /* style 00800002 */
810 {{-2, 5, 674, 9}, 0, FALSE},
811 {{-2, 5, 674, 29}, 1, TRUE},
812 {{-2, 10, 674, 34}, 1, FALSE},
813 {{-2, 0, 674, 24}, 1, FALSE},
814 {{-2, 0, 674, 24}, 1, FALSE},
815 {{-2, 0, 674, 24}, 0, FALSE},
818 static DWORD resize_numtests = 0;
820 #define comment(fmt, arg1)
821 #define check_client() { \
822 RECT r; \
823 int value; \
824 const rbresize_test_result_t *res = &resize_results[resize_numtests++]; \
825 assert(resize_numtests <= sizeof(resize_results)/sizeof(resize_results[0])); \
826 GetWindowRect(hRebar, &r); \
827 MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); \
828 if ((dwStyles[i] & (CCS_NOPARENTALIGN|CCS_NODIVIDER)) == CCS_NOPARENTALIGN) {\
829 check_rect_no_top("client", r, res->rc); /* the top coordinate changes after every layout and is very implementation-dependent */ \
830 } else { \
831 check_rect("client", r, res->rc); \
833 value = (int)SendMessage(hRebar, RB_GETROWCOUNT, 0, 0); \
834 ok(res->iNumRows == value, "RB_GETROWCOUNT expected %d got %d\n", res->iNumRows, value); \
835 if (res->heightNotify) { \
836 RECT rcClient; \
837 GetClientRect(hRebar, &rcClient); \
838 check_rect("notify", height_change_notify_rect, rcClient); \
839 } else ok(height_change_notify_rect.top == -1, "Unexpected RBN_HEIGHTCHANGE received\n"); \
840 SetRect(&height_change_notify_rect, -1, -1, -1, -1); \
843 #endif
845 static void test_resize(void)
847 DWORD dwStyles[] = {CCS_TOP, CCS_TOP | CCS_NODIVIDER, CCS_BOTTOM, CCS_BOTTOM | CCS_NODIVIDER, CCS_VERT, CCS_RIGHT,
848 CCS_NOPARENTALIGN, CCS_NOPARENTALIGN | CCS_NODIVIDER, CCS_NORESIZE, CCS_NOMOVEY, CCS_NOMOVEY | CCS_VERT,
849 CCS_TOP | WS_BORDER, CCS_NOPARENTALIGN | CCS_NODIVIDER | WS_BORDER, CCS_NORESIZE | WS_BORDER,
850 CCS_NOMOVEY | WS_BORDER};
852 const int styles_count = sizeof(dwStyles) / sizeof(dwStyles[0]);
853 int i;
855 for (i = 0; i < styles_count; i++)
857 HWND hRebar;
859 comment("style %08x", dwStyles[i]);
860 SetRect(&height_change_notify_rect, -1, -1, -1, -1);
861 hRebar = CreateWindow(REBARCLASSNAME, "A", dwStyles[i] | WS_CHILD | WS_VISIBLE, 10, 5, 500, 15, hMainWnd, NULL, GetModuleHandle(NULL), 0);
862 check_client();
863 add_band_w(hRebar, NULL, 70, 100, 0);
864 if (dwStyles[i] & CCS_NOPARENTALIGN) /* the window drifts downward for CCS_NOPARENTALIGN without CCS_NODIVIDER */
865 check_client();
866 add_band_w(hRebar, NULL, 70, 100, 0);
867 check_client();
868 MoveWindow(hRebar, 10, 10, 100, 100, TRUE);
869 check_client();
870 MoveWindow(hRebar, 0, 0, 0, 0, TRUE);
871 check_client();
872 /* try to fool the rebar by sending invalid width/height - won't work */
873 if (dwStyles[i] & (CCS_NORESIZE | CCS_NOPARENTALIGN))
875 WINDOWPOS pos;
876 pos.hwnd = hRebar;
877 pos.hwndInsertAfter = NULL;
878 pos.cx = 500;
879 pos.cy = 500;
880 pos.x = 10;
881 pos.y = 10;
882 pos.flags = 0;
883 SendMessage(hRebar, WM_WINDOWPOSCHANGING, 0, (LPARAM)&pos);
884 SendMessage(hRebar, WM_WINDOWPOSCHANGED, 0, (LPARAM)&pos);
885 check_client();
886 SendMessage(hRebar, WM_SIZE, SIZE_RESTORED, MAKELONG(500, 500));
887 check_client();
889 SendMessage(hRebar, RB_DELETEBAND, 0, 0);
890 check_client();
891 SendMessage(hRebar, RB_DELETEBAND, 0, 0);
892 MoveWindow(hRebar, 0, 0, 100, 100, TRUE);
893 check_client();
894 DestroyWindow(hRebar);
898 static void expect_band_content_(int line, HWND hRebar, UINT uBand, INT fStyle, COLORREF clrFore,
899 COLORREF clrBack, LPCSTR lpText, int iImage, HWND hwndChild,
900 INT cxMinChild, INT cyMinChild, INT cx, HBITMAP hbmBack, INT wID,
901 INT cyChild, INT cyMaxChild, INT cyIntegral, INT cxIdeal, LPARAM lParam,
902 UINT cxHeader, UINT cxHeader_broken)
904 CHAR buf[MAX_PATH] = "abc";
905 REBARBANDINFOA rb;
907 memset(&rb, 0xdd, sizeof(rb));
908 rb.cbSize = REBARBANDINFOA_V6_SIZE;
909 rb.fMask = RBBIM_BACKGROUND | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_COLORS
910 | RBBIM_HEADERSIZE | RBBIM_ID | RBBIM_IDEALSIZE | RBBIM_IMAGE | RBBIM_LPARAM
911 | RBBIM_SIZE | RBBIM_STYLE | RBBIM_TEXT;
912 rb.lpText = buf;
913 rb.cch = MAX_PATH;
914 ok(SendMessageA(hRebar, RB_GETBANDINFOA, uBand, (LPARAM)&rb), "RB_GETBANDINFO failed from line %d\n", line);
915 expect_eq(line, rb.fStyle, fStyle, int, "%x");
916 expect_eq(line, rb.clrFore, clrFore, COLORREF, "%x");
917 expect_eq(line, rb.clrBack, clrBack, COLORREF, "%x");
918 expect_eq(line, strcmp(rb.lpText, lpText), 0, int, "%d");
919 expect_eq(line, rb.iImage, iImage, int, "%x");
920 expect_eq(line, rb.hwndChild, hwndChild, HWND, "%p");
921 expect_eq(line, rb.cxMinChild, cxMinChild, int, "%d");
922 expect_eq(line, rb.cyMinChild, cyMinChild, int, "%d");
923 expect_eq(line, rb.cx, cx, int, "%d");
924 expect_eq(line, rb.hbmBack, hbmBack, HBITMAP, "%p");
925 expect_eq(line, rb.wID, wID, int, "%d");
926 /* the values of cyChild, cyMaxChild and cyIntegral can't be read unless the band is RBBS_VARIABLEHEIGHT */
927 expect_eq(line, rb.cyChild, cyChild, int, "%x");
928 expect_eq(line, rb.cyMaxChild, cyMaxChild, int, "%x");
929 expect_eq(line, rb.cyIntegral, cyIntegral, int, "%x");
930 expect_eq(line, rb.cxIdeal, cxIdeal, int, "%d");
931 expect_eq(line, rb.lParam, lParam, LPARAM, "%ld");
932 ok(rb.cxHeader == cxHeader || rb.cxHeader == cxHeader + 1 || broken(rb.cxHeader == cxHeader_broken),
933 "expected %d for %d from line %d\n", cxHeader, rb.cxHeader, line);
936 #define expect_band_content(hRebar, uBand, fStyle, clrFore, clrBack,\
937 lpText, iImage, hwndChild, cxMinChild, cyMinChild, cx, hbmBack, wID,\
938 cyChild, cyMaxChild, cyIntegral, cxIdeal, lParam, cxHeader, cxHeader_broken) \
939 expect_band_content_(__LINE__, hRebar, uBand, fStyle, clrFore, clrBack,\
940 lpText, iImage, hwndChild, cxMinChild, cyMinChild, cx, hbmBack, wID,\
941 cyChild, cyMaxChild, cyIntegral, cxIdeal, lParam, cxHeader, cxHeader_broken)
943 static void test_bandinfo(void)
945 REBARBANDINFOA rb;
946 CHAR szABC[] = "ABC";
947 CHAR szABCD[] = "ABCD";
948 HWND hRebar;
950 hRebar = create_rebar_control();
951 rb.cbSize = REBARBANDINFOA_V6_SIZE;
952 rb.fMask = 0;
953 if (!SendMessageA(hRebar, RB_INSERTBANDA, 0, (LPARAM)&rb))
955 win_skip( "V6 info not supported\n" );
956 DestroyWindow(hRebar);
957 return;
959 expect_band_content(hRebar, 0, 0, 0, GetSysColor(COLOR_3DFACE), "", -1, NULL, 0, 0, 0, NULL, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 0, -1);
961 rb.fMask = RBBIM_CHILDSIZE;
962 rb.cxMinChild = 15;
963 rb.cyMinChild = 20;
964 rb.cyChild = 30;
965 rb.cyMaxChild = 20;
966 rb.cyIntegral = 10;
967 ok(SendMessageA(hRebar, RB_SETBANDINFOA, 0, (LPARAM)&rb), "RB_SETBANDINFO failed\n");
968 expect_band_content(hRebar, 0, 0, 0, GetSysColor(COLOR_3DFACE), "", -1, NULL, 15, 20, 0, NULL, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 0, -1);
970 rb.fMask = RBBIM_TEXT;
971 rb.lpText = szABC;
972 ok(SendMessageA(hRebar, RB_SETBANDINFOA, 0, (LPARAM)&rb), "RB_SETBANDINFO failed\n");
973 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);
975 rb.cbSize = REBARBANDINFOA_V6_SIZE;
976 rb.fMask = 0;
977 ok(SendMessageA(hRebar, RB_INSERTBANDA, 1, (LPARAM)&rb), "RB_INSERTBAND failed\n");
978 expect_band_content(hRebar, 1, 0, 0, GetSysColor(COLOR_3DFACE), "", -1, NULL, 0, 0, 0, NULL, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 9, -1);
979 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);
981 rb.fMask = RBBIM_HEADERSIZE;
982 rb.cxHeader = 50;
983 ok(SendMessageA(hRebar, RB_SETBANDINFOA, 0, (LPARAM)&rb), "RB_SETBANDINFO failed\n");
984 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);
986 rb.cxHeader = 5;
987 ok(SendMessageA(hRebar, RB_SETBANDINFOA, 0, (LPARAM)&rb), "RB_SETBANDINFO 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, 5, -1);
990 rb.fMask = RBBIM_TEXT;
991 rb.lpText = szABCD;
992 ok(SendMessageA(hRebar, RB_SETBANDINFOA, 0, (LPARAM)&rb), "RB_SETBANDINFO failed\n");
993 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);
994 rb.fMask = RBBIM_STYLE | RBBIM_TEXT;
995 rb.fStyle = RBBS_VARIABLEHEIGHT;
996 rb.lpText = szABC;
997 ok(SendMessageA(hRebar, RB_SETBANDINFOA, 0, (LPARAM)&rb), "RB_SETBANDINFO failed\n");
998 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);
1000 DestroyWindow(hRebar);
1003 static void test_colors(void)
1005 COLORSCHEME scheme;
1006 COLORREF clr;
1007 BOOL ret;
1008 HWND hRebar;
1009 REBARBANDINFOA bi;
1011 hRebar = create_rebar_control();
1013 /* test default colors */
1014 clr = SendMessage(hRebar, RB_GETTEXTCOLOR, 0, 0);
1015 compare(clr, CLR_NONE, "%x");
1016 clr = SendMessage(hRebar, RB_GETBKCOLOR, 0, 0);
1017 compare(clr, CLR_NONE, "%x");
1019 scheme.dwSize = sizeof(scheme);
1020 scheme.clrBtnHighlight = 0;
1021 scheme.clrBtnShadow = 0;
1022 ret = SendMessage(hRebar, RB_GETCOLORSCHEME, 0, (LPARAM)&scheme);
1023 if (ret)
1025 compare(scheme.clrBtnHighlight, CLR_DEFAULT, "%x");
1026 compare(scheme.clrBtnShadow, CLR_DEFAULT, "%x");
1028 else
1029 skip("RB_GETCOLORSCHEME not supported\n");
1031 /* check default band colors */
1032 add_band_w(hRebar, "", 0, 10, 10);
1033 bi.cbSize = REBARBANDINFOA_V6_SIZE;
1034 bi.fMask = RBBIM_COLORS;
1035 bi.clrFore = bi.clrBack = 0xc0ffe;
1036 ret = SendMessage(hRebar, RB_GETBANDINFO, 0, (LPARAM)&bi);
1037 ok(ret, "RB_GETBANDINFO failed\n");
1038 compare(bi.clrFore, RGB(0, 0, 0), "%x");
1039 compare(bi.clrBack, GetSysColor(COLOR_3DFACE), "%x");
1041 SendMessage(hRebar, RB_SETTEXTCOLOR, 0, RGB(255, 0, 0));
1042 bi.clrFore = bi.clrBack = 0xc0ffe;
1043 ret = SendMessage(hRebar, RB_GETBANDINFO, 0, (LPARAM)&bi);
1044 ok(ret, "RB_GETBANDINFO failed\n");
1045 compare(bi.clrFore, RGB(0, 0, 0), "%x");
1047 DestroyWindow(hRebar);
1051 static BOOL register_parent_wnd_class(void)
1053 WNDCLASSA wc;
1055 wc.style = CS_HREDRAW | CS_VREDRAW;
1056 wc.cbClsExtra = 0;
1057 wc.cbWndExtra = 0;
1058 wc.hInstance = GetModuleHandleA(NULL);
1059 wc.hIcon = NULL;
1060 wc.hCursor = LoadCursorA(NULL, IDC_IBEAM);
1061 wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
1062 wc.lpszMenuName = NULL;
1063 wc.lpszClassName = "MyTestWnd";
1064 wc.lpfnWndProc = parent_wndproc;
1066 return RegisterClassA(&wc);
1069 static HWND create_parent_window(void)
1071 HWND hwnd;
1073 if (!register_parent_wnd_class()) return NULL;
1075 hwnd = CreateWindowExA(0, "MyTestWnd", "Blah", WS_OVERLAPPEDWINDOW,
1076 CW_USEDEFAULT, CW_USEDEFAULT, 672+2*GetSystemMetrics(SM_CXSIZEFRAME),
1077 226+GetSystemMetrics(SM_CYCAPTION)+2*GetSystemMetrics(SM_CYSIZEFRAME),
1078 NULL, NULL, GetModuleHandleA(NULL), 0);
1080 ShowWindow(hwnd, SW_SHOW);
1081 return hwnd;
1084 static void test_showband(void)
1086 HWND hRebar;
1087 REBARBANDINFOA rbi;
1088 BOOL ret;
1090 hRebar = create_rebar_control();
1092 /* no bands */
1093 ret = SendMessageA(hRebar, RB_SHOWBAND, 0, TRUE);
1094 ok(ret == FALSE, "got %d\n", ret);
1096 rbi.cbSize = REBARBANDINFOA_V6_SIZE;
1097 rbi.fMask = RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_CHILD;
1098 rbi.cx = 200;
1099 rbi.cxMinChild = 100;
1100 rbi.cyMinChild = 30;
1101 rbi.hwndChild = NULL;
1102 SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi);
1104 /* index out of range */
1105 ret = SendMessageA(hRebar, RB_SHOWBAND, 1, TRUE);
1106 ok(ret == FALSE, "got %d\n", ret);
1108 ret = SendMessageA(hRebar, RB_SHOWBAND, 0, TRUE);
1109 ok(ret == TRUE, "got %d\n", ret);
1111 DestroyWindow(hRebar);
1114 static void test_notification(void)
1116 MEASUREITEMSTRUCT mis;
1117 HWND rebar;
1119 rebar = create_rebar_control();
1121 g_parent_measureitem = 0;
1122 SendMessageA(rebar, WM_MEASUREITEM, 0, (LPARAM)&mis);
1123 ok(g_parent_measureitem == 1, "got %d\n", g_parent_measureitem);
1125 DestroyWindow(rebar);
1128 START_TEST(rebar)
1130 HMODULE hComctl32;
1131 BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*);
1132 INITCOMMONCONTROLSEX iccex;
1133 MSG msg;
1135 init_system_font_height();
1137 /* LoadLibrary is needed. This file has no reference to functions in comctl32 */
1138 hComctl32 = LoadLibraryA("comctl32.dll");
1139 pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx");
1140 if (!pInitCommonControlsEx)
1142 win_skip("InitCommonControlsEx() is missing. Skipping the tests\n");
1143 return;
1145 iccex.dwSize = sizeof(iccex);
1146 iccex.dwICC = ICC_COOL_CLASSES;
1147 pInitCommonControlsEx(&iccex);
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);
1173 FreeLibrary(hComctl32);