Ignore:
Timestamp:
Aug 15, 1999, 9:11:02 PM (26 years ago)
Author:
cbratschi
Message:

wine-990731 update

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:25 cbratschi Exp $ */
     1/* $Id: scroll.cpp,v 1.5 1999-08-15 19:11:01 cbratschi Exp $ */
    22/*
    33 * Scrollbar control
     
    5252
    5353  /* Overlap between arrows and thumb */
    54 #define SCROLL_ARROW_THUMB_OVERLAP 1
     54#define SCROLL_ARROW_THUMB_OVERLAP 0
    5555
    5656  /* Delay (in ms) before first repetition when holding the button down */
     
    9797static INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar,
    9898                                   const SCROLLINFO *info, INT *action );
     99static 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 );
    99104
    100105/***********************************************************************
     
    379384}
    380385
    381 
    382386/***********************************************************************
    383387 *           SCROLL_DrawArrows
     
    385389 * Draw the scroll bar arrows.
    386390 */
     391static 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
    387420static 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 );
    423426}
    424427
     
    429432 * Draw the moving thumb rectangle.
    430433 */
     434static 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
    431459static 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}
    461464
    462465/***********************************************************************
     
    465468 * Draw the scroll bar interior (everything except the arrows).
    466469 */
     470static 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
    467560static void SCROLL_DrawInterior( HWND hwnd, HDC hdc, INT nBar,
    468561                                 RECT *rect, INT arrowSize,
     
    483576      /* Select the correct brush and pen */
    484577
    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
    512590    hSavePen = SelectObject( hdc, GetSysColorPen(COLOR_WINDOWFRAME) );
    513591    hSaveBrush = SelectObject( hdc, hBrush );
     
    527605    }
    528606
     607      /* Draw the scroll bar frame */
     608
     609        /* Only draw outline if Win 3.1.  Mar 24, 1999 - Ronald B. Cemer */
     610
    529611      /* Draw the scroll rectangles and thumb */
    530612
    531613    if (!thumbPos)  /* No thumb to draw */
    532614    {
    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 );
    535620
    536621        /* cleanup and return */
     
    542627    if (vertical)
    543628    {
    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,
    547634                  top_selected ? 0x0f0000 : PATCOPY );
    548635        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,
    552639                  bottom_selected ? 0x0f0000 : PATCOPY );
    553640        r.bottom = r.top + thumbSize;
     
    555642    else  /* horizontal */
    556643    {
    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,
    560649                  top_selected ? 0x0f0000 : PATCOPY );
    561650        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,
    565654                  bottom_selected ? 0x0f0000 : PATCOPY );
    566655        r.right = r.left + thumbSize;
     
    571660    SelectObject( hdc, GetSysColorBrush(COLOR_BTNFACE) );
    572661
    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 );
    576663
    577664    DrawEdge( hdc, &r, EDGE_RAISED, BF_RECT );
     
    586673    SelectObject( hdc, hSaveBrush );
    587674}
    588 
    589675
    590676/***********************************************************************
     
    770856                SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
    771857                                SB_LINEUP, hwndCtl );
    772                 //CB: SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
    773                 //                  SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
    774                 //                  (TIMERPROC)0 );
    775858            }
     859            //CB: SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
     860            //                  SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
     861            //                  (TIMERPROC)0 );
    776862        }
    777863        //CB: else KillSystemTimer( hwnd, SCROLL_TIMER );
     
    871957                SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
    872958                                SB_LINEDOWN, hwndCtl );
    873                 //CB: SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
    874                 //                  SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
    875                 //                  (TIMERPROC)0 );
    876959            }
     960            //CB: SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
     961            //                  SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
     962            //                  (TIMERPROC)0 );
    877963        }
    878964        //CB: else KillSystemTimer( hwnd, SCROLL_TIMER );
Note: See TracChangeset for help on using the changeset viewer.