Changeset 500 for trunk/src/user32/new/scroll.cpp
- Timestamp:
- Aug 15, 1999, 9:11:02 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/new/scroll.cpp
r387 r500 1 /* $Id: scroll.cpp,v 1. 4 1999-07-24 17:10:25cbratschi Exp $ */1 /* $Id: scroll.cpp,v 1.5 1999-08-15 19:11:01 cbratschi Exp $ */ 2 2 /* 3 3 * Scrollbar control … … 52 52 53 53 /* Overlap between arrows and thumb */ 54 #define SCROLL_ARROW_THUMB_OVERLAP 154 #define SCROLL_ARROW_THUMB_OVERLAP 0 55 55 56 56 /* Delay (in ms) before first repetition when holding the button down */ … … 97 97 static INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar, 98 98 const SCROLLINFO *info, INT *action ); 99 static void SCROLL_DrawInterior_9x( HWND hwnd, HDC hdc, INT nBar, 100 RECT *rect, INT arrowSize, 101 INT thumbSize, INT thumbPos, 102 UINT flags, BOOL vertical, 103 BOOL top_selected, BOOL bottom_selected ); 99 104 100 105 /*********************************************************************** … … 379 384 } 380 385 381 382 386 /*********************************************************************** 383 387 * SCROLL_DrawArrows … … 385 389 * Draw the scroll bar arrows. 386 390 */ 391 static void SCROLL_DrawArrows_9x( HDC hdc, SCROLLBAR_INFO *infoPtr, 392 RECT *rect, INT arrowSize, BOOL vertical, 393 BOOL top_pressed, BOOL bottom_pressed ) 394 { 395 RECT r; 396 397 r = *rect; 398 if( vertical ) 399 r.bottom = r.top + arrowSize; 400 else 401 r.right = r.left + arrowSize; 402 403 DrawFrameControl( hdc, &r, DFC_SCROLL, 404 (vertical ? DFCS_SCROLLUP : DFCS_SCROLLLEFT) 405 | (top_pressed ? (DFCS_PUSHED | DFCS_FLAT) : 0 ) 406 | (infoPtr->flags&ESB_DISABLE_LTUP ? DFCS_INACTIVE : 0 ) ); 407 408 r = *rect; 409 if( vertical ) 410 r.top = r.bottom-arrowSize; 411 else 412 r.left = r.right-arrowSize; 413 414 DrawFrameControl( hdc, &r, DFC_SCROLL, 415 (vertical ? DFCS_SCROLLDOWN : DFCS_SCROLLRIGHT) 416 | (bottom_pressed ? (DFCS_PUSHED | DFCS_FLAT) : 0 ) 417 | (infoPtr->flags&ESB_DISABLE_RTDN ? DFCS_INACTIVE : 0) ); 418 } 419 387 420 static void SCROLL_DrawArrows( HDC hdc, SCROLLBAR_INFO *infoPtr, 388 RECT *rect, INT arrowSize, BOOL vertical, 389 BOOL top_pressed, BOOL bottom_pressed ) 390 { 391 HDC hdcMem = CreateCompatibleDC( hdc ); 392 HBITMAP hbmpPrev = SelectObject( hdcMem, vertical ? 393 TOP_ARROW(infoPtr->flags, top_pressed) 394 : LEFT_ARROW(infoPtr->flags, top_pressed)); 395 INT offset = 1; 396 397 if (offset) arrowSize--; 398 SetStretchBltMode( hdc, STRETCH_DELETESCANS ); 399 StretchBlt( hdc, rect->left+offset, rect->top+offset, 400 vertical ? rect->right-(rect->left+offset) : arrowSize, 401 vertical ? arrowSize : rect->bottom-(rect->top+offset), 402 hdcMem, 0, 0, 403 GetSystemMetrics(SM_CXVSCROLL),GetSystemMetrics(SM_CYHSCROLL), 404 SRCCOPY ); 405 406 SelectObject( hdcMem, vertical ? 407 BOTTOM_ARROW( infoPtr->flags, bottom_pressed ) 408 : RIGHT_ARROW( infoPtr->flags, bottom_pressed ) ); 409 if (vertical) 410 StretchBlt( hdc, (rect->left+offset), rect->bottom - arrowSize, 411 rect->right - (rect->left+offset), arrowSize, 412 hdcMem, 0, 0, 413 GetSystemMetrics(SM_CXVSCROLL),GetSystemMetrics(SM_CYHSCROLL), 414 SRCCOPY ); 415 else 416 StretchBlt( hdc, rect->right - arrowSize, rect->top+offset, 417 arrowSize, rect->bottom - (rect->top+offset), 418 hdcMem, 0, 0, 419 GetSystemMetrics(SM_CXVSCROLL), GetSystemMetrics(SM_CYHSCROLL), 420 SRCCOPY ); 421 SelectObject( hdcMem, hbmpPrev ); 422 DeleteDC( hdcMem ); 421 RECT *rect, INT arrowSize, BOOL vertical, 422 BOOL top_pressed, BOOL bottom_pressed ) 423 { 424 SCROLL_DrawArrows_9x( hdc, infoPtr, rect, arrowSize, 425 vertical, top_pressed,bottom_pressed ); 423 426 } 424 427 … … 429 432 * Draw the moving thumb rectangle. 430 433 */ 434 static void SCROLL_DrawMovingThumb_9x( HDC hdc, RECT *rect, BOOL vertical, 435 INT arrowSize, INT thumbSize ) 436 { 437 INT pos = SCROLL_TrackingPos; 438 INT max_size; 439 440 if( vertical ) 441 max_size = rect->bottom - rect->top; 442 else 443 max_size = rect->right - rect->left; 444 445 max_size -= (arrowSize-SCROLL_ARROW_THUMB_OVERLAP) + thumbSize; 446 447 if( pos < (arrowSize-SCROLL_ARROW_THUMB_OVERLAP) ) 448 pos = (arrowSize-SCROLL_ARROW_THUMB_OVERLAP); 449 else if( pos > max_size ) 450 pos = max_size; 451 452 SCROLL_DrawInterior_9x( SCROLL_TrackingWin, hdc, SCROLL_TrackingBar, 453 rect, arrowSize, thumbSize, pos, 454 0, vertical, FALSE, FALSE ); 455 456 SCROLL_MovingThumb = !SCROLL_MovingThumb; 457 } 458 431 459 static void SCROLL_DrawMovingThumb( HDC hdc, RECT *rect, BOOL vertical, 432 INT arrowSize, INT thumbSize ) 433 { 434 RECT r = *rect; 435 if (vertical) 436 { 437 r.top += SCROLL_TrackingPos; 438 if (r.top < rect->top + arrowSize - SCROLL_ARROW_THUMB_OVERLAP) 439 r.top = rect->top + arrowSize - SCROLL_ARROW_THUMB_OVERLAP; 440 if (r.top + thumbSize > 441 rect->bottom - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP)) 442 r.top = rect->bottom - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) 443 - thumbSize; 444 r.bottom = r.top + thumbSize; 445 } 446 else 447 { 448 r.left += SCROLL_TrackingPos; 449 if (r.left < rect->left + arrowSize - SCROLL_ARROW_THUMB_OVERLAP) 450 r.left = rect->left + arrowSize - SCROLL_ARROW_THUMB_OVERLAP; 451 if (r.left + thumbSize > 452 rect->right - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP)) 453 r.left = rect->right - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) 454 - thumbSize; 455 r.right = r.left + thumbSize; 456 } 457 DrawFocusRect( hdc, &r ); 458 SCROLL_MovingThumb = !SCROLL_MovingThumb; 459 } 460 460 INT arrowSize, INT thumbSize ) 461 { 462 SCROLL_DrawMovingThumb_9x( hdc, rect, vertical, arrowSize, thumbSize ); 463 } 461 464 462 465 /*********************************************************************** … … 465 468 * Draw the scroll bar interior (everything except the arrows). 466 469 */ 470 static void SCROLL_DrawInterior_9x( HWND hwnd, HDC hdc, INT nBar, 471 RECT *rect, INT arrowSize, 472 INT thumbSize, INT thumbPos, 473 UINT flags, BOOL vertical, 474 BOOL top_selected, BOOL bottom_selected ) 475 { 476 RECT r; 477 HPEN hSavePen; 478 HBRUSH hSaveBrush,hBrush; 479 480 /* Only scrollbar controls send WM_CTLCOLORSCROLLBAR. 481 * The window-owned scrollbars need to call DEFWND_ControlColor 482 * to correctly setup default scrollbar colors 483 */ 484 if (nBar == SB_CTL) 485 { 486 hBrush = (HBRUSH)SendMessageA( GetParent(hwnd), WM_CTLCOLORSCROLLBAR, 487 (WPARAM)hdc,(LPARAM)hwnd); 488 } 489 else 490 { 491 //CB: implement! 492 //hBrush = DEFWND_ControlColor( hdc, CTLCOLOR_SCROLLBAR ); 493 } 494 495 hSavePen = SelectObject( hdc, GetSysColorPen(COLOR_WINDOWFRAME) ); 496 hSaveBrush = SelectObject( hdc, hBrush ); 497 498 /* Calculate the scroll rectangle */ 499 r = *rect; 500 if (vertical) 501 { 502 r.top += arrowSize - SCROLL_ARROW_THUMB_OVERLAP; 503 r.bottom -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP); 504 } 505 else 506 { 507 r.left += arrowSize - SCROLL_ARROW_THUMB_OVERLAP; 508 r.right -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP); 509 } 510 511 /* Draw the scroll rectangles and thumb */ 512 if (!thumbPos) /* No thumb to draw */ 513 { 514 PatBlt( hdc, r.left, r.top, 515 r.right - r.left, r.bottom - r.top, 516 PATCOPY ); 517 518 /* cleanup and return */ 519 SelectObject( hdc, hSavePen ); 520 SelectObject( hdc, hSaveBrush ); 521 return; 522 } 523 524 if (vertical) 525 { 526 PatBlt( hdc, r.left, r.top, 527 r.right - r.left, 528 thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP), 529 top_selected ? 0x0f0000 : PATCOPY ); 530 r.top += thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP); 531 PatBlt( hdc, r.left, r.top + thumbSize, 532 r.right - r.left, 533 r.bottom - r.top - thumbSize, 534 bottom_selected ? 0x0f0000 : PATCOPY ); 535 r.bottom = r.top + thumbSize; 536 } 537 else /* horizontal */ 538 { 539 PatBlt( hdc, r.left, r.top, 540 thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP), 541 r.bottom - r.top, 542 top_selected ? 0x0f0000 : PATCOPY ); 543 r.left += thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP); 544 PatBlt( hdc, r.left + thumbSize, r.top, 545 r.right - r.left - thumbSize, 546 r.bottom - r.top, 547 bottom_selected ? 0x0f0000 : PATCOPY ); 548 r.right = r.left + thumbSize; 549 } 550 551 /* Draw the thumb */ 552 DrawEdge( hdc, &r, EDGE_RAISED, BF_RECT | BF_MIDDLE ); 553 554 /* cleanup */ 555 SelectObject( hdc, hSavePen ); 556 SelectObject( hdc, hSaveBrush ); 557 } 558 559 467 560 static void SCROLL_DrawInterior( HWND hwnd, HDC hdc, INT nBar, 468 561 RECT *rect, INT arrowSize, … … 483 576 /* Select the correct brush and pen */ 484 577 485 if ((flags & ESB_DISABLE_BOTH) == ESB_DISABLE_BOTH) 486 { 487 /* This ought to be the color of the parent window */ 488 //hBrush = GetSysColorBrush(COLOR_WINDOW); 489 /* Under Win9x look & feel, scrollbars don't have a solid border. 490 * To make scrollbar's background different from the window 491 * background, we need to apply a gray 0x55aa pattern brush. 492 * Otherwise it won't look good. 493 */ 494 //hBrush = CACHE_GetPattern55AABrush(); 495 hBrush = GetSysColorBrush(COLOR_3DFACE); //CB: improve! 496 } 497 else 498 { 499 /* Only scrollbar controls send WM_CTLCOLORSCROLLBAR. 500 * The window-owned scrollbars need to call DEFWND_ControlColor 501 * to correctly setup default scrollbar colors 502 */ 503 if (nBar == SB_CTL) { 504 hBrush = (HBRUSH)SendMessageA( GetParent(hwnd), WM_CTLCOLORSCROLLBAR, 505 (WPARAM)hdc,(LPARAM)hwnd); 506 } else { 507 /* CB: implement later! 508 hBrush = DEFWND_ControlColor( hdc, CTLCOLOR_SCROLLBAR ); 509 */ 510 } 511 } 578 /* Only scrollbar controls send WM_CTLCOLORSCROLLBAR. 579 * The window-owned scrollbars need to call DEFWND_ControlColor 580 * to correctly setup default scrollbar colors 581 */ 582 if (nBar == SB_CTL) { 583 hBrush = (HBRUSH)SendMessageA( GetParent(hwnd), WM_CTLCOLORSCROLLBAR, 584 (WPARAM)hdc,(LPARAM)hwnd); 585 } else { 586 //CB: implement! 587 //hBrush = DEFWND_ControlColor( hdc, CTLCOLOR_SCROLLBAR ); 588 } 589 512 590 hSavePen = SelectObject( hdc, GetSysColorPen(COLOR_WINDOWFRAME) ); 513 591 hSaveBrush = SelectObject( hdc, hBrush ); … … 527 605 } 528 606 607 /* Draw the scroll bar frame */ 608 609 /* Only draw outline if Win 3.1. Mar 24, 1999 - Ronald B. Cemer */ 610 529 611 /* Draw the scroll rectangles and thumb */ 530 612 531 613 if (!thumbPos) /* No thumb to draw */ 532 614 { 533 PatBlt( hdc, r.left+1, r.top+1, r.right - r.left - 2, 534 r.bottom - r.top - 2, PATCOPY ); 615 INT offset = 0; 616 617 PatBlt( hdc, r.left+offset, r.top+offset, 618 r.right - r.left - 2*offset, r.bottom - r.top - 2*offset, 619 PATCOPY ); 535 620 536 621 /* cleanup and return */ … … 542 627 if (vertical) 543 628 { 544 PatBlt( hdc, r.left + 1, r.top + 1, 545 r.right - r.left - 2, 546 thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) - 1, 629 INT offset = 0; 630 631 PatBlt( hdc, r.left + offset, r.top + offset, 632 r.right - r.left - offset*2, 633 thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) - offset, 547 634 top_selected ? 0x0f0000 : PATCOPY ); 548 635 r.top += thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP); 549 PatBlt( hdc, r.left + 1, r.top + thumbSize,550 r.right - r.left - 2,551 r.bottom - r.top - thumbSize - 1,636 PatBlt( hdc, r.left + offset, r.top + thumbSize, 637 r.right - r.left - offset*2, 638 r.bottom - r.top - thumbSize - offset, 552 639 bottom_selected ? 0x0f0000 : PATCOPY ); 553 640 r.bottom = r.top + thumbSize; … … 555 642 else /* horizontal */ 556 643 { 557 PatBlt( hdc, r.left + 1, r.top + 1, 558 thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) - 1, 559 r.bottom - r.top - 2, 644 INT offset = 0; 645 646 PatBlt( hdc, r.left + offset, r.top + offset, 647 thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP), 648 r.bottom - r.top - offset*2, 560 649 top_selected ? 0x0f0000 : PATCOPY ); 561 650 r.left += thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP); 562 PatBlt( hdc, r.left + thumbSize, r.top + 1,563 r.right - r.left - thumbSize - 1,564 r.bottom - r.top - 2,651 PatBlt( hdc, r.left + thumbSize, r.top + offset, 652 r.right - r.left - thumbSize - offset, 653 r.bottom - r.top - offset*2, 565 654 bottom_selected ? 0x0f0000 : PATCOPY ); 566 655 r.right = r.left + thumbSize; … … 571 660 SelectObject( hdc, GetSysColorBrush(COLOR_BTNFACE) ); 572 661 573 r.top++, r.left++; 574 r.bottom--; r.right--; 575 Rectangle( hdc, r.left, r.top, r.right-1, r.bottom-1 ); 662 Rectangle( hdc, r.left+1, r.top+1, r.right-1, r.bottom-1 ); 576 663 577 664 DrawEdge( hdc, &r, EDGE_RAISED, BF_RECT ); … … 586 673 SelectObject( hdc, hSaveBrush ); 587 674 } 588 589 675 590 676 /*********************************************************************** … … 770 856 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL, 771 857 SB_LINEUP, hwndCtl ); 772 //CB: SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?773 // SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,774 // (TIMERPROC)0 );775 858 } 859 //CB: SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ? 860 // SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, 861 // (TIMERPROC)0 ); 776 862 } 777 863 //CB: else KillSystemTimer( hwnd, SCROLL_TIMER ); … … 871 957 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL, 872 958 SB_LINEDOWN, hwndCtl ); 873 //CB: SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?874 // SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,875 // (TIMERPROC)0 );876 959 } 960 //CB: SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ? 961 // SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, 962 // (TIMERPROC)0 ); 877 963 } 878 964 //CB: else KillSystemTimer( hwnd, SCROLL_TIMER );
Note:
See TracChangeset
for help on using the changeset viewer.