1 /* Unit tests for the track bar control. 2 * 3 * Copyright 2007 Keith Stevens 4 * 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. 9 * 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. 14 * 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 18 */ 19 20 #include "precomp.h" 21 22 #define expect(expected, got) ok(got == expected, "Expected %d, got %d\n", expected, got) 23 #define NUM_MSG_SEQUENCE 2 24 #define PARENT_SEQ_INDEX 0 25 #define TRACKBAR_SEQ_INDEX 1 26 27 static const DWORD defaultstyle = WS_VISIBLE | TBS_TOOLTIPS | TBS_ENABLESELRANGE | TBS_FIXEDLENGTH | TBS_AUTOTICKS; 28 static HWND hWndParent; 29 30 static LRESULT WINAPI trackbar_no_wmpaint_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 31 { 32 WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA); 33 34 if (message == WM_PAINT) 35 return 0; 36 37 return CallWindowProcA(oldproc, hwnd, message, wParam, lParam); 38 } 39 40 static struct msg_sequence *sequences[NUM_MSG_SEQUENCE]; 41 42 static const struct message empty_seq[] = { 43 {0} 44 }; 45 46 static const struct message parent_create_trackbar_wnd_seq[] = { 47 { WM_NOTIFYFORMAT, sent}, 48 { WM_QUERYUISTATE, sent|optional}, 49 { WM_WINDOWPOSCHANGING, sent}, 50 { WM_NCACTIVATE, sent}, 51 { PBT_APMRESUMECRITICAL, sent}, 52 { WM_WINDOWPOSCHANGING, sent}, 53 { PBT_APMRESUMESTANDBY, sent}, 54 { WM_IME_SETCONTEXT, sent|optional}, 55 { WM_IME_NOTIFY, sent|optional}, 56 { WM_CTLCOLORSTATIC, sent}, 57 { WM_NOTIFY, sent}, 58 {0} 59 }; 60 61 static const struct message parent_new_window_test_seq[] = { 62 { WM_QUERYNEWPALETTE, sent|optional }, 63 { WM_WINDOWPOSCHANGING, sent|optional}, 64 { WM_NCACTIVATE, sent|optional}, 65 { PBT_APMRESUMECRITICAL, sent|optional}, 66 { WM_IME_SETCONTEXT, sent|defwinproc|optional}, 67 { WM_IME_NOTIFY, sent|defwinproc|optional}, 68 { WM_SETFOCUS, sent|defwinproc|optional}, 69 { WM_NOTIFYFORMAT, sent}, 70 { WM_QUERYUISTATE, sent|optional}, 71 {0} 72 }; 73 74 static const struct message buddy_window_test_seq[] = { 75 { TBM_GETBUDDY, sent|wparam, TRUE}, 76 { TBM_SETBUDDY, sent|wparam, FALSE}, 77 { WM_PAINT, sent|defwinproc}, 78 { TBM_SETBUDDY, sent|wparam, FALSE}, 79 { WM_PAINT, sent|defwinproc}, 80 { TBM_GETBUDDY, sent|wparam, TRUE}, 81 { TBM_SETBUDDY, sent|wparam, TRUE}, 82 { WM_PAINT, sent|defwinproc}, 83 { TBM_SETBUDDY, sent|wparam, TRUE}, 84 { WM_PAINT, sent|defwinproc}, 85 { TBM_GETBUDDY, sent|wparam, FALSE}, 86 { TBM_GETBUDDY, sent|wparam, TRUE}, 87 {0} 88 }; 89 90 static const struct message parent_buddy_window_test_seq[] = { 91 { WM_CTLCOLORSTATIC, sent}, 92 { WM_NOTIFY, sent}, 93 { WM_CTLCOLORSTATIC, sent}, 94 { WM_NOTIFY, sent}, 95 { WM_CTLCOLORSTATIC, sent}, 96 { WM_NOTIFY, sent}, 97 { WM_CTLCOLORSTATIC, sent}, 98 { WM_NOTIFY, sent}, 99 {0} 100 }; 101 102 static const struct message line_size_test_seq[] = { 103 { TBM_SETLINESIZE, sent|lparam, 0, 10}, 104 { TBM_SETLINESIZE, sent|lparam, 0, 4}, 105 { TBM_GETLINESIZE, sent}, 106 {0} 107 }; 108 109 static const struct message page_size_test_seq[] = { 110 { TBM_SETPAGESIZE, sent|lparam, 0, 10}, 111 { TBM_SETPAGESIZE, sent|lparam, 0, -1}, 112 { TBM_GETPAGESIZE, sent}, 113 {0} 114 }; 115 116 static const struct message position_test_seq[] = { 117 { TBM_SETPOS, sent|wparam|lparam, TRUE, -1}, 118 { WM_PAINT, sent|defwinproc}, 119 { TBM_GETPOS, sent}, 120 { TBM_SETPOS, sent|wparam|lparam, TRUE, 5}, 121 { WM_PAINT, sent|defwinproc}, 122 { TBM_GETPOS, sent}, 123 { TBM_SETPOS, sent|wparam|lparam, TRUE, 5}, 124 { TBM_SETPOS, sent|wparam|lparam, TRUE, 1000}, 125 { WM_PAINT, sent|defwinproc}, 126 { TBM_GETPOS, sent}, 127 { TBM_SETPOS, sent|wparam|lparam, FALSE, 20}, 128 { TBM_GETPOS, sent}, 129 { TBM_SETPOS, sent|wparam|lparam, TRUE, 20}, 130 { TBM_GETPOS, sent}, 131 {0} 132 }; 133 134 static const struct message parent_position_test_seq[] = { 135 { WM_CTLCOLORSTATIC, sent}, 136 { WM_NOTIFY, sent}, 137 { WM_CTLCOLORSTATIC, sent}, 138 { WM_NOTIFY, sent}, 139 { WM_CTLCOLORSTATIC, sent}, 140 { WM_NOTIFY, sent}, 141 {0} 142 }; 143 144 static const struct message range_test_seq[] = { 145 { TBM_SETRANGE, sent|wparam|lparam, TRUE, MAKELONG(0, 10)}, 146 { WM_PAINT, sent|defwinproc}, 147 { TBM_GETRANGEMAX, sent}, 148 { TBM_GETRANGEMIN, sent}, 149 { TBM_SETRANGE, sent|wparam|lparam, TRUE, MAKELONG(-1, 1000)}, 150 { WM_PAINT, sent|defwinproc}, 151 { TBM_GETRANGEMAX, sent}, 152 { TBM_GETRANGEMIN, sent}, 153 { TBM_SETRANGE, sent|wparam|lparam, TRUE, MAKELONG(10, 0)}, 154 { WM_PAINT, sent|defwinproc}, 155 { TBM_GETRANGEMAX, sent}, 156 { TBM_GETRANGEMIN, sent}, 157 { TBM_SETRANGE, sent|wparam|lparam, FALSE, MAKELONG(0, 10)}, 158 { TBM_GETRANGEMAX, sent}, 159 { TBM_GETRANGEMIN, sent}, 160 { TBM_SETRANGEMAX, sent|wparam|lparam, TRUE, 10}, 161 { WM_PAINT, sent|defwinproc}, 162 { TBM_GETRANGEMAX, sent}, 163 { TBM_SETRANGEMAX, sent|wparam|lparam, TRUE, -1}, 164 { WM_PAINT, sent|defwinproc}, 165 { TBM_GETRANGEMAX, sent}, 166 { TBM_SETRANGEMAX, sent|wparam|lparam, FALSE, 10}, 167 { TBM_GETRANGEMAX, sent}, 168 { TBM_SETRANGEMIN, sent|wparam|lparam, TRUE, 0}, 169 { WM_PAINT, sent|defwinproc}, 170 { TBM_GETRANGEMIN, sent}, 171 { TBM_SETRANGEMIN, sent|wparam|lparam, TRUE, 10}, 172 { WM_PAINT, sent|defwinproc}, 173 { TBM_GETRANGEMIN, sent}, 174 { TBM_SETRANGEMIN, sent|wparam|lparam, TRUE, -10}, 175 { WM_PAINT, sent|defwinproc}, 176 { TBM_GETRANGEMIN, sent}, 177 { TBM_SETRANGEMIN, sent|wparam|lparam, FALSE, 5}, 178 { TBM_GETRANGEMIN, sent}, 179 { TBM_GETRANGEMAX, sent}, 180 { TBM_GETRANGEMIN, sent}, 181 {0} 182 }; 183 184 static const struct message parent_range_test_seq[] = { 185 { WM_CTLCOLORSTATIC, sent}, 186 { WM_NOTIFY, sent}, 187 { WM_CTLCOLORSTATIC, sent}, 188 { WM_NOTIFY, sent}, 189 { WM_CTLCOLORSTATIC, sent}, 190 { WM_NOTIFY, sent}, 191 { WM_CTLCOLORSTATIC, sent}, 192 { WM_NOTIFY, sent}, 193 { WM_CTLCOLORSTATIC, sent}, 194 { WM_NOTIFY, sent}, 195 { WM_CTLCOLORSTATIC, sent}, 196 { WM_NOTIFY, sent}, 197 { WM_CTLCOLORSTATIC, sent}, 198 { WM_NOTIFY, sent}, 199 { WM_CTLCOLORSTATIC, sent}, 200 { WM_NOTIFY, sent}, 201 {0} 202 }; 203 204 static const struct message selection_test_seq[] = { 205 { TBM_SETSEL, sent|wparam|lparam, TRUE, MAKELONG(0, 10)}, 206 { WM_PAINT, sent|defwinproc}, 207 { TBM_GETSELEND, sent}, 208 { TBM_GETSELSTART, sent}, 209 { TBM_SETSEL, sent|wparam|lparam, TRUE, MAKELONG(5, 20)}, 210 { WM_PAINT, sent|defwinproc}, 211 { TBM_GETSELEND, sent}, 212 { TBM_GETSELSTART, sent}, 213 { TBM_SETSEL, sent|wparam|lparam, FALSE, MAKELONG(5, 10)}, 214 { TBM_GETSELEND, sent}, 215 { TBM_GETSELSTART, sent}, 216 { TBM_SETSELEND, sent|wparam|lparam, TRUE, 10}, 217 { WM_PAINT, sent|defwinproc}, 218 { TBM_GETSELEND, sent}, 219 { TBM_SETSELEND, sent|wparam|lparam, TRUE, 20}, 220 { WM_PAINT, sent|defwinproc}, 221 { TBM_GETSELEND, sent}, 222 { TBM_SETSELEND, sent|wparam|lparam, TRUE, 4}, 223 { WM_PAINT, sent|defwinproc}, 224 { TBM_GETSELEND, sent}, 225 { TBM_SETSELEND, sent|wparam|lparam, FALSE, 2}, 226 { TBM_GETSELEND, sent}, 227 { TBM_GETSELEND, sent}, 228 { TBM_SETSELSTART, sent|wparam|lparam, TRUE, 5}, 229 { WM_PAINT, sent|defwinproc}, 230 { TBM_GETSELSTART, sent}, 231 { TBM_SETSELSTART, sent|wparam|lparam, TRUE, 0}, 232 { WM_PAINT, sent|defwinproc}, 233 { TBM_GETSELSTART, sent}, 234 { TBM_SETSELSTART, sent|wparam|lparam, TRUE, 20}, 235 { WM_PAINT, sent|defwinproc}, 236 { TBM_GETSELSTART, sent}, 237 { TBM_SETSELSTART, sent|wparam|lparam, FALSE, 8}, 238 { TBM_GETSELSTART, sent}, 239 { TBM_GETSELSTART, sent}, 240 {0} 241 }; 242 243 static const struct message parent_selection_test_seq[] = { 244 { WM_CTLCOLORSTATIC, sent}, 245 { WM_NOTIFY, sent}, 246 { WM_CTLCOLORSTATIC, sent}, 247 { WM_NOTIFY, sent}, 248 { WM_CTLCOLORSTATIC, sent}, 249 { WM_NOTIFY, sent}, 250 { WM_CTLCOLORSTATIC, sent}, 251 { WM_NOTIFY, sent}, 252 { WM_CTLCOLORSTATIC, sent}, 253 { WM_NOTIFY, sent}, 254 { WM_CTLCOLORSTATIC, sent}, 255 { WM_NOTIFY, sent}, 256 { WM_CTLCOLORSTATIC, sent}, 257 { WM_NOTIFY, sent}, 258 { WM_CTLCOLORSTATIC, sent}, 259 { WM_NOTIFY, sent}, 260 {0} 261 }; 262 263 static const struct message tic_settings_test_seq[] = { 264 { TBM_SETTIC, sent|lparam, 0, 0}, 265 { TBM_SETTIC, sent|lparam, 0, 5}, 266 { TBM_SETTIC, sent|lparam, 0, 10}, 267 { TBM_SETTIC, sent|lparam, 0, 20}, 268 { TBM_SETRANGE, sent|wparam|lparam, TRUE, MAKELONG(0,10)}, 269 { WM_PAINT, sent|defwinproc}, 270 { TBM_SETTICFREQ, sent|wparam, 2}, 271 { WM_PAINT, sent|defwinproc}, 272 { TBM_GETNUMTICS, sent}, 273 { TBM_SETTICFREQ, sent|wparam, 5}, 274 { WM_PAINT, sent|defwinproc}, 275 { TBM_GETNUMTICS, sent}, 276 { TBM_SETTICFREQ, sent|wparam, 15}, 277 { WM_PAINT, sent|defwinproc}, 278 { TBM_GETNUMTICS, sent}, 279 { TBM_GETNUMTICS, sent}, 280 {0} 281 }; 282 283 static const struct message parent_tic_settings_test_seq[] = { 284 { WM_CTLCOLORSTATIC, sent}, 285 { WM_NOTIFY, sent}, 286 { WM_CTLCOLORSTATIC, sent}, 287 { WM_NOTIFY, sent}, 288 { WM_CTLCOLORSTATIC, sent}, 289 { WM_NOTIFY, sent}, 290 { WM_CTLCOLORSTATIC, sent}, 291 { WM_NOTIFY, sent}, 292 {0} 293 }; 294 295 static const struct message thumb_length_test_seq[] = { 296 { TBM_SETTHUMBLENGTH, sent|wparam|lparam, 15, 0}, 297 { WM_PAINT, sent|defwinproc}, 298 { TBM_GETTHUMBLENGTH, sent}, 299 { TBM_SETTHUMBLENGTH, sent|wparam|lparam, 20, 0}, 300 { WM_PAINT, sent|defwinproc}, 301 { TBM_GETTHUMBLENGTH, sent}, 302 { TBM_GETTHUMBLENGTH, sent}, 303 { WM_SIZE, sent}, 304 { WM_PAINT, sent|defwinproc}, 305 { TBM_GETTHUMBLENGTH, sent}, 306 { WM_SIZE, sent}, 307 { WM_PAINT, sent|defwinproc}, 308 { TBM_GETTHUMBLENGTH, sent}, 309 {0} 310 }; 311 312 static const struct message parent_thumb_length_test_seq[] = { 313 { WM_CTLCOLORSTATIC, sent}, 314 { WM_NOTIFY, sent}, 315 { WM_CTLCOLORSTATIC, sent}, 316 { WM_NOTIFY, sent}, 317 { WM_CTLCOLORSTATIC, sent}, 318 { WM_NOTIFY, sent}, 319 { WM_CTLCOLORSTATIC, sent}, 320 { WM_NOTIFY, sent}, 321 {0} 322 }; 323 324 static const struct message tic_placement_test_seq[] = { 325 { TBM_GETPTICS, sent}, 326 { TBM_GETTIC, sent|wparam, 0}, 327 { TBM_GETTIC, sent|wparam, 2}, 328 { TBM_GETTIC, sent|wparam, 4}, 329 { TBM_GETTICPOS, sent|wparam, 0}, 330 { TBM_GETTICPOS, sent|wparam, 2}, 331 {0} 332 }; 333 334 static const struct message tool_tips_test_seq[] = { 335 { TBM_SETTIPSIDE, sent|wparam, TBTS_TOP}, 336 { TBM_SETTIPSIDE, sent|wparam, TBTS_LEFT}, 337 { TBM_SETTIPSIDE, sent|wparam, TBTS_BOTTOM}, 338 { TBM_SETTIPSIDE, sent|wparam, TBTS_RIGHT}, 339 { TBM_SETTOOLTIPS, sent}, 340 { TBM_GETTOOLTIPS, sent}, 341 { TBM_SETTOOLTIPS, sent}, 342 { TBM_GETTOOLTIPS, sent}, 343 { TBM_SETTOOLTIPS, sent}, 344 { TBM_GETTOOLTIPS, sent}, 345 { TBM_GETTOOLTIPS, sent}, 346 {0} 347 }; 348 349 static const struct message unicode_test_seq[] = { 350 { TBM_SETUNICODEFORMAT, sent|wparam, TRUE}, 351 { TBM_SETUNICODEFORMAT, sent|wparam, FALSE}, 352 { TBM_GETUNICODEFORMAT, sent}, 353 {0} 354 }; 355 356 static const struct message ignore_selection_test_seq[] = { 357 { TBM_SETSEL, sent|wparam|lparam, TRUE, MAKELONG(0,10)}, 358 { TBM_GETSELEND, sent}, 359 { TBM_GETSELSTART, sent}, 360 { TBM_SETSEL, sent|wparam|lparam, FALSE, MAKELONG(0,10)}, 361 { TBM_GETSELEND, sent}, 362 { TBM_GETSELSTART, sent}, 363 { TBM_SETSELEND, sent|wparam|lparam, TRUE,0}, 364 { TBM_GETSELEND, sent}, 365 { TBM_SETSELEND, sent|wparam|lparam, TRUE, 10}, 366 { TBM_GETSELEND, sent}, 367 { TBM_SETSELEND, sent|wparam|lparam, FALSE,0}, 368 { TBM_GETSELEND, sent}, 369 { TBM_SETSELSTART, sent|wparam|lparam, TRUE,0}, 370 { TBM_GETSELSTART, sent}, 371 { TBM_SETSELSTART, sent|wparam|lparam, TRUE, 10}, 372 { TBM_GETSELSTART, sent}, 373 { TBM_SETSELSTART, sent|wparam|lparam, FALSE,0}, 374 { TBM_GETSELSTART, sent}, 375 {0} 376 }; 377 378 static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ 379 static LONG defwndproc_counter = 0; 380 LRESULT ret; 381 struct message msg; 382 383 /* log system messages, except for painting */ 384 if (message < WM_USER && 385 message != WM_PAINT && 386 message != WM_ERASEBKGND && 387 message != WM_NCPAINT && 388 message != WM_NCHITTEST && 389 message != WM_GETTEXT && 390 message != WM_GETICON && 391 message != WM_DEVICECHANGE) 392 { 393 msg.message = message; 394 msg.flags = sent|wparam|lparam; 395 if (defwndproc_counter) msg.flags |= defwinproc; 396 msg.wParam = wParam; 397 msg.lParam = lParam; 398 msg.id = 0; 399 add_message(sequences, PARENT_SEQ_INDEX, &msg); 400 } 401 402 defwndproc_counter++; 403 ret = DefWindowProcA(hwnd, message, wParam, lParam); 404 defwndproc_counter--; 405 406 return ret; 407 } 408 409 static BOOL register_parent_wnd_class(void){ 410 WNDCLASSA cls; 411 412 cls.style = 0; 413 cls.lpfnWndProc = parent_wnd_proc; 414 cls.cbClsExtra = 0; 415 cls.cbWndExtra = 0; 416 cls.hInstance = GetModuleHandleA(NULL); 417 cls.hIcon = 0; 418 cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW); 419 cls.hbrBackground = GetStockObject(WHITE_BRUSH); 420 cls.lpszMenuName = NULL; 421 cls.lpszClassName = "Trackbar test parent class"; 422 return RegisterClassA(&cls); 423 } 424 425 static HWND create_parent_window(void){ 426 if (!register_parent_wnd_class()) 427 return NULL; 428 429 return CreateWindowA("Trackbar test parent class", "Trackbar test parent window", 430 WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE, 431 0, 0, 100, 100, GetDesktopWindow(), NULL, GetModuleHandleA(NULL), NULL); 432 } 433 434 static LRESULT WINAPI trackbar_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ 435 WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA); 436 static LONG defwndproc_counter = 0; 437 struct message msg = { 0 }; 438 LRESULT ret; 439 440 msg.message = message; 441 msg.flags = sent|wparam|lparam; 442 if (defwndproc_counter) msg.flags |= defwinproc; 443 msg.wParam = wParam; 444 msg.lParam = lParam; 445 add_message(sequences, TRACKBAR_SEQ_INDEX, &msg); 446 447 defwndproc_counter++; 448 ret = CallWindowProcA(oldproc, hwnd, message, wParam, lParam); 449 defwndproc_counter--; 450 451 return ret; 452 } 453 454 static HWND create_trackbar(DWORD style, HWND parent){ 455 HWND hWndTrack; 456 WNDPROC oldproc; 457 RECT rect; 458 459 GetClientRect(parent, &rect); 460 hWndTrack = CreateWindowA(TRACKBAR_CLASSA, "Trackbar Control", style, 461 rect.right, rect.bottom, 100, 50, 462 parent, NULL, GetModuleHandleA(NULL), NULL); 463 464 if (!hWndTrack) return NULL; 465 466 oldproc = (WNDPROC)SetWindowLongPtrA(hWndTrack, GWLP_WNDPROC, (LONG_PTR)trackbar_subclass_proc); 467 SetWindowLongPtrA(hWndTrack, GWLP_USERDATA, (LONG_PTR)oldproc); 468 469 return hWndTrack; 470 } 471 472 static HWND create_trackbar2(DWORD style, HWND parent) 473 { 474 RECT rect; 475 GetClientRect(parent, &rect); 476 return CreateWindowA(TRACKBAR_CLASSA, "Trackbar Control", style, 477 rect.right, rect.bottom, 100, 50, 478 parent, NULL, GetModuleHandleA(NULL), NULL); 479 } 480 481 /* test functions for setters, getters, and sequences */ 482 483 static void test_trackbar_buddy(void) 484 { 485 HWND hWndLeftBuddy, hWndTrackbar; 486 HWND hWndRightBuddy; 487 HWND hWndCurrentBuddy; 488 HWND rTest; 489 490 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 491 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 492 493 flush_sequences(sequences, NUM_MSG_SEQUENCE); 494 495 hWndLeftBuddy = CreateWindowA(STATUSCLASSNAMEA, NULL, 0, 0, 0, 300, 20, NULL, NULL, NULL, NULL); 496 ok(hWndLeftBuddy != NULL, "Expected non NULL value\n"); 497 498 if (hWndLeftBuddy != NULL){ 499 hWndCurrentBuddy = (HWND) SendMessageA(hWndTrackbar, TBM_GETBUDDY, TRUE, 0); 500 rTest = (HWND) SendMessageA(hWndTrackbar, TBM_SETBUDDY, FALSE, (LPARAM) hWndLeftBuddy); 501 ok(rTest == hWndCurrentBuddy, "Expected hWndCurrentBuddy\n"); 502 rTest = (HWND) SendMessageA(hWndTrackbar, TBM_SETBUDDY, FALSE, (LPARAM) hWndLeftBuddy); 503 ok(rTest == hWndLeftBuddy, "Expected hWndLeftBuddy\n"); 504 } else 505 skip ("left buddy control not present?\n"); 506 507 hWndRightBuddy = CreateWindowA(STATUSCLASSNAMEA, NULL, 0, 0, 0, 300, 20, NULL, NULL, NULL, NULL); 508 509 ok(hWndRightBuddy != NULL, "expected non NULL value\n"); 510 511 /* test TBM_SETBUDDY */ 512 if (hWndRightBuddy != NULL){ 513 hWndCurrentBuddy = (HWND) SendMessageA(hWndTrackbar, TBM_GETBUDDY, TRUE, 0); 514 rTest = (HWND) SendMessageA(hWndTrackbar, TBM_SETBUDDY, TRUE, (LPARAM) hWndRightBuddy); 515 ok(rTest == hWndCurrentBuddy, "Expected hWndCurrentBuddy\n"); 516 rTest = (HWND) SendMessageA(hWndTrackbar, TBM_SETBUDDY, TRUE, (LPARAM) hWndRightBuddy); 517 ok(rTest == hWndRightBuddy, "Expected hWndRightbuddy\n"); 518 } else 519 skip("Right buddy control not present?\n"); 520 521 /* test TBM_GETBUDDY */ 522 if (hWndLeftBuddy != NULL){ 523 rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETBUDDY, FALSE, 0); 524 ok(rTest == hWndLeftBuddy, "Expected hWndLeftBuddy\n"); 525 DestroyWindow(hWndLeftBuddy); 526 } 527 if (hWndRightBuddy != NULL){ 528 rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETBUDDY, TRUE,0); 529 ok(rTest == hWndRightBuddy, "Expected hWndRightBuddy\n"); 530 DestroyWindow(hWndRightBuddy); 531 } 532 533 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, buddy_window_test_seq, "buddy test sequence", TRUE); 534 ok_sequence(sequences, PARENT_SEQ_INDEX, parent_buddy_window_test_seq, "parent buddy test seq", TRUE); 535 536 DestroyWindow(hWndTrackbar); 537 } 538 539 static void test_line_size(void) 540 { 541 HWND hWndTrackbar; 542 int r; 543 544 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 545 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 546 547 flush_sequences(sequences, NUM_MSG_SEQUENCE); 548 549 /* test TBM_SETLINESIZE */ 550 r = SendMessageA(hWndTrackbar, TBM_SETLINESIZE, 0, 10); 551 expect(1,r); 552 r = SendMessageA(hWndTrackbar, TBM_SETLINESIZE, 0, 4); 553 expect(10, r); 554 555 /* test TBM_GETLINESIZE */ 556 r = SendMessageA(hWndTrackbar, TBM_GETLINESIZE, 0,0); 557 expect(4, r); 558 559 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, line_size_test_seq, "linesize test sequence", FALSE); 560 ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent line test sequence", FALSE); 561 562 DestroyWindow(hWndTrackbar); 563 } 564 565 566 static void test_page_size(void) 567 { 568 HWND hWndTrackbar; 569 int r; 570 571 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 572 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 573 574 flush_sequences(sequences, NUM_MSG_SEQUENCE); 575 576 /* test TBM_SETPAGESIZE */ 577 r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, 10); 578 expect(20, r); 579 r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, -1); 580 expect(10, r); 581 582 /* test TBM_GETPAGESIZE */ 583 r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0,0); 584 expect(20, r); 585 586 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, page_size_test_seq, "page size test sequence", FALSE); 587 ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent page size test sequence", FALSE); 588 589 /* check for zero page size */ 590 r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, 0); 591 expect(20, r); 592 r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0); 593 expect(0, r); 594 /* revert to default */ 595 r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, -1); 596 expect(0, r); 597 r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0); 598 expect(20, r); 599 /* < -1 */ 600 r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, -2); 601 expect(20, r); 602 r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0); 603 expect(-2, r); 604 605 DestroyWindow(hWndTrackbar); 606 } 607 608 static void test_position(void) 609 { 610 HWND hWndTrackbar; 611 RECT rect, rect2; 612 WNDPROC oldproc; 613 int r; 614 615 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 616 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 617 618 flush_sequences(sequences, NUM_MSG_SEQUENCE); 619 620 /* test TBM_SETPOS */ 621 SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, -1); 622 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0); 623 expect(0, r); 624 SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 5); 625 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0,0); 626 expect(5, r); 627 SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 5); 628 SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 1000); 629 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0,0); 630 expect(100, r); 631 SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 20); 632 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0,0); 633 expect(20, r); 634 SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 20); 635 636 /* test TBM_GETPOS */ 637 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0,0); 638 expect(20, r); 639 640 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, position_test_seq, "position test sequence", TRUE); 641 ok_sequence(sequences, PARENT_SEQ_INDEX, parent_position_test_seq, "parent position test sequence", TRUE); 642 643 DestroyWindow(hWndTrackbar); 644 645 hWndTrackbar = create_trackbar2(defaultstyle, hWndParent); 646 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 647 648 /* subclassing procedure blocks WM_PAINT */ 649 oldproc = (WNDPROC)SetWindowLongPtrA(hWndTrackbar, GWLP_WNDPROC, (LONG_PTR)trackbar_no_wmpaint_proc); 650 SetWindowLongPtrA(hWndTrackbar, GWLP_USERDATA, (LONG_PTR)oldproc); 651 652 SetRectEmpty(&rect); 653 SetRectEmpty(&rect2); 654 655 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect); 656 657 /* without repaint */ 658 SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 25); 659 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0); 660 ok(r == 25, "got %d\n", r); 661 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect2); 662 ok(rect.left == rect2.left, "got %d\n", rect.left); 663 664 /* with repaint */ 665 SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 30); 666 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0); 667 ok(r == 30, "got %d\n", r); 668 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect2); 669 ok(rect.left != rect2.left, "got %d, expected %d\n", rect2.left, rect.left); 670 671 /* now move it with keys */ 672 SendMessageA(hWndTrackbar, WM_KEYDOWN, VK_END, 0); 673 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0); 674 ok(r == 100, "got %d\n", r); 675 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect); 676 ok(rect.left != rect2.left, "got %d, expected %d\n", rect.left, rect2.left); 677 678 DestroyWindow(hWndTrackbar); 679 } 680 681 static void test_range(void) 682 { 683 HWND hWndTrackbar; 684 RECT rect1, rect2; 685 int r; 686 687 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 688 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 689 690 flush_sequences(sequences, NUM_MSG_SEQUENCE); 691 692 /* test TBM_SETRANGE */ 693 SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(0, 10)); 694 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0); 695 expect(10, r); 696 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0); 697 expect(0, r); 698 SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(-1, 1000)); 699 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0); 700 expect(1000, r); 701 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0); 702 expect(-1, r); 703 SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(10, 0)); 704 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0); 705 expect(0, r); 706 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0); 707 expect(10, r); 708 SendMessageA(hWndTrackbar, TBM_SETRANGE, FALSE, MAKELONG(0,10)); 709 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0); 710 expect(10, r); 711 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0); 712 expect(0, r); 713 714 /*test TBM_SETRANGEMAX */ 715 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, TRUE, 10); 716 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0); 717 expect(10, r); 718 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, TRUE, -1); 719 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0); 720 expect(-1, r); 721 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 10); 722 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0); 723 expect(10, r); 724 725 /* testing TBM_SETRANGEMIN */ 726 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, 0); 727 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0); 728 expect(0, r); 729 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, 10); 730 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0); 731 expect(10, r); 732 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, -10); 733 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0); 734 expect(-10, r); 735 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 5); 736 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0); 737 expect(5, r); 738 739 /* test TBM_GETRANGEMAX */ 740 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0); 741 expect(10, r); 742 743 /* test TBM_GETRANGEMIN */ 744 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0); 745 expect(5, r); 746 747 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, range_test_seq, "range test sequence", TRUE); 748 ok_sequence(sequences, PARENT_SEQ_INDEX, parent_range_test_seq, "parent range test sequence", TRUE); 749 750 /* TBM_SETRANGE updates thumb visual position (rectangle) if needed */ 751 r = SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(-10, 0)); 752 ok(r == 0, "got %d\n", r); 753 SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 0); 754 755 RedrawWindow(hWndTrackbar, NULL, 0, RDW_UPDATENOW); 756 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1); 757 758 r = SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(-10, 10)); 759 ok(r == 0, "got %d\n", r); 760 RedrawWindow(hWndTrackbar, NULL, 0, RDW_UPDATENOW); 761 762 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect2); 763 ok(!EqualRect(&rect1, &rect2), "thumb rectangle not updated\n"); 764 765 /* change range back, don't force repaint */ 766 r = SendMessageA(hWndTrackbar, TBM_SETRANGE, FALSE, MAKELONG(-10, 0)); 767 ok(r == 0, "got %d\n", r); 768 769 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1); 770 ok(EqualRect(&rect1, &rect2), "thumb rectangle not updated\n"); 771 772 /* test position update on range change */ 773 774 /* set to [20, 50], position at 30, reduce range to [20,25] */ 775 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 20); 776 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 50); 777 SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 30); 778 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 25); 779 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0); 780 ok(r == 25, "Unexpected position %d\n", r); 781 782 /* set to [20, 50], position at 30, flip max to 10 */ 783 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 20); 784 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 50); 785 SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 30); 786 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 10); 787 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0); 788 ok(r == 20, "Unexpected position %d\n", r); 789 790 /* set to [20, 50], position at 30, flip min to 70 */ 791 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 20); 792 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 50); 793 SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 30); 794 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 70); 795 r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0); 796 ok(r == 70, "Unexpected position %d\n", r); 797 798 DestroyWindow(hWndTrackbar); 799 } 800 801 static void test_selection(void) 802 { 803 HWND hWndTrackbar; 804 int r; 805 806 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 807 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 808 809 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 5); 810 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 10); 811 812 flush_sequences(sequences, NUM_MSG_SEQUENCE); 813 814 /* test TBM_SETSEL */ 815 SendMessageA(hWndTrackbar, TBM_SETSEL, TRUE, MAKELONG(0,10)); 816 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 817 expect(10, r); 818 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 819 expect(5, r); 820 SendMessageA(hWndTrackbar, TBM_SETSEL, TRUE, MAKELONG(5, 20)); 821 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 822 expect(10, r); 823 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 824 expect(5, r); 825 SendMessageA(hWndTrackbar, TBM_SETSEL, FALSE, MAKELONG(5, 10)); 826 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 827 expect(10, r); 828 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 829 expect(5, r); 830 831 /* test TBM_SETSELEND */ 832 SendMessageA(hWndTrackbar, TBM_SETSELEND, TRUE, 10); 833 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 834 expect(10, r); 835 SendMessageA(hWndTrackbar, TBM_SETSELEND, TRUE, 20); 836 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 837 expect(10, r); 838 SendMessageA(hWndTrackbar, TBM_SETSELEND, TRUE, 4); 839 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 840 expect(4, r); 841 SendMessageA(hWndTrackbar, TBM_SETSELEND, FALSE, 2); 842 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 843 expect(2, r); 844 845 /* test TBM_GETSELEND */ 846 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 847 expect(2, r); 848 849 /* testing TBM_SETSELSTART */ 850 SendMessageA(hWndTrackbar, TBM_SETSELSTART, TRUE, 5); 851 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 852 expect(5, r); 853 SendMessageA(hWndTrackbar, TBM_SETSELSTART, TRUE, 0); 854 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 855 expect(5, r); 856 SendMessageA(hWndTrackbar, TBM_SETSELSTART, TRUE, 20); 857 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 858 expect(20, r); 859 SendMessageA(hWndTrackbar, TBM_SETSELSTART, FALSE, 8); 860 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 861 expect(8, r); 862 863 /* test TBM_GETSELSTART */ 864 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 865 expect(8, r); 866 867 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, selection_test_seq, "selection test sequence", TRUE); 868 ok_sequence(sequences, PARENT_SEQ_INDEX, parent_selection_test_seq, "parent selection test sequence", TRUE); 869 870 DestroyWindow(hWndTrackbar); 871 } 872 873 static void test_thumb_length(void) 874 { 875 HWND hWndTrackbar; 876 int r; 877 878 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 879 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 880 881 flush_sequences(sequences, NUM_MSG_SEQUENCE); 882 883 /* testing TBM_SETTHUMBLENGTH */ 884 SendMessageA(hWndTrackbar, TBM_SETTHUMBLENGTH, 15, 0); 885 r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0,0); 886 expect(15, r); 887 SendMessageA(hWndTrackbar, TBM_SETTHUMBLENGTH, 20, 0); 888 r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0,0); 889 expect(20, r); 890 891 /* test TBM_GETTHUMBLENGTH */ 892 r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0,0); 893 expect(20, r); 894 895 r = SendMessageA(hWndTrackbar, WM_SIZE, 0,0); 896 expect(0, r); 897 r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0,0); 898 expect(20, r); 899 r = SendMessageA(hWndTrackbar, WM_SIZE, 0, MAKELPARAM(50, 50) ); 900 expect(0, r); 901 r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0,0); 902 expect(20, r); 903 904 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, thumb_length_test_seq, "thumb length test sequence", TRUE); 905 ok_sequence(sequences, PARENT_SEQ_INDEX, parent_thumb_length_test_seq, "parent thumb length test sequence", TRUE); 906 907 DestroyWindow(hWndTrackbar); 908 } 909 910 static void test_tic_settings(void) 911 { 912 HWND hWndTrackbar; 913 int r, i; 914 915 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 916 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 917 918 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 5); 919 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 10); 920 921 /* testing TBM_SETTIC */ 922 /* Set tics at 5 and 10 */ 923 /* 0 and 20 are out of range and should not be set */ 924 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0, 0); 925 expect(10, r); 926 r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0, 0); 927 expect(5, r); 928 929 flush_sequences(sequences, NUM_MSG_SEQUENCE); 930 r = SendMessageA(hWndTrackbar, TBM_SETTIC, 0, 0); 931 ok(r == FALSE, "Expected FALSE, got %d\n", r); 932 r = SendMessageA(hWndTrackbar, TBM_SETTIC, 0, 5); 933 ok(r == TRUE, "Expected TRUE, got %d\n", r); 934 r = SendMessageA(hWndTrackbar, TBM_SETTIC, 0, 10); 935 ok(r == TRUE, "Expected TRUE, got %d\n", r); 936 937 r = SendMessageA(hWndTrackbar, TBM_SETTIC, 0, 20); 938 ok(r == FALSE, "Expected FALSE, got %d\n", r); 939 940 /* test TBM_SETTICFREQ */ 941 SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(0, 10)); 942 SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 2, 0); 943 r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0); 944 expect(6, r); 945 SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 5, 0); 946 r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0); 947 expect(3, r); 948 SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 15, 0); 949 r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0); 950 expect(2, r); 951 952 /* test TBM_GETNUMTICS */ 953 /* since TIC FREQ is 15, there should be only 2 tics now */ 954 r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0); 955 expect(2, r); 956 957 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, tic_settings_test_seq, "tic settings test sequence", TRUE); 958 ok_sequence(sequences, PARENT_SEQ_INDEX, parent_tic_settings_test_seq, "parent tic settings test sequence", TRUE); 959 960 /* range [0,0], freq = 1 */ 961 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, TRUE, 0); 962 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, 0); 963 SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 1, 0); 964 r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0); 965 expect(2, r); 966 /* range [0,1], freq = 1 */ 967 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, TRUE, 1); 968 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, 0); 969 SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 1, 0); 970 r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0); 971 expect(2, r); 972 /* range [0,2], freq = 1 */ 973 SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, TRUE, 2); 974 SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, 0); 975 SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 1, 0); 976 r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0); 977 expect(3, r); 978 979 DestroyWindow(hWndTrackbar); 980 981 /* Test to show that TBM_SETTICFREQ updates thumb */ 982 for (i = 0; i < 2; i++) 983 { 984 DWORD style = i ? defaultstyle : defaultstyle & ~TBS_AUTOTICKS; 985 RECT rect, rect1; 986 WNDPROC oldproc; 987 988 hWndTrackbar = create_trackbar2(style, hWndParent); 989 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 990 991 oldproc = (WNDPROC)SetWindowLongPtrA(hWndTrackbar, GWLP_WNDPROC, (LONG_PTR)trackbar_no_wmpaint_proc); 992 SetWindowLongPtrA(hWndTrackbar, GWLP_USERDATA, (LONG_PTR)oldproc); 993 994 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect); 995 SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 0); 996 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1); 997 ok(EqualRect(&rect, &rect1), "Unexpected thumb rectangle %s, previous %s\n", 998 wine_dbgstr_rect(&rect1), wine_dbgstr_rect(&rect)); 999 1000 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect); 1001 SendMessageA(hWndTrackbar, TBM_SETRANGE, FALSE, MAKELONG(-100, 100)); 1002 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1); 1003 ok(EqualRect(&rect, &rect1), "Unexpected thumb rectangle %s, previous %s\n", 1004 wine_dbgstr_rect(&rect1), wine_dbgstr_rect(&rect)); 1005 /* Old position is also 0, but thumb position will be different after range change */ 1006 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect); 1007 SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 0); 1008 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1); 1009 ok(EqualRect(&rect, &rect1), "Unexpected thumb rectangle %s, previous %s\n", 1010 wine_dbgstr_rect(&rect1), wine_dbgstr_rect(&rect)); 1011 /* Previous frequency is also 1, yet thumb is updated */ 1012 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect); 1013 SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 1, 0); 1014 SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1); 1015 ok(!EqualRect(&rect, &rect1), "Unexpected thumb rectangle %s, previous %s\n", 1016 wine_dbgstr_rect(&rect1), wine_dbgstr_rect(&rect)); 1017 1018 SetWindowLongPtrA(hWndTrackbar, GWLP_WNDPROC, (LONG_PTR)oldproc); 1019 1020 DestroyWindow(hWndTrackbar); 1021 } 1022 } 1023 1024 static void test_tic_placement(void) 1025 { 1026 HWND hWndTrackbar; 1027 int r; 1028 DWORD *rPTics; 1029 DWORD numtics; 1030 1031 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 1032 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 1033 1034 SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(1, 6)); 1035 SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 1, 0); 1036 1037 numtics = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0); 1038 ok(numtics == 6, "Expected 6, got %d\n", numtics); 1039 1040 flush_sequences(sequences, NUM_MSG_SEQUENCE); 1041 /* test TBM_GETPTICS */ 1042 rPTics = (DWORD *) SendMessageA(hWndTrackbar, TBM_GETPTICS, 0,0); 1043 expect(2, rPTics[0]); 1044 expect(3, rPTics[1]); 1045 expect(4, rPTics[2]); 1046 expect(5, rPTics[3]); 1047 1048 /* test TBM_GETTIC */ 1049 r = SendMessageA(hWndTrackbar, TBM_GETTIC, 0,0); 1050 expect(2, r); 1051 r = SendMessageA(hWndTrackbar, TBM_GETTIC, 2,0); 1052 expect(4, r); 1053 r = SendMessageA(hWndTrackbar, TBM_GETTIC, 4,0); 1054 expect(-1, r); 1055 1056 /* test TBM_GETTICPIC */ 1057 r = SendMessageA(hWndTrackbar, TBM_GETTICPOS, 0, 0); 1058 ok(r > 0, "Expected r > 0, got %d\n", r); 1059 r = SendMessageA(hWndTrackbar, TBM_GETTICPOS, 2, 0); 1060 ok(r > 0, "Expected r > 0, got %d\n", r); 1061 1062 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, tic_placement_test_seq, "get tic placement test sequence", FALSE); 1063 ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent get tic placement test sequence", FALSE); 1064 1065 DestroyWindow(hWndTrackbar); 1066 } 1067 1068 static void test_tool_tips(void) 1069 { 1070 HWND hWndTooltip, hWndTrackbar; 1071 HWND rTest; 1072 int r; 1073 1074 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 1075 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 1076 1077 flush_sequences(sequences, NUM_MSG_SEQUENCE); 1078 1079 /* testing TBM_SETTIPSIDE */ 1080 r = SendMessageA(hWndTrackbar, TBM_SETTIPSIDE, TBTS_TOP, 0); 1081 expect(TBTS_TOP, r); 1082 r = SendMessageA(hWndTrackbar, TBM_SETTIPSIDE, TBTS_LEFT, 0); 1083 expect(TBTS_TOP, r); 1084 r = SendMessageA(hWndTrackbar, TBM_SETTIPSIDE, TBTS_BOTTOM, 0); 1085 expect(TBTS_LEFT, r); 1086 r = SendMessageA(hWndTrackbar, TBM_SETTIPSIDE, TBTS_RIGHT, 0); 1087 expect(TBTS_BOTTOM, r); 1088 1089 /* testing TBM_SETTOOLTIPS */ 1090 hWndTooltip = CreateWindowExA(WS_EX_TOPMOST, TOOLTIPS_CLASSA, NULL, 0, 1091 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 1092 NULL, NULL, NULL, NULL); 1093 1094 ok(hWndTooltip != NULL, "Expected non NULL value\n"); 1095 if (hWndTooltip != NULL){ 1096 SendMessageA(hWndTrackbar, TBM_SETTOOLTIPS, (LPARAM) hWndTooltip, 0); 1097 rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETTOOLTIPS, 0,0); 1098 ok(rTest == hWndTooltip, "Expected hWndToolTip, got\n"); 1099 SendMessageA(hWndTrackbar, TBM_SETTOOLTIPS, 0, 0); 1100 rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETTOOLTIPS, 0,0); 1101 ok(rTest == NULL, "Expected NULL\n"); 1102 SendMessageA(hWndTrackbar, TBM_SETTOOLTIPS, (LPARAM) hWndTooltip, 5); 1103 rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETTOOLTIPS, 0,0); 1104 ok(rTest == hWndTooltip, "Expected hWndTooltip, got\n"); 1105 } else 1106 skip("tool tip control not present?\n"); 1107 1108 /* test TBM_GETTOOLTIPS */ 1109 rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETTOOLTIPS, 0,0); 1110 ok(rTest == hWndTooltip, "Expected hWndTooltip\n"); 1111 1112 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, tool_tips_test_seq, "tool tips test sequence", FALSE); 1113 ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent tool tips test sequence", FALSE); 1114 1115 DestroyWindow(hWndTrackbar); 1116 } 1117 1118 1119 static void test_unicode(void) 1120 { 1121 HWND hWndTrackbar; 1122 int r; 1123 1124 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 1125 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 1126 1127 flush_sequences(sequences, NUM_MSG_SEQUENCE); 1128 1129 /* testing TBM_SETUNICODEFORMAT */ 1130 r = SendMessageA(hWndTrackbar, TBM_SETUNICODEFORMAT, TRUE, 0); 1131 ok(r == FALSE, "Expected FALSE, got %d\n",r); 1132 r = SendMessageA(hWndTrackbar, TBM_SETUNICODEFORMAT, FALSE, 0); 1133 ok(r == TRUE, "Expected TRUE, got %d\n",r); 1134 1135 /* test TBM_GETUNICODEFORMAT */ 1136 r = SendMessageA(hWndTrackbar, TBM_GETUNICODEFORMAT, 0,0); 1137 ok(r == FALSE, "Expected FALSE, got %d\n",r); 1138 1139 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, unicode_test_seq, "unicode test sequence", FALSE); 1140 ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent unicode test sequence", FALSE); 1141 1142 DestroyWindow(hWndTrackbar); 1143 } 1144 1145 static void test_ignore_selection(void) 1146 { 1147 HWND hWndTrackbar; 1148 int r; 1149 1150 hWndTrackbar = create_trackbar(0, hWndParent); 1151 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 1152 1153 flush_sequences(sequences, NUM_MSG_SEQUENCE); 1154 /* test TBM_SETSEL ensure that it is ignored */ 1155 SendMessageA(hWndTrackbar, TBM_SETSEL, TRUE, MAKELONG(0,10)); 1156 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 1157 expect(0, r); 1158 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 1159 expect(0, r); 1160 SendMessageA(hWndTrackbar, TBM_SETSEL, FALSE, MAKELONG(0,10)); 1161 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 1162 expect(0, r); 1163 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 1164 expect(0, r); 1165 1166 /* test TBM_SETSELEND, ensure that it is ignored */ 1167 SendMessageA(hWndTrackbar, TBM_SETSELEND, TRUE, 0); 1168 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 1169 expect(0, r); 1170 SendMessageA(hWndTrackbar, TBM_SETSELEND, TRUE, 10); 1171 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 1172 expect(0,r); 1173 SendMessageA(hWndTrackbar, TBM_SETSELEND, FALSE, 0); 1174 r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0); 1175 expect(0, r); 1176 1177 /* test TBM_SETSELSTART, ensure that it is ignored */ 1178 SendMessageA(hWndTrackbar, TBM_SETSELSTART, TRUE, 0); 1179 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 1180 expect(0, r); 1181 SendMessageA(hWndTrackbar, TBM_SETSELSTART, TRUE, 10); 1182 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 1183 expect(0,r); 1184 SendMessageA(hWndTrackbar, TBM_SETSELSTART, FALSE, 0); 1185 r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0); 1186 expect(0, r); 1187 1188 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, ignore_selection_test_seq, "ignore selection setting test sequence", FALSE); 1189 ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent ignore selection setting test sequence", FALSE); 1190 1191 DestroyWindow(hWndTrackbar); 1192 } 1193 1194 static void test_initial_state(void) 1195 { 1196 HWND hWnd; 1197 int ret; 1198 1199 hWnd = create_trackbar(0, hWndParent); 1200 1201 ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0); 1202 expect(2, ret); 1203 ret = SendMessageA(hWnd, TBM_GETTIC, 0, 0); 1204 expect(-1, ret); 1205 ret = SendMessageA(hWnd, TBM_GETTICPOS, 0, 0); 1206 expect(-1, ret); 1207 ret = SendMessageA(hWnd, TBM_GETRANGEMIN, 0, 0); 1208 expect(0, ret); 1209 ret = SendMessageA(hWnd, TBM_GETRANGEMAX, 0, 0); 1210 expect(100, ret); 1211 1212 ret = SendMessageA(hWnd, TBM_SETRANGEMAX, TRUE, 200); 1213 expect(0, ret); 1214 1215 ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0); 1216 expect(2, ret); 1217 1218 ret = SendMessageA(hWnd, TBM_SETRANGEMIN, TRUE, 10); 1219 expect(0, ret); 1220 1221 ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0); 1222 expect(2, ret); 1223 1224 DestroyWindow(hWnd); 1225 } 1226 1227 static void test_TBS_AUTOTICKS(void) 1228 { 1229 HWND hWnd; 1230 int ret; 1231 1232 hWnd = create_trackbar(TBS_AUTOTICKS, hWndParent); 1233 1234 ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0); 1235 expect(2, ret); 1236 ret = SendMessageA(hWnd, TBM_GETTIC, 0, 0); 1237 expect(-1, ret); 1238 ret = SendMessageA(hWnd, TBM_GETTICPOS, 0, 0); 1239 expect(-1, ret); 1240 ret = SendMessageA(hWnd, TBM_GETRANGEMIN, 0, 0); 1241 expect(0, ret); 1242 ret = SendMessageA(hWnd, TBM_GETRANGEMAX, 0, 0); 1243 expect(100, ret); 1244 1245 /* TBM_SETRANGEMAX rebuilds tics */ 1246 ret = SendMessageA(hWnd, TBM_SETRANGEMAX, TRUE, 200); 1247 expect(0, ret); 1248 ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0); 1249 expect(201, ret); 1250 1251 /* TBM_SETRANGEMIN rebuilds tics */ 1252 ret = SendMessageA(hWnd, TBM_SETRANGEMAX, TRUE, 100); 1253 expect(0, ret); 1254 ret = SendMessageA(hWnd, TBM_SETRANGEMIN, TRUE, 10); 1255 expect(0, ret); 1256 ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0); 1257 expect(91, ret); 1258 1259 ret = SendMessageA(hWnd, TBM_SETRANGEMIN, TRUE, 0); 1260 expect(0, ret); 1261 1262 /* TBM_SETRANGE rebuilds tics */ 1263 ret = SendMessageA(hWnd, TBM_SETRANGE, TRUE, MAKELONG(10, 200)); 1264 expect(0, ret); 1265 ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0); 1266 expect(191, ret); 1267 1268 DestroyWindow(hWnd); 1269 } 1270 1271 static void test_create(void) 1272 { 1273 HWND hWndTrackbar; 1274 1275 flush_sequences(sequences, NUM_MSG_SEQUENCE); 1276 1277 hWndTrackbar = create_trackbar(defaultstyle, hWndParent); 1278 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 1279 ok_sequence(sequences, TRACKBAR_SEQ_INDEX, empty_seq, "create Trackbar Window", FALSE); 1280 ok_sequence(sequences, PARENT_SEQ_INDEX, parent_create_trackbar_wnd_seq, "parent trackbar window", TRUE); 1281 1282 DestroyWindow(hWndTrackbar); 1283 1284 /* no style bits */ 1285 flush_sequences(sequences, NUM_MSG_SEQUENCE); 1286 hWndTrackbar = create_trackbar(0, hWndParent); 1287 ok(hWndTrackbar != NULL, "Expected non NULL value\n"); 1288 ok_sequence(sequences, PARENT_SEQ_INDEX, parent_new_window_test_seq, "new trackbar window test sequence", TRUE); 1289 DestroyWindow(hWndTrackbar); 1290 } 1291 1292 START_TEST(trackbar) 1293 { 1294 init_msg_sequences(sequences, NUM_MSG_SEQUENCE); 1295 InitCommonControls(); 1296 1297 /* create parent window */ 1298 hWndParent = create_parent_window(); 1299 ok(hWndParent != NULL, "Failed to create parent Window!\n"); 1300 1301 if(!hWndParent){ 1302 skip("parent window not present\n"); 1303 return; 1304 } 1305 1306 test_create(); 1307 test_trackbar_buddy(); 1308 test_line_size(); 1309 test_page_size(); 1310 test_position(); 1311 test_range(); 1312 test_selection(); 1313 test_thumb_length(); 1314 test_tic_settings(); 1315 test_tic_placement(); 1316 test_tool_tips(); 1317 test_unicode(); 1318 test_TBS_AUTOTICKS(); 1319 test_ignore_selection(); 1320 test_initial_state(); 1321 1322 DestroyWindow(hWndParent); 1323 } 1324