Aric Stewart <aric@xxxxxxxxxxxxxxx> Huw Davies <huw@xxxxxxxxxxxxxxx> Some support for SS_SIZEGRIP -- Huw Davies huw@xxxxxxxxxxxxxxx Index: controls/scroll.c =================================================================== RCS file: /home/wine/wine/controls/scroll.c,v retrieving revision 1.71 diff -u -r1.71 scroll.c --- controls/scroll.c 4 Nov 2003 04:21:15 -0000 1.71 +++ controls/scroll.c 20 Nov 2003 17:09:46 -0000 @@ -40,6 +40,7 @@ INT maxVal; /* Maximum scroll-bar value */ INT page; /* Page size of scroll bar (Win32) */ UINT flags; /* EnableScrollBar flags */ + BOOL bSizeBox; /* We are actaully a sizebox and not a scrollbar */ } SCROLLBAR_INFO, *LPSCROLLBAR_INFO; @@ -202,6 +203,7 @@ infoPtr->flags = ESB_ENABLE_BOTH; if (nBar == SB_HORZ) wndPtr->pHScroll = infoPtr; else wndPtr->pVScroll = infoPtr; + infoPtr->bSizeBox = FALSE; } if (!hUpArrow) SCROLL_LoadBitmaps(); } @@ -877,6 +879,38 @@ WIN_ReleaseWndPtr(wndPtr); } +/*********************************************************************** + * SCROLL_DrawSizeGrip + * + * Draw the size grip. + */ +static void SCROLL_DrawSizeGrip( HWND hwnd, HDC hdc) +{ + RECT rc; + int x; + + GetClientRect( hwnd, &rc ); + FillRect( hdc, &rc, GetSysColorBrush(COLOR_SCROLLBAR) ); + + x = 13; + while (x > 3) + { + SelectObject(hdc, SYSCOLOR_GetPen(COLOR_WINDOW)); + MoveToEx(hdc, rc.right - x, rc.bottom, NULL); + LineTo(hdc, rc.right, rc.bottom - x); + x--; + + SelectObject(hdc, SYSCOLOR_GetPen(COLOR_BTNSHADOW)); + MoveToEx(hdc, rc.right - x , rc.bottom, NULL); + LineTo(hdc, rc.right, rc.bottom - x); + x--; + MoveToEx(hdc, rc.right - x , rc.bottom, NULL); + LineTo(hdc, rc.right, rc.bottom - x); + + x-=2; + } +} + /*********************************************************************** * SCROLL_RefreshScrollBar @@ -958,6 +992,32 @@ if ((SCROLL_trackHitTest == SCROLL_NOWHERE) && (msg != WM_LBUTTONDOWN)) return; + if (infoPtr->bSizeBox) + { + switch(msg) + { + case WM_LBUTTONDOWN: /* Initialise mouse tracking */ + HideCaret(hwnd); /* hide caret while holding down LBUTTON */ + SetCapture( hwnd ); + prevPt = pt; + SCROLL_trackHitTest = hittest = SCROLL_THUMB; + break; + case WM_MOUSEMOVE: + GetClientRect(GetParent(GetParent(hwnd)),&rect); + prevPt = pt; + break; + case WM_LBUTTONUP: + ReleaseCapture(); + SCROLL_trackHitTest = hittest = SCROLL_NOWHERE; + if (hwnd==GetFocus()) ShowCaret(hwnd); + break; + case WM_SYSTIMER: + pt = prevPt; + break; + } + return; + } + hdc = GetDCEx( hwnd, 0, DCX_CACHE | ((nBar == SB_CTL) ? 0 : DCX_WINDOW)); vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect, &arrowSize, &thumbSize, &thumbPos ); @@ -1229,13 +1289,32 @@ TRACE("hwnd=%p lpCreate=%p\n", hwnd, lpCreate); + if ((lpCreate->style & (SBS_SIZEGRIP | SBS_SIZEBOX)) || + (GetWindowLongW( hwnd, GWL_STYLE ) & (SBS_SIZEGRIP | SBS_SIZEBOX))) + info->bSizeBox = TRUE; + else + info->bSizeBox = FALSE; + if (lpCreate->style & WS_DISABLED) { info->flags = ESB_DISABLE_BOTH; TRACE("Created WS_DISABLED scrollbar\n"); } - if (lpCreate->style & SBS_VERT) + + if (lpCreate->style & SBS_SIZEBOXTOPLEFTALIGN) + { + MoveWindow( hwnd, lpCreate->x, lpCreate->y, GetSystemMetrics(SM_CXVSCROLL)+1, + GetSystemMetrics(SM_CYHSCROLL)+1, FALSE ); + } + else if(lpCreate->style & SBS_SIZEBOXBOTTOMRIGHTALIGN) + { + MoveWindow( hwnd, lpCreate->x+lpCreate->cx-GetSystemMetrics(SM_CXVSCROLL)-1, + lpCreate->y+lpCreate->cy-GetSystemMetrics(SM_CYHSCROLL)-1, + GetSystemMetrics(SM_CXVSCROLL)+1, + GetSystemMetrics(SM_CYHSCROLL)+1, FALSE ); + } + else if (lpCreate->style & SBS_VERT) { if (lpCreate->style & SBS_LEFTALIGN) MoveWindow( hwnd, lpCreate->x, lpCreate->y, @@ -1432,7 +1511,11 @@ { PAINTSTRUCT ps; HDC hdc = wParam ? (HDC)wParam : BeginPaint(hwnd, &ps); - if (GetWindowLongW( hwnd, GWL_STYLE ) & SBS_SIZEBOX) + if (GetWindowLongW( hwnd, GWL_STYLE ) & SBS_SIZEGRIP) + { + SCROLL_DrawSizeGrip( hwnd, hdc); + } + else if (GetWindowLongW( hwnd, GWL_STYLE ) & SBS_SIZEBOX) { RECT rc; GetClientRect( hwnd, &rc );