- Timestamp:
- Oct 29, 1999, 6:06:56 PM (26 years ago)
- Location:
- trunk/src/user32
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/oslibwin.cpp
r1491 r1511 1 /* $Id: oslibwin.cpp,v 1.3 7 1999-10-28 15:20:25 sandervlExp $ */1 /* $Id: oslibwin.cpp,v 1.38 1999-10-29 16:06:55 cbratschi Exp $ */ 2 2 /* 3 3 * Window API wrappers for OS/2 … … 926 926 //****************************************************************************** 927 927 //****************************************************************************** 928 HWND OSLibWinQueryObjectWindow(VOID) 929 { 930 return WinQueryObjectWindow(HWND_DESKTOP); 931 } 932 //****************************************************************************** 933 //****************************************************************************** 928 934 BOOL OSLibWinShowScrollBar(HWND hwndParent, HWND hwndScroll, int scrollBar, 929 935 BOOL fShow, BOOL fForceChange) 930 936 { 937 HWND hwndObj = WinQueryObjectWindow(HWND_DESKTOP),hwndCurPar = WinQueryWindow(hwndScroll,QW_PARENT); 938 931 939 if(hwndScroll == NULL) { 932 940 dprintf(("OSLibWinShowScrollBar: scrollbar %d (parent %x) not found!", scrollBar, hwndParent)); … … 934 942 } 935 943 936 if (fShow != WinIsWindowVisible(hwndScroll) || fForceChange)944 if ((fShow && hwndCurPar == hwndObj) || (!fShow && hwndCurPar != hwndObj) || fForceChange) 937 945 { 938 WinSetParent(hwndScroll, fShow ? hwndParent : HWND_OBJECT, FALSE); 946 //CB: bug: winhlp32: hide vert scrollbar on maximize doesn't update the frame 947 WinSetParent(hwndScroll,fShow ? hwndParent:HWND_OBJECT,FALSE); 939 948 WinSendMsg(hwndParent, WM_UPDATEFRAME, 940 949 MPFROMLONG( ( scrollBar == OSLIB_VSCROLL ) ? FCF_VERTSCROLL 941 950 : FCF_HORZSCROLL), 942 951 MPVOID ); 943 944 WinShowWindow(hwndScroll, fShow);945 952 } 946 953 return TRUE; … … 1049 1056 OSWinStyle); 1050 1057 1058 //CB: bug: it doesn't work with child windows! 1059 1051 1060 if(OSFrameStyle & FCF_TITLEBAR) 1052 1061 { -
trunk/src/user32/oslibwin.h
r1446 r1511 1 /* $Id: oslibwin.h,v 1.2 1 1999-10-25 20:17:20 sandervlExp $ */1 /* $Id: oslibwin.h,v 1.22 1999-10-29 16:06:55 cbratschi Exp $ */ 2 2 /* 3 3 * Window API wrappers for OS/2 … … 266 266 #define OSLIB_VSCROLL 1 267 267 BOOL OSLibWinEnableScrollBar(HWND hwndParent, int scrollBar, BOOL fEnable); 268 HWND OSLibWinQueryObjectWindow(VOID); 268 269 BOOL OSLibWinShowScrollBar(HWND hwndParent, HWND hwndScroll, int scrollBar, BOOL fShow, BOOL fForceChange = FALSE); 269 270 HWND OSLibWinQueryScrollBarHandle(HWND hwndParent, int scrollBar); -
trunk/src/user32/pmframe.cpp
r1490 r1511 1 /* $Id: pmframe.cpp,v 1.1 2 1999-10-28 12:00:34 sandervlExp $ */1 /* $Id: pmframe.cpp,v 1.13 1999-10-29 16:06:55 cbratschi Exp $ */ 2 2 /* 3 3 * Win32 Frame Managment Code for OS/2 … … 67 67 DWORD dwStyle = win32wnd->getStyle(); 68 68 69 //CB: todo: switch to RGB mode and use win colors 69 70 clrWhite = CLR_WHITE; 70 71 clrBlack = CLR_BLACK; … … 144 145 INT x; 145 146 147 //CB: todo: switch to RGB mode and use win colors 146 148 WinFillRect(hps,&rect,SYSCLR_DIALOGBACKGROUND); 147 149 p1.x = rect.xRight-2; … … 198 200 WinReleasePS(hps); 199 201 } 202 } 203 //****************************************************************************** 204 //****************************************************************************** 205 void FrameTrackFrame(Win32BaseWindow *win32wnd,BOOL lefttop) 206 { 207 INT flags = lefttop ? (TF_LEFT | TF_TOP):(TF_RIGHT | TF_BOTTOM); 208 209 WinSendMsg(win32wnd->getOS2FrameWindowHandle(),WM_TRACKFRAME,(MPARAM)flags,(MPARAM)0); 200 210 } 201 211 //****************************************************************************** -
trunk/src/user32/pmframe.h
r1248 r1511 1 /* $Id: pmframe.h,v 1. 2 1999-10-11 16:04:51cbratschi Exp $ */1 /* $Id: pmframe.h,v 1.3 1999-10-29 16:06:55 cbratschi Exp $ */ 2 2 /* 3 3 * Win32 Frame Managment Code for OS/2 … … 12 12 VOID FrameSetBorderSize(Win32BaseWindow *win32wnd,BOOL resize); 13 13 UINT FrameGetDefSizeBorderSize(VOID); 14 VOID FrameTrackFrame(Win32BaseWindow *win32wnd,BOOL lefttop); 14 15 15 16 #endif -
trunk/src/user32/scroll.cpp
r1433 r1511 1 /* $Id: scroll.cpp,v 1.1 5 1999-10-24 22:56:07 sandervlExp $ */1 /* $Id: scroll.cpp,v 1.16 1999-10-29 16:06:56 cbratschi Exp $ */ 2 2 /* 3 3 * Scrollbar control … … 18 18 #include "oslibwin.h" 19 19 #include "initterm.h" 20 21 static BOOL bitmapsLoaded = FALSE; 22 23 static HBITMAP hUpArrow = 0; 24 static HBITMAP hDnArrow = 0; 25 static HBITMAP hLfArrow = 0; 26 static HBITMAP hRgArrow = 0; 27 static HBITMAP hUpArrowD = 0; 28 static HBITMAP hDnArrowD = 0; 29 static HBITMAP hLfArrowD = 0; 30 static HBITMAP hRgArrowD = 0; 31 static HBITMAP hUpArrowI = 0; 32 static HBITMAP hDnArrowI = 0; 33 static HBITMAP hLfArrowI = 0; 34 static HBITMAP hRgArrowI = 0; 35 36 #define TOP_ARROW(flags,pressed) \ 37 (((flags)&ESB_DISABLE_UP) ? hUpArrowI : ((pressed) ? hUpArrowD:hUpArrow)) 38 #define BOTTOM_ARROW(flags,pressed) \ 39 (((flags)&ESB_DISABLE_DOWN) ? hDnArrowI : ((pressed) ? hDnArrowD:hDnArrow)) 40 #define LEFT_ARROW(flags,pressed) \ 41 (((flags)&ESB_DISABLE_LEFT) ? hLfArrowI : ((pressed) ? hLfArrowD:hLfArrow)) 42 #define RIGHT_ARROW(flags,pressed) \ 43 (((flags)&ESB_DISABLE_RIGHT) ? hRgArrowI : ((pressed) ? hRgArrowD:hRgArrow)) 20 #include "pmframe.h" 44 21 45 22 #define SCROLL_MIN_RECT 4 /* Minimum size of the rectangle between the arrows */ … … 66 43 }; 67 44 68 /* What to do after SCROLL_SetScrollInfo() */45 /* What to do in SetScrollInfo() */ 69 46 #define SA_SSI_HIDE 0x0001 70 47 #define SA_SSI_SHOW 0x0002 71 #define SA_SSI_RE FRESH0x000448 #define SA_SSI_REPAINT_INTERIOR 0x0004 72 49 #define SA_SSI_REPAINT_ARROWS 0x0008 50 #define SA_SSI_MOVE_THUMB 0x0010 51 #define SA_SSI_REFRESH 0x0020 73 52 74 53 /* Thumb-tracking info */ … … 81 60 static BOOL SCROLL_HasFocus = FALSE; 82 61 static BOOL SCROLL_Highlighted = FALSE; 62 static BOOL SCROLL_Scrolling = FALSE; 83 63 84 64 /* Hit test code of the last button-down event */ 85 65 static enum SCROLL_HITTEST SCROLL_trackHitTest; 66 static enum SCROLL_HITTEST SCROLL_lastHitTest; 86 67 static BOOL SCROLL_trackVertical; 87 68 … … 89 70 static BOOL SCROLL_MovingThumb = FALSE; 90 71 91 /* Local functions */ 92 static BOOL SCROLL_ShowScrollBar( HWND hwnd, INT nBar, 93 BOOL fShowH, BOOL fShowV ); 94 static INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar, 95 const SCROLLINFO *info, INT *action ); 96 static void SCROLL_DrawInterior_9x( HWND hwnd, HDC hdc, INT nBar, 97 RECT *rect, INT arrowSize, 98 INT thumbSize, INT thumbPos, 99 UINT flags, BOOL vertical, 100 BOOL top_selected, BOOL bottom_selected ); 101 102 /*********************************************************************** 103 * SCROLL_LoadBitmaps 104 */ 105 static void SCROLL_LoadBitmaps(void) 106 { 107 if (bitmapsLoaded) return; 108 109 hUpArrow = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_UPARROW) ); 110 hDnArrow = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_DNARROW) ); 111 hLfArrow = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_LFARROW) ); 112 hRgArrow = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_RGARROW) ); 113 hUpArrowD = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_UPARROWD) ); 114 hDnArrowD = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_DNARROWD) ); 115 hLfArrowD = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_LFARROWD) ); 116 hRgArrowD = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_RGARROWD) ); 117 hUpArrowI = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_UPARROWI) ); 118 hDnArrowI = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_DNARROWI) ); 119 hLfArrowI = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_LFARROWI) ); 120 hRgArrowI = LoadBitmapA( hInstanceUser32, MAKEINTRESOURCEA(OBM_RGARROWI) ); 121 122 bitmapsLoaded = TRUE; 123 } 124 125 /*********************************************************************** 126 * SCROLL_GetInfoPtr 127 */ 72 // Get the scrollbar handle: works only with frame/control handles 73 74 static HWND SCROLL_GetScrollHandle(HWND hwnd,INT nBar) 75 { 76 switch(nBar) 77 { 78 case SB_HORZ: 79 case SB_VERT: 80 { 81 Win32BaseWindow *win32wnd = Win32BaseWindow::GetWindowFromHandle(hwnd); 82 if (!win32wnd) return 0; 83 if (nBar == SB_HORZ) return Win32BaseWindow::OS2ToWin32Handle(win32wnd->getHorzScrollHandle()); 84 else return Win32BaseWindow::OS2ToWin32Handle(win32wnd->getVertScrollHandle()); 85 } 86 case SB_CTL: 87 return hwnd; 88 89 default: 90 return 0; 91 } 92 } 93 94 static HWND SCROLL_GetFrameHandle(HWND hwnd) 95 { 96 Win32BaseWindow *win32wnd = Win32BaseWindow::GetWindowFromHandle(hwnd); 97 98 if (!win32wnd) return 0; 99 return Win32BaseWindow::GetWindowFromOS2FrameHandle(OSLibWinQueryWindow(win32wnd->getOS2WindowHandle(),QWOS_OWNER))->getWindowHandle(); 100 } 101 102 // Get the infoPtr: works only with scrollbar handles 103 128 104 static SCROLLBAR_INFO *SCROLL_GetInfoPtr( HWND hwnd, INT nBar ) 129 105 { … … 137 113 win32wnd = Win32BaseWindow::GetWindowFromHandle(hwnd); 138 114 if (!win32wnd) return NULL; 139 hwndFrame = OSLibWinQueryWindow(win32wnd->getOS2WindowHandle(),QWOS_ PARENT);115 hwndFrame = OSLibWinQueryWindow(win32wnd->getOS2WindowHandle(),QWOS_OWNER); 140 116 win32wnd = Win32BaseWindow::GetWindowFromOS2FrameHandle(hwndFrame); 141 117 if (!win32wnd) return NULL; … … 244 220 if (vertical) 245 221 { 246 rect.left -= lpRect->right - lpRect->left; 247 rect.right += lpRect->right - lpRect->left; 248 } 249 else 250 { 251 rect.top -= lpRect->bottom - lpRect->top; 252 rect.bottom += lpRect->bottom - lpRect->top; 253 } 222 INT w = lpRect->right-lpRect->left; 223 224 rect.left -= w; 225 rect.right += w; 226 } else 227 { 228 INT h = lpRect->bottom-lpRect->top; 229 230 rect.top -= h; 231 rect.bottom += h; 232 } 233 254 234 return PtInRect( &rect, pt ); 255 235 } … … 293 273 } 294 274 295 /*********************************************************************** 296 * SCROLL_DrawArrows 297 * 298 * Draw the scroll bar arrows. 299 */ 300 static void SCROLL_DrawArrows( HDC hdc, SCROLLBAR_INFO *infoPtr, 301 RECT *rect, INT arrowSize, BOOL vertical, 302 BOOL top_pressed, BOOL bottom_pressed ) 275 static void SCROLL_DrawTopArrow(HDC hdc,SCROLLBAR_INFO *infoPtr,RECT *rect,INT arrowSize,BOOL vertical,BOOL top_pressed) 303 276 { 304 277 RECT r; … … 314 287 | (top_pressed ? (DFCS_PUSHED | DFCS_FLAT) : 0 ) 315 288 | (infoPtr->flags&ESB_DISABLE_LTUP ? DFCS_INACTIVE : 0 ) ); 289 } 290 291 static void SCROLL_DrawBottomArrow(HDC hdc,SCROLLBAR_INFO *infoPtr,RECT *rect,INT arrowSize,BOOL vertical,BOOL bottom_pressed) 292 { 293 RECT r; 316 294 317 295 r = *rect; … … 328 306 329 307 /*********************************************************************** 330 * SCROLL_DrawMovingThumb 331 * 332 * Draw the moving thumb rectangle. 333 */ 334 static void SCROLL_DrawMovingThumb( HDC hdc, RECT *rect, BOOL vertical, 335 INT arrowSize, INT thumbSize ) 336 { 337 INT pos = SCROLL_TrackingPos; 338 INT max_size; 339 340 if( vertical ) 341 max_size = rect->bottom - rect->top; 342 else 343 max_size = rect->right - rect->left; 344 345 max_size -= (arrowSize-SCROLL_ARROW_THUMB_OVERLAP) + thumbSize; 346 347 if( pos < (arrowSize-SCROLL_ARROW_THUMB_OVERLAP) ) 348 pos = (arrowSize-SCROLL_ARROW_THUMB_OVERLAP); 349 else if( pos > max_size ) 350 pos = max_size; 351 352 SCROLL_DrawInterior_9x( SCROLL_TrackingWin, hdc, SCROLL_TrackingBar, 353 rect, arrowSize, thumbSize, pos, 354 0, vertical, FALSE, FALSE ); 355 356 SCROLL_MovingThumb = !SCROLL_MovingThumb; 308 * SCROLL_DrawArrows 309 * 310 * Draw the scroll bar arrows. 311 */ 312 static void SCROLL_DrawArrows( HDC hdc, SCROLLBAR_INFO *infoPtr, 313 RECT *rect, INT arrowSize, BOOL vertical, 314 BOOL top_pressed, BOOL bottom_pressed ) 315 { 316 SCROLL_DrawTopArrow(hdc,infoPtr,rect,arrowSize,vertical,top_pressed); 317 SCROLL_DrawBottomArrow(hdc,infoPtr,rect,arrowSize,vertical,bottom_pressed); 357 318 } 358 319 … … 366 327 HPEN hSavePen; 367 328 HBRUSH hSaveBrush,hBrush; 368 BOOL Save_SCROLL_MovingThumb = SCROLL_MovingThumb;369 370 //SCROLL_DrawInterior_9x(hwnd,hdc,nBar,rect,arrowSize,thumbSize,thumbPos,flags,vertical,top_selected,bottom_selected);371 //return; //CB: improve!372 373 if (Save_SCROLL_MovingThumb &&374 (SCROLL_TrackingWin == hwnd) &&375 (SCROLL_TrackingBar == nBar))376 SCROLL_DrawMovingThumb( hdc, rect, vertical, arrowSize, thumbSize );377 329 378 330 /* Select the correct brush and pen */ … … 408 360 } 409 361 410 /* Draw the scroll rectangles and thumb */411 412 if (!thumbPos) /* No thumb to draw */413 {414 INT offset = 0;415 416 PatBlt( hdc, r.left+offset, r.top+offset,417 r.right - r.left - 2*offset, r.bottom - r.top - 2*offset,418 PATCOPY );419 420 /* cleanup and return */421 SelectObject( hdc, hSavePen );422 SelectObject( hdc, hSaveBrush );423 return;424 }425 426 if (vertical)427 {428 INT offset = 0;429 430 PatBlt( hdc, r.left + offset, r.top + offset,431 r.right - r.left - offset*2,432 thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP) - offset,433 top_selected ? 0x0f0000 : PATCOPY );434 r.top += thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);435 PatBlt( hdc, r.left + offset, r.top + thumbSize,436 r.right - r.left - offset*2,437 r.bottom - r.top - thumbSize - offset,438 bottom_selected ? 0x0f0000 : PATCOPY );439 r.bottom = r.top + thumbSize;440 }441 else /* horizontal */442 {443 INT offset = 0;444 445 PatBlt( hdc, r.left + offset, r.top + offset,446 thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP),447 r.bottom - r.top - offset*2,448 top_selected ? 0x0f0000 : PATCOPY );449 r.left += thumbPos - (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);450 PatBlt( hdc, r.left + thumbSize, r.top + offset,451 r.right - r.left - thumbSize - offset,452 r.bottom - r.top - offset*2,453 bottom_selected ? 0x0f0000 : PATCOPY );454 r.right = r.left + thumbSize;455 }456 457 /* Draw the thumb */458 459 SelectObject(hdc,(SCROLL_FocusWin == hwnd && SCROLL_Highlighted) ? GetSysColorBrush(COLOR_3DHILIGHT):GetSysColorBrush(COLOR_BTNFACE));460 461 Rectangle(hdc,r.left+1,r.top+1,r.right-1,r.bottom-1);462 463 DrawEdge( hdc, &r, EDGE_RAISED, BF_RECT );464 465 if (Save_SCROLL_MovingThumb &&466 (SCROLL_TrackingWin == hwnd) &&467 (SCROLL_TrackingBar == nBar))468 SCROLL_DrawMovingThumb( hdc, rect, vertical, arrowSize, thumbSize );469 470 /* cleanup */471 SelectObject( hdc, hSavePen );472 SelectObject( hdc, hSaveBrush );473 }474 475 /***********************************************************************476 * SCROLL_ClipPos477 */478 static POINT SCROLL_ClipPos( LPRECT lpRect, POINT pt )479 {480 if( pt.x < lpRect->left )481 pt.x = lpRect->left;482 else483 if( pt.x > lpRect->right )484 pt.x = lpRect->right;485 486 if( pt.y < lpRect->top )487 pt.y = lpRect->top;488 else489 if( pt.y > lpRect->bottom )490 pt.y = lpRect->bottom;491 492 return pt;493 }494 495 /***********************************************************************496 * SCROLL_GetThumbVal497 *498 * Compute the current scroll position based on the thumb position in pixels499 * from the top of the scroll-bar.500 */501 static UINT SCROLL_GetThumbVal( SCROLLBAR_INFO *infoPtr, RECT *rect,502 BOOL vertical, INT pos )503 {504 INT thumbSize;505 INT pixels = vertical ? rect->bottom-rect->top : rect->right-rect->left;506 507 if ((pixels -= 2*(GetSystemMetrics(SM_CXVSCROLL) - SCROLL_ARROW_THUMB_OVERLAP)) <= 0)508 return infoPtr->MinVal;509 510 if (infoPtr->Page)511 {512 thumbSize = pixels * infoPtr->Page/(infoPtr->MaxVal-infoPtr->MinVal+1);513 if (thumbSize < SCROLL_MIN_THUMB) thumbSize = SCROLL_MIN_THUMB;514 }515 else thumbSize = GetSystemMetrics(SM_CXVSCROLL);516 517 if ((pixels -= thumbSize) <= 0) return infoPtr->MinVal;518 519 pos = MAX( 0, pos - (GetSystemMetrics(SM_CXVSCROLL) - SCROLL_ARROW_THUMB_OVERLAP) );520 if (pos > pixels) pos = pixels;521 522 if (!infoPtr->Page) pos *= infoPtr->MaxVal - infoPtr->MinVal;523 else pos *= infoPtr->MaxVal - infoPtr->MinVal - infoPtr->Page + 1;524 return infoPtr->MinVal + ((pos + pixels / 2) / pixels);525 }526 527 /***********************************************************************528 * SCROLL_DrawScrollBar529 *530 * Redraw the whole scrollbar.531 */532 void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT nBar,533 BOOL arrows, BOOL interior )534 {535 INT arrowSize, thumbSize, thumbPos;536 RECT rect;537 BOOL vertical;538 SCROLLBAR_INFO *infoPtr = SCROLL_GetInfoPtr( hwnd, nBar );539 BOOL Save_SCROLL_MovingThumb = SCROLL_MovingThumb;540 541 if (nBar == SB_CTL)542 {543 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);544 545 if (dwStyle & (SBS_SIZEBOX | SBS_SIZEGRIP))546 {547 //CB: todo548 549 return;550 }551 }552 553 vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect,554 &arrowSize, &thumbSize, &thumbPos );555 556 if (Save_SCROLL_MovingThumb &&557 (SCROLL_TrackingWin == hwnd) &&558 (SCROLL_TrackingBar == nBar))559 SCROLL_DrawMovingThumb( hdc, &rect, vertical, arrowSize, thumbSize );560 561 /* Draw the arrows */562 563 if (arrows && arrowSize)564 {565 if( vertical == SCROLL_trackVertical && GetCapture() == hwnd )566 SCROLL_DrawArrows( hdc, infoPtr, &rect, arrowSize, vertical,567 (SCROLL_trackHitTest == SCROLL_TOP_ARROW),568 (SCROLL_trackHitTest == SCROLL_BOTTOM_ARROW) );569 else570 SCROLL_DrawArrows( hdc, infoPtr, &rect, arrowSize, vertical,571 FALSE, FALSE );572 }573 if( interior )574 SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbSize,575 thumbPos, infoPtr->flags, vertical, FALSE, FALSE );576 577 if (Save_SCROLL_MovingThumb &&578 (SCROLL_TrackingWin == hwnd) &&579 (SCROLL_TrackingBar == nBar))580 SCROLL_DrawMovingThumb( hdc, &rect, vertical, arrowSize, thumbSize );581 582 }583 584 /***********************************************************************585 * SCROLL_DrawInterior586 *587 * Draw the scroll bar interior (everything except the arrows).588 */589 static void SCROLL_DrawInterior_9x( HWND hwnd, HDC hdc, INT nBar,590 RECT *rect, INT arrowSize,591 INT thumbSize, INT thumbPos,592 UINT flags, BOOL vertical,593 BOOL top_selected, BOOL bottom_selected )594 {595 RECT r;596 HPEN hSavePen;597 HBRUSH hSaveBrush,hBrush;598 599 /* Only scrollbar controls send WM_CTLCOLORSCROLLBAR.600 * The window-owned scrollbars need to call DEFWND_ControlColor601 * to correctly setup default scrollbar colors602 */603 if (nBar == SB_CTL)604 {605 hBrush = (HBRUSH)SendMessageA( GetParent(hwnd), WM_CTLCOLORSCROLLBAR,606 (WPARAM)hdc,(LPARAM)hwnd);607 }608 else609 {610 hBrush = (HBRUSH)SendMessageA( hwnd, WM_CTLCOLORSCROLLBAR,611 (WPARAM)hdc,(LPARAM)hwnd);612 }613 614 hSavePen = SelectObject( hdc, GetSysColorPen(COLOR_WINDOWFRAME) );615 hSaveBrush = SelectObject( hdc, hBrush );616 617 /* Calculate the scroll rectangle */618 r = *rect;619 if (vertical)620 {621 r.top += arrowSize - SCROLL_ARROW_THUMB_OVERLAP;622 r.bottom -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);623 }624 else625 {626 r.left += arrowSize - SCROLL_ARROW_THUMB_OVERLAP;627 r.right -= (arrowSize - SCROLL_ARROW_THUMB_OVERLAP);628 }629 630 362 /* Draw the scroll rectangles and thumb */ 631 363 if (!thumbPos) /* No thumb to draw */ … … 669 401 670 402 /* Draw the thumb */ 671 DrawEdge( hdc, &r, EDGE_RAISED, BF_RECT | BF_MIDDLE ); 403 404 DrawEdge(hdc,&r,EDGE_RAISED,BF_RECT | BF_ADJUST); 405 FillRect(hdc,&r,(SCROLL_FocusWin == hwnd && SCROLL_Highlighted && !SCROLL_Scrolling) ? GetSysColorBrush(COLOR_3DSHADOW):GetSysColorBrush(COLOR_BTNFACE)); 672 406 673 407 /* cleanup */ … … 677 411 678 412 /*********************************************************************** 413 * SCROLL_DrawMovingThumb 414 * 415 * Draw the moving thumb rectangle. 416 */ 417 static void SCROLL_DrawMovingThumb( HDC hdc, RECT *rect, BOOL vertical, 418 INT arrowSize, INT thumbSize ) 419 { 420 INT pos = SCROLL_TrackingPos; 421 INT max_size; 422 423 if( vertical ) 424 max_size = rect->bottom - rect->top; 425 else 426 max_size = rect->right - rect->left; 427 428 max_size -= (arrowSize-SCROLL_ARROW_THUMB_OVERLAP) + thumbSize; 429 430 if( pos < (arrowSize-SCROLL_ARROW_THUMB_OVERLAP) ) 431 pos = (arrowSize-SCROLL_ARROW_THUMB_OVERLAP); 432 else if( pos > max_size ) 433 pos = max_size; 434 435 SCROLL_DrawInterior( SCROLL_TrackingWin, hdc, SCROLL_TrackingBar, 436 rect, arrowSize, thumbSize, pos, 437 0, vertical, FALSE, FALSE ); 438 } 439 440 /*********************************************************************** 441 * SCROLL_ClipPos 442 */ 443 static POINT SCROLL_ClipPos( LPRECT lpRect, POINT pt ) 444 { 445 if( pt.x < lpRect->left ) 446 pt.x = lpRect->left; 447 else 448 if( pt.x >= lpRect->right ) 449 pt.x = lpRect->right-1; 450 451 if( pt.y < lpRect->top ) 452 pt.y = lpRect->top; 453 else 454 if( pt.y >= lpRect->bottom ) 455 pt.y = lpRect->bottom-1; 456 457 return pt; 458 } 459 460 /*********************************************************************** 461 * SCROLL_GetThumbVal 462 * 463 * Compute the current scroll position based on the thumb position in pixels 464 * from the top of the scroll-bar. 465 */ 466 static UINT SCROLL_GetThumbVal( SCROLLBAR_INFO *infoPtr, RECT *rect, 467 BOOL vertical, INT pos ) 468 { 469 INT thumbSize; 470 INT pixels = vertical ? rect->bottom-rect->top : rect->right-rect->left; 471 472 if ((pixels -= 2*(GetSystemMetrics(SM_CXVSCROLL) - SCROLL_ARROW_THUMB_OVERLAP)) <= 0) 473 return infoPtr->MinVal; 474 475 if (infoPtr->Page) 476 { 477 thumbSize = pixels * infoPtr->Page/(infoPtr->MaxVal-infoPtr->MinVal+1); 478 if (thumbSize < SCROLL_MIN_THUMB) thumbSize = SCROLL_MIN_THUMB; 479 } 480 else thumbSize = GetSystemMetrics(SM_CXVSCROLL); 481 482 if ((pixels -= thumbSize) <= 0) return infoPtr->MinVal; 483 484 pos = MAX( 0, pos - (GetSystemMetrics(SM_CXVSCROLL) - SCROLL_ARROW_THUMB_OVERLAP) ); 485 if (pos > pixels) pos = pixels; 486 487 if (!infoPtr->Page) pos *= infoPtr->MaxVal - infoPtr->MinVal; 488 else pos *= infoPtr->MaxVal - infoPtr->MinVal - infoPtr->Page + 1; 489 return infoPtr->MinVal + ((pos + pixels / 2) / pixels); 490 } 491 492 void SCROLL_GetSizeBox(HWND hwnd,DWORD dwStyle,PRECT rect) 493 { 494 RECT clientRect; 495 INT cx = GetSystemMetrics(SM_CXVSCROLL); 496 INT cy = GetSystemMetrics(SM_CYHSCROLL); 497 498 GetClientRect(hwnd,&clientRect); 499 500 if (dwStyle & SBS_SIZEBOXTOPLEFTALIGN) 501 { 502 rect->left = 0; 503 rect->right = cx; 504 rect->bottom = cy; 505 rect->top = 0; 506 } else 507 { 508 rect->left = clientRect.right-cx; 509 rect->right = clientRect.right; 510 rect->bottom = clientRect.bottom; 511 rect->top = clientRect.bottom-cy; 512 } 513 } 514 515 void SCROLL_DrawSizeBox(HDC hdc,RECT rect) 516 { 517 POINT p1,p2; 518 HPEN penDark = GetSysColorPen(COLOR_3DSHADOW); 519 HPEN penWhite = GetSysColorPen(COLOR_3DHILIGHT); 520 HPEN oldPen = SelectObject(hdc,penDark); 521 INT x; 522 523 p1.x = rect.right-2; 524 p1.y = rect.bottom; 525 p2.x = rect.right-1; 526 p2.y = rect.bottom-1; 527 for (x = 0;x < 3;x++) 528 { 529 SelectObject(hdc,penDark); 530 MoveToEx(hdc,p1.x,p1.y,NULL); 531 LineTo(hdc,p2.x,p2.y); 532 p1.x--; 533 p2.y--; 534 MoveToEx(hdc,p1.x,p1.y,NULL); 535 LineTo(hdc,p2.x,p2.y); 536 SelectObject(hdc,penWhite); 537 p1.x--; 538 p2.y--; 539 MoveToEx(hdc,p1.x,p1.y,NULL); 540 LineTo(hdc,p2.x,p2.y); 541 p1.x -= 2; 542 p2.y -= 2; 543 } 544 545 SelectObject(hdc,oldPen); 546 } 547 548 /*********************************************************************** 549 * SCROLL_DrawScrollBar 550 * 551 * Redraw the whole scrollbar. 552 */ 553 void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT nBar, 554 BOOL arrows, BOOL interior ) 555 { 556 INT arrowSize, thumbSize, thumbPos; 557 RECT rect; 558 BOOL vertical; 559 SCROLLBAR_INFO *infoPtr = SCROLL_GetInfoPtr( hwnd, nBar ); 560 561 if (!infoPtr) return; 562 if (nBar == SB_CTL) 563 { 564 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE); 565 566 if (dwStyle & (SBS_SIZEBOX | SBS_SIZEGRIP)) 567 { 568 RECT rect; 569 HBRUSH hBrush; 570 571 hdc = GetDC(hwnd); 572 hBrush = GetSysColorBrush(COLOR_3DFACE); 573 GetClientRect(hwnd,&rect); 574 FillRect(hdc,&rect,hBrush); 575 576 if (dwStyle & SBS_SIZEGRIP) 577 { 578 SCROLL_GetSizeBox(hwnd,dwStyle,&rect); 579 SCROLL_DrawSizeBox(hdc,rect); 580 } 581 582 ReleaseDC(hwnd,hdc); 583 584 return; 585 } 586 } 587 588 vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect, 589 &arrowSize, &thumbSize, &thumbPos ); 590 591 /* Draw the arrows */ 592 593 if (arrows && arrowSize) 594 { 595 if( vertical == SCROLL_trackVertical && GetCapture() == hwnd ) 596 SCROLL_DrawArrows( hdc, infoPtr, &rect, arrowSize, vertical, 597 (SCROLL_trackHitTest == SCROLL_TOP_ARROW), 598 (SCROLL_trackHitTest == SCROLL_BOTTOM_ARROW) ); 599 else 600 SCROLL_DrawArrows( hdc, infoPtr, &rect, arrowSize, vertical, 601 FALSE, FALSE ); 602 } 603 604 if (SCROLL_MovingThumb && 605 (SCROLL_TrackingWin == hwnd) && 606 (SCROLL_TrackingBar == nBar)) 607 SCROLL_DrawMovingThumb( hdc, &rect, vertical, arrowSize, thumbSize ); 608 else if( interior ) 609 SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbSize, 610 thumbPos, infoPtr->flags, vertical, SCROLL_trackHitTest == SCROLL_TOP_RECT && SCROLL_lastHitTest == SCROLL_TOP_RECT,SCROLL_trackHitTest == SCROLL_BOTTOM_RECT && SCROLL_lastHitTest == SCROLL_BOTTOM_RECT); 611 } 612 613 /*********************************************************************** 679 614 * SCROLL_RefreshScrollBar 680 615 * … … 686 621 { 687 622 Win32BaseWindow *window; 688 HWND hwndScroll;689 623 HDC hdc; 690 624 691 //SvL: Get scrollbar handle from parent window 692 window = Win32BaseWindow::GetWindowFromHandle(hwnd); 693 if(!window && nBar != SB_CTL) { 694 dprintf(("SCROLL_RefreshScrollBar window %x not found!", hwnd)); 695 SetLastError(ERROR_INVALID_WINDOW_HANDLE); 696 return; 697 } 698 if(nBar == SB_VERT) 699 { 700 hwndScroll = Win32BaseWindow::OS2ToWin32Handle(window->getVertScrollHandle()); 701 } 702 else 703 if(nBar == SB_HORZ) 704 { 705 hwndScroll = Win32BaseWindow::OS2ToWin32Handle(window->getHorzScrollHandle()); 706 } 707 else hwndScroll = hwnd; 708 709 if(hwndScroll == 0) 710 return; 711 712 hdc = GetDCEx( hwndScroll, 0, DCX_CACHE | ((nBar == SB_CTL) ? 0 : DCX_WINDOW)); 625 hdc = GetDCEx( hwnd, 0, DCX_CACHE | ((nBar == SB_CTL) ? 0 : DCX_WINDOW)); 713 626 714 627 if (!hdc) return; 715 628 716 SCROLL_DrawScrollBar( hwnd Scroll, hdc, nBar, arrows, interior );717 ReleaseDC( hwnd Scroll, hdc );629 SCROLL_DrawScrollBar( hwnd, hdc, nBar, arrows, interior ); 630 ReleaseDC( hwnd, hdc ); 718 631 } 719 632 … … 730 643 SetInfoPtr(hwnd,(DWORD)infoPtr); 731 644 732 if (!bitmapsLoaded) SCROLL_LoadBitmaps();733 734 645 return TRUE; 735 646 } … … 739 650 CREATESTRUCTA *lpCreat = (CREATESTRUCTA *)lParam; 740 651 741 if ( lpCreat->style & SBS_VERT)652 if (!(lpCreat->style & (SBS_SIZEBOX | SBS_SIZEGRIP)) && lpCreat->style & (SBS_LEFTALIGN | SBS_RIGHTALIGN)) 742 653 { 743 if (lpCreat->style & SBS_LEFTALIGN) 744 MoveWindow( hwnd, lpCreat->x, lpCreat->y, 745 GetSystemMetrics(SM_CXVSCROLL), lpCreat->cy, FALSE ); 746 else if (lpCreat->style & SBS_RIGHTALIGN) 747 MoveWindow( hwnd, 748 lpCreat->x+lpCreat->cx-GetSystemMetrics(SM_CXVSCROLL)-1, 749 lpCreat->y, 750 GetSystemMetrics(SM_CXVSCROLL), lpCreat->cy, FALSE ); 751 } else /* SBS_HORZ */ 752 { 753 if (lpCreat->style & SBS_TOPALIGN) 754 MoveWindow( hwnd, lpCreat->x, lpCreat->y, 755 lpCreat->cx, GetSystemMetrics(SM_CYHSCROLL), FALSE ); 756 else if (lpCreat->style & SBS_BOTTOMALIGN) 757 MoveWindow( hwnd, 758 lpCreat->x, 759 lpCreat->y+lpCreat->cy-GetSystemMetrics(SM_CYHSCROLL)-1, 760 lpCreat->cx, GetSystemMetrics(SM_CYHSCROLL), FALSE ); 654 if (lpCreat->style & SBS_VERT) 655 { 656 INT w,h; 657 658 w = GetSystemMetrics(SM_CXVSCROLL); 659 h = lpCreat->cy; 660 661 if (lpCreat->style & SBS_LEFTALIGN) 662 MoveWindow(hwnd,lpCreat->x,lpCreat->y,w,h,FALSE); 663 else if (lpCreat->style & SBS_RIGHTALIGN) 664 MoveWindow(hwnd,lpCreat->x+lpCreat->cx-w,lpCreat->y,w,h,FALSE); 665 } else /* SBS_HORZ */ 666 { 667 INT w,h; 668 669 w = lpCreat->cx; 670 h = GetSystemMetrics(SM_CYHSCROLL); 671 672 if (lpCreat->style & SBS_TOPALIGN) 673 MoveWindow(hwnd,lpCreat->x,lpCreat->y,w,h,FALSE); 674 else if (lpCreat->style & SBS_BOTTOMALIGN) 675 MoveWindow(hwnd,lpCreat->x,lpCreat->y+lpCreat->cy-h,w,h,FALSE); 676 } 761 677 } 762 678 … … 777 693 static INT lastClickPos; /* Position in the scroll-bar of the last button-down event. */ 778 694 static INT lastMousePos; /* Position in the scroll-bar of the last mouse event. */ 695 static BOOL timerRunning; 779 696 780 697 enum SCROLL_HITTEST hittest; … … 796 713 if ((dwStyle & (SBS_SIZEBOX | SBS_SIZEGRIP))) 797 714 { 798 //CB: todo 715 if (!(dwStyle & SBS_SIZEGRIP)) return res; 716 717 if (msg == WM_MOUSEMOVE) 718 { 719 RECT rect; 720 721 SCROLL_GetSizeBox(hwnd,dwStyle,&rect); 722 pt.x = (SHORT)LOWORD(lParam); 723 pt.y = (SHORT)HIWORD(lParam); 724 725 if (PtInRect(&rect,pt)) 726 { 727 SetCursor(LoadCursorA(0,IDC_SIZENWSEA)); 728 return 0; 729 } 730 } else if (msg == WM_LBUTTONDOWN) 731 { 732 if (dwStyle & SBS_SIZEGRIP) 733 { 734 RECT rect; 735 736 pt.x = (SHORT)LOWORD(lParam); 737 pt.y = (SHORT)HIWORD(lParam); 738 SCROLL_GetSizeBox(hwnd,dwStyle,&rect); 739 if (PtInRect(&rect,pt)) 740 { 741 HWND hwndFrame; 742 743 Win32BaseWindow *win32wnd = Win32BaseWindow::GetWindowFromHandle(hwnd); 744 if (!win32wnd) return res; 745 hwndFrame = OSLibWinQueryWindow(win32wnd->getOS2WindowHandle(),QWOS_OWNER); 746 win32wnd = Win32BaseWindow::GetWindowFromOS2FrameHandle(hwndFrame); 747 if (!win32wnd) return res; 748 FrameTrackFrame(win32wnd,dwStyle & SBS_SIZEBOXTOPLEFTALIGN); 749 } 750 } 751 } 799 752 800 753 return res; … … 802 755 } 803 756 804 if ((SCROLL_trackHitTest == SCROLL_NOWHERE) && (msg == WM_MOUSEMOVE || msg == WM_LBUTTONUP ))757 if ((SCROLL_trackHitTest == SCROLL_NOWHERE) && (msg == WM_MOUSEMOVE || msg == WM_LBUTTONUP || msg == WM_CAPTURECHANGED)) 805 758 return res; 806 759 … … 814 767 win32wnd = Win32BaseWindow::GetWindowFromHandle(hwnd); 815 768 if (!win32wnd) return res; 816 hwndFrame = OSLibWinQueryWindow(win32wnd->getOS2WindowHandle(),QWOS_ PARENT);769 hwndFrame = OSLibWinQueryWindow(win32wnd->getOS2WindowHandle(),QWOS_OWNER); 817 770 win32wnd = Win32BaseWindow::GetWindowFromOS2FrameHandle(hwndFrame); 818 771 if (!win32wnd) return res; … … 829 782 SCROLL_trackVertical = vertical; 830 783 SCROLL_trackHitTest = hittest = SCROLL_HitTest( hwnd, nBar, pt, FALSE ); 831 lastClickPos = vertical ? (pt.y - rect.top) : (pt.x - rect.left); 784 SCROLL_Scrolling = TRUE; 785 timerRunning = FALSE; 786 if (SCROLL_FocusWin == hwnd && SCROLL_Highlighted) 787 { 788 hdc = GetDCEx(hwnd,0,DCX_CACHE); 789 SCROLL_DrawScrollBar(hwnd,hdc,nBar,FALSE,TRUE); 790 ReleaseDC(hwnd,hdc); 791 } 792 lastClickPos = vertical ? pt.y:pt.x; 832 793 lastMousePos = lastClickPos; 833 794 trackThumbPos = thumbPos; … … 849 810 hittest = SCROLL_NOWHERE; 850 811 ReleaseCapture(); 812 SCROLL_Scrolling = FALSE; 813 break; 814 815 case WM_CAPTURECHANGED: 816 hittest = SCROLL_NOWHERE; 817 SCROLL_Scrolling = FALSE; 851 818 break; 852 819 … … 886 853 { 887 854 SCROLL_Highlighted = ~SCROLL_Highlighted; 888 hdc = GetDCEx(hwnd,0,DCX_CACHE); 889 SCROLL_DrawScrollBar(hwnd,hdc,nBar,FALSE,TRUE); 890 ReleaseDC(hwnd,hdc); 855 if (!SCROLL_Scrolling) 856 { 857 hdc = GetDCEx(hwnd,0,DCX_CACHE); 858 SCROLL_DrawScrollBar(hwnd,hdc,nBar,FALSE,TRUE); 859 ReleaseDC(hwnd,hdc); 860 } 891 861 return res; 892 862 } else return res; … … 907 877 908 878 case SCROLL_TOP_ARROW: 909 SCROLL_DrawArrows( hdc, infoPtr, &rect, arrowSize, vertical, 910 (hittest == SCROLL_trackHitTest), FALSE ); 911 if (hittest == SCROLL_trackHitTest) 912 { 913 if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER)) 914 { 915 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL, 916 SB_LINEUP, hwndCtl ); 917 } 918 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ? 919 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, 920 (TIMERPROC)0 ); 921 } 922 else KillSystemTimer( hwnd, SCROLL_TIMER ); 879 if (msg == WM_LBUTTONUP) 880 KillSystemTimer(hwnd,SCROLL_TIMER); 881 else if (msg == WM_LBUTTONDOWN || !timerRunning) 882 { 883 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ? 884 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, 885 (TIMERPROC)0 ); 886 if (msg != WM_LBUTTONDOWN) timerRunning = TRUE; 887 } 888 889 if (msg == WM_LBUTTONDOWN || SCROLL_lastHitTest != hittest) 890 { 891 SCROLL_DrawTopArrow(hdc,infoPtr,&rect,arrowSize,vertical,(hittest == SCROLL_trackHitTest)); 892 SCROLL_lastHitTest = hittest; 893 } 894 if (hittest == SCROLL_trackHitTest && (msg == WM_LBUTTONDOWN || msg == WM_SYSTIMER)) 895 SendMessageA(hwndOwner,vertical ? WM_VSCROLL:WM_HSCROLL,SB_LINEUP,hwndCtl); 896 923 897 break; 924 898 925 899 case SCROLL_TOP_RECT: 926 SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbSize, 900 if (msg == WM_LBUTTONUP) 901 KillSystemTimer(hwnd,SCROLL_TIMER); 902 else if (msg == WM_LBUTTONDOWN || !timerRunning) 903 { 904 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ? 905 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, 906 (TIMERPROC)0 ); 907 if (msg != WM_LBUTTONDOWN) timerRunning = TRUE; 908 } 909 910 if (msg == WM_LBUTTONDOWN || SCROLL_lastHitTest != hittest) 911 { 912 SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbSize, 927 913 thumbPos, infoPtr->flags, vertical, 928 914 (hittest == SCROLL_trackHitTest), FALSE ); 929 if (hittest == SCROLL_trackHitTest) 930 { 931 if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER)) 932 { 933 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL, 934 SB_PAGEUP, hwndCtl ); 935 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ? 936 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, 937 (TIMERPROC)0 ); 938 } 939 } 940 else KillSystemTimer( hwnd, SCROLL_TIMER ); 915 SCROLL_lastHitTest = hittest; 916 } 917 918 if (hittest == SCROLL_trackHitTest && (msg == WM_LBUTTONDOWN || msg == WM_SYSTIMER)) 919 SendMessageA(hwndOwner,vertical ? WM_VSCROLL:WM_HSCROLL,SB_PAGEUP,hwndCtl); 920 941 921 break; 942 922 … … 947 927 SCROLL_TrackingBar = nBar; 948 928 SCROLL_TrackingPos = trackThumbPos + lastMousePos - lastClickPos; 949 if (!SCROLL_MovingThumb) 950 SCROLL_DrawMovingThumb(hdc, &rect, vertical, arrowSize, thumbSize); 951 } 952 else if (msg == WM_LBUTTONUP) 953 { 954 if (SCROLL_MovingThumb) 955 SCROLL_DrawMovingThumb(hdc, &rect, vertical, arrowSize, thumbSize); 956 SCROLL_TrackingWin = 0; 929 SCROLL_MovingThumb = TRUE; 930 SCROLL_DrawMovingThumb(hdc, &rect, vertical, arrowSize, thumbSize); 931 } else if (msg == WM_LBUTTONUP || msg == WM_CAPTURECHANGED) 932 { 933 UINT val; 934 INT oldPos = infoPtr->CurVal; 935 936 SCROLL_MovingThumb = FALSE; 937 SCROLL_TrackingWin = 0; 938 val = SCROLL_GetThumbVal( infoPtr, &rect, vertical, 939 trackThumbPos + lastMousePos - lastClickPos ); 940 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL, 941 MAKEWPARAM( SB_THUMBPOSITION, val ), hwndCtl ); 942 943 if (oldPos == infoPtr->CurVal) 957 944 SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbSize, 958 945 thumbPos, infoPtr->flags, vertical, 959 946 FALSE, FALSE ); 960 } 961 else /* WM_MOUSEMOVE */ 947 } else if (msg == WM_MOUSEMOVE) 962 948 { 963 949 UINT pos; … … 967 953 { 968 954 pt = SCROLL_ClipPos( &rect, pt ); 969 pos = vertical ? (pt.y - rect.top) : (pt.x - rect.left);955 pos = vertical ? pt.y:pt.x; 970 956 } 971 if ( (pos != lastMousePos) || (!SCROLL_MovingThumb))957 if (pos != lastMousePos) 972 958 { 973 if (SCROLL_MovingThumb)974 SCROLL_DrawMovingThumb( hdc, &rect, vertical,975 arrowSize, thumbSize );976 959 lastMousePos = pos; 977 960 SCROLL_TrackingPos = trackThumbPos + pos - lastClickPos; … … 979 962 vertical, 980 963 SCROLL_TrackingPos ); 964 SCROLL_DrawMovingThumb( hdc, &rect, vertical, 965 arrowSize, thumbSize ); 981 966 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL, 982 967 MAKEWPARAM( SB_THUMBTRACK, SCROLL_TrackingVal), 983 968 hwndCtl ); 984 if (!SCROLL_MovingThumb)985 SCROLL_DrawMovingThumb( hdc, &rect, vertical,986 arrowSize, thumbSize );987 969 } 988 970 } … … 990 972 991 973 case SCROLL_BOTTOM_RECT: 992 SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbSize, 993 thumbPos, infoPtr->flags, vertical, 994 FALSE, (hittest == SCROLL_trackHitTest) ); 995 if (hittest == SCROLL_trackHitTest) 996 { 997 if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER)) 998 { 999 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL, 1000 SB_PAGEDOWN, hwndCtl ); 1001 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ? 1002 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, 1003 (TIMERPROC)0 ); 1004 } 1005 } 1006 else KillSystemTimer( hwnd, SCROLL_TIMER ); 974 if (msg == WM_LBUTTONUP) 975 KillSystemTimer(hwnd,SCROLL_TIMER); 976 else if (msg == WM_LBUTTONDOWN || !timerRunning) 977 { 978 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ? 979 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, 980 (TIMERPROC)0 ); 981 if (msg != WM_LBUTTONDOWN) timerRunning = TRUE; 982 } 983 984 if (msg == WM_LBUTTONDOWN || SCROLL_lastHitTest != hittest) 985 { 986 SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbSize, 987 thumbPos, infoPtr->flags, vertical, 988 FALSE, (hittest == SCROLL_trackHitTest) ); 989 SCROLL_lastHitTest = hittest; 990 } 991 992 if (hittest == SCROLL_trackHitTest && (msg == WM_LBUTTONDOWN || msg == WM_SYSTIMER)) 993 SendMessageA(hwndOwner,vertical ? WM_VSCROLL:WM_HSCROLL,SB_PAGEDOWN,hwndCtl); 994 1007 995 break; 1008 996 1009 997 case SCROLL_BOTTOM_ARROW: 1010 SCROLL_DrawArrows( hdc, infoPtr, &rect, arrowSize, vertical, 1011 FALSE, (hittest == SCROLL_trackHitTest) ); 1012 if (hittest == SCROLL_trackHitTest) 1013 { 1014 if ((msg == WM_LBUTTONDOWN) || (msg == WM_SYSTIMER)) 1015 { 1016 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL, 1017 SB_LINEDOWN, hwndCtl ); 1018 } 1019 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ? 1020 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, 1021 (TIMERPROC)0 ); 1022 } 1023 else KillSystemTimer( hwnd, SCROLL_TIMER ); 998 if (msg == WM_LBUTTONUP) 999 KillSystemTimer(hwnd,SCROLL_TIMER); 1000 else if (msg == WM_LBUTTONDOWN || !timerRunning) 1001 { 1002 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ? 1003 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY, 1004 (TIMERPROC)0 ); 1005 if (msg != WM_LBUTTONDOWN) timerRunning = TRUE; 1006 } 1007 1008 if (msg == WM_LBUTTONDOWN || SCROLL_lastHitTest != hittest) 1009 { 1010 SCROLL_DrawBottomArrow(hdc,infoPtr,&rect,arrowSize,vertical,(hittest == SCROLL_trackHitTest)); 1011 SCROLL_lastHitTest = hittest; 1012 } 1013 if (hittest == SCROLL_trackHitTest && (msg == WM_LBUTTONDOWN || msg == WM_SYSTIMER)) 1014 SendMessageA(hwndOwner,vertical ? WM_VSCROLL:WM_HSCROLL,SB_LINEDOWN,hwndCtl); 1015 1024 1016 break; 1025 1017 } 1026 1018 1027 if (msg == WM_LBUTTONUP )1019 if (msg == WM_LBUTTONUP || msg == WM_CAPTURECHANGED) 1028 1020 { 1029 1021 hittest = SCROLL_trackHitTest; 1030 1022 SCROLL_trackHitTest = SCROLL_NOWHERE; /* Terminate tracking */ 1031 1023 1032 if (hittest == SCROLL_THUMB) 1033 { 1034 UINT val = SCROLL_GetThumbVal( infoPtr, &rect, vertical, 1035 trackThumbPos + lastMousePos - lastClickPos ); 1036 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL, 1037 MAKEWPARAM( SB_THUMBPOSITION, val ), hwndCtl ); 1038 } 1039 else 1040 SendMessageA( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL, 1041 SB_ENDSCROLL, hwndCtl ); 1024 if (hittest != SCROLL_THUMB) 1025 SendMessageA(hwndOwner,vertical ? WM_VSCROLL:WM_HSCROLL,SB_ENDSCROLL,hwndCtl); 1042 1026 } 1043 1027 … … 1093 1077 INT oldPos = infoPtr->CurVal; 1094 1078 1095 SetScrollRange( hwnd,nBar,wParam,lParam,redraw);1079 SetScrollRange((nBar == SB_CTL) ? hwnd:SCROLL_GetFrameHandle(hwnd),nBar,wParam,lParam,redraw); 1096 1080 return (oldPos != infoPtr->CurVal) ? infoPtr->CurVal:0; 1097 1081 } … … 1115 1099 case WM_LBUTTONDOWN: 1116 1100 case WM_LBUTTONUP: 1101 case WM_CAPTURECHANGED: 1117 1102 case WM_MOUSEMOVE: 1118 1103 case WM_SYSTIMER: … … 1153 1138 1154 1139 case SBM_SETSCROLLINFO: 1155 return SetScrollInfo( hwnd, SB_CTL, (SCROLLINFO *)lParam, wParam);1140 return SetScrollInfo(hwnd,SB_CTL,(SCROLLINFO*)lParam,wParam); 1156 1141 1157 1142 case SBM_GETSCROLLINFO: … … 1183 1168 if (hwndHorz) SetWindowLongA(hwndHorz,GWL_WNDPROC,(ULONG)HorzScrollBarWndProc); 1184 1169 if (hwndVert) SetWindowLongA(hwndVert,GWL_WNDPROC,(ULONG)VertScrollBarWndProc); 1185 1186 if (!bitmapsLoaded) SCROLL_LoadBitmaps();1187 1170 } 1188 1171 … … 1193 1176 case WM_LBUTTONDOWN: 1194 1177 case WM_LBUTTONUP: 1178 case WM_CAPTURECHANGED: 1195 1179 case WM_MOUSEMOVE: 1196 1180 case WM_SYSTIMER: … … 1209 1193 1210 1194 case SBM_SETPOS: 1211 return SetScrollPos( hwnd, SB_HORZ, wParam, (BOOL)lParam);1195 return SetScrollPos(SCROLL_GetFrameHandle(hwnd),SB_HORZ,wParam,(BOOL)lParam); 1212 1196 1213 1197 case SBM_GETPOS: 1214 return GetScrollPos( hwnd, SB_HORZ);1198 return GetScrollPos(SCROLL_GetFrameHandle(hwnd),SB_HORZ); 1215 1199 1216 1200 case SBM_SETRANGE: … … 1218 1202 1219 1203 case SBM_GETRANGE: 1220 GetScrollRange( hwnd, SB_HORZ, (LPINT)wParam, (LPINT)lParam);1204 GetScrollRange(SCROLL_GetFrameHandle(hwnd),SB_HORZ,(LPINT)wParam,(LPINT)lParam); 1221 1205 return 0; 1222 1206 1223 1207 case SBM_ENABLE_ARROWS: 1224 return EnableScrollBar( hwnd, SB_HORZ, wParam);1208 return EnableScrollBar(SCROLL_GetFrameHandle(hwnd),SB_HORZ,wParam); 1225 1209 1226 1210 case SBM_SETRANGEREDRAW: … … 1228 1212 1229 1213 case SBM_SETSCROLLINFO: 1230 return SetScrollInfo( hwnd, SB_HORZ, (SCROLLINFO *)lParam, wParam);1214 return SetScrollInfo(SCROLL_GetFrameHandle(hwnd),SB_HORZ,(SCROLLINFO*)lParam,wParam); 1231 1215 1232 1216 case SBM_GETSCROLLINFO: 1233 return GetScrollInfo( hwnd, SB_HORZ, (SCROLLINFO *)lParam);1217 return GetScrollInfo(SCROLL_GetFrameHandle(hwnd),SB_HORZ,(SCROLLINFO*)lParam); 1234 1218 1235 1219 default: … … 1246 1230 case WM_LBUTTONDOWN: 1247 1231 case WM_LBUTTONUP: 1232 case WM_CAPTURECHANGED: 1248 1233 case WM_MOUSEMOVE: 1249 1234 case WM_SYSTIMER: … … 1262 1247 1263 1248 case SBM_SETPOS: 1264 return SetScrollPos( hwnd, SB_VERT, wParam, (BOOL)lParam);1249 return SetScrollPos(SCROLL_GetFrameHandle(hwnd),SB_VERT,wParam,(BOOL)lParam); 1265 1250 1266 1251 case SBM_GETPOS: 1267 return GetScrollPos( hwnd, SB_VERT);1252 return GetScrollPos(SCROLL_GetFrameHandle(hwnd),SB_VERT); 1268 1253 1269 1254 case SBM_SETRANGE: … … 1271 1256 1272 1257 case SBM_GETRANGE: 1273 GetScrollRange( hwnd, SB_VERT, (LPINT)wParam, (LPINT)lParam);1258 GetScrollRange(SCROLL_GetFrameHandle(hwnd),SB_VERT,(LPINT)wParam,(LPINT)lParam); 1274 1259 return 0; 1275 1260 1276 1261 case SBM_ENABLE_ARROWS: 1277 return EnableScrollBar( hwnd, SB_VERT, wParam);1262 return EnableScrollBar(SCROLL_GetFrameHandle(hwnd),SB_VERT,wParam); 1278 1263 1279 1264 case SBM_SETRANGEREDRAW: … … 1281 1266 1282 1267 case SBM_SETSCROLLINFO: 1283 return SetScrollInfo( hwnd, SB_VERT, (SCROLLINFO *)lParam, wParam);1268 return SetScrollInfo(SCROLL_GetFrameHandle(hwnd),SB_VERT,(SCROLLINFO*)lParam,wParam); 1284 1269 1285 1270 case SBM_GETSCROLLINFO: 1286 return GetScrollInfo( hwnd, SB_VERT, (SCROLLINFO *)lParam);1271 return GetScrollInfo(SCROLL_GetFrameHandle(hwnd),SB_VERT,(SCROLLINFO*)lParam); 1287 1272 1288 1273 default: … … 1295 1280 /* Scrollbar API */ 1296 1281 1297 //CB: fix hide/show bugs1298 1299 1282 /************************************************************************* 1300 * SetScrollInfo 32(USER32.501)1283 * SetScrollInfo (USER32.501) 1301 1284 * SetScrollInfo32 can be used to set the position, upper bound, 1302 1285 * lower bound, and page size of a scrollbar control. … … 1311 1294 * the text), and info->nPage=25. 1312 1295 */ 1313 INT WINAPI SetScrollInfo( 1314 HWND hwnd /* [I] Handle of window whose scrollbar will be affected */, 1315 INT nBar /* [I] One of SB_HORZ, SB_VERT, or SB_CTL */, 1316 const SCROLLINFO *info /* [I] Specifies what to change and new values */, 1317 BOOL bRedraw /* [I] Should scrollbar be redrawn afterwards ? */) 1318 { 1319 Win32BaseWindow *window; 1320 INT action; 1321 INT retVal; 1322 1323 retVal = SCROLL_SetScrollInfo( hwnd, nBar, info, &action ); 1324 if( action & SA_SSI_HIDE ) 1325 SCROLL_ShowScrollBar( hwnd, nBar, FALSE, FALSE ); 1326 else 1327 { 1328 if( action & SA_SSI_SHOW ) 1329 if( SCROLL_ShowScrollBar( hwnd, nBar, TRUE, TRUE ) ) 1330 return retVal; /* SetWindowPos() already did the painting */ 1331 1332 if( bRedraw && (action & SA_SSI_REFRESH)) 1333 SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, TRUE ); 1334 else if( action & SA_SSI_REPAINT_ARROWS ) 1335 SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, FALSE ); 1336 } 1337 return retVal; 1338 } 1339 //****************************************************************************** 1340 //****************************************************************************** 1341 INT SCROLL_SetScrollInfo( HWND hwnd, INT nBar, 1342 const SCROLLINFO *info, INT *action ) 1296 INT WINAPI SetScrollInfo(HWND hwnd,INT nBar,const SCROLLINFO *info,BOOL bRedraw) 1343 1297 { 1344 1298 /* Update the scrollbar state and set action flags according to … … 1347 1301 SCROLLBAR_INFO *infoPtr; 1348 1302 UINT new_flags; 1349 1350 *action = 0; 1351 1352 if (!(infoPtr = SCROLL_GetInfoPtr(hwnd, nBar))) return 0; 1303 INT action = 0; 1304 HWND hwndScroll = SCROLL_GetScrollHandle(hwnd,nBar); 1305 1306 if (!hwndScroll) return 0; 1307 if (!(infoPtr = SCROLL_GetInfoPtr(hwndScroll,nBar))) return 0; 1353 1308 if (info->fMask & ~(SIF_ALL | SIF_DISABLENOSCROLL)) return 0; 1354 1309 if ((info->cbSize != sizeof(*info)) && … … 1361 1316 { 1362 1317 infoPtr->Page = info->nPage; 1363 *action |= SA_SSI_REFRESH;1318 action |= SA_SSI_REPAINT_INTERIOR; 1364 1319 } 1365 1320 } … … 1372 1327 { 1373 1328 infoPtr->CurVal = info->nPos; 1374 *action |= SA_SSI_REFRESH;1329 action |= SA_SSI_MOVE_THUMB; 1375 1330 } 1376 1331 } … … 1391 1346 infoPtr->MaxVal != info->nMax ) 1392 1347 { 1393 *action |= SA_SSI_REFRESH;1348 action |= SA_SSI_REPAINT_INTERIOR; 1394 1349 infoPtr->MinVal = info->nMin; 1395 1350 infoPtr->MaxVal = info->nMax; … … 1425 1380 { 1426 1381 new_flags = ESB_DISABLE_BOTH; 1427 *action |= SA_SSI_REFRESH;1382 action |= SA_SSI_REFRESH; 1428 1383 } 1429 1384 else if (nBar != SB_CTL) 1430 1385 { 1431 *action = SA_SSI_HIDE;1386 action = SA_SSI_HIDE; 1432 1387 goto done; 1433 1388 } … … 1437 1392 new_flags = 0; 1438 1393 if (nBar != SB_CTL) 1439 *action |= SA_SSI_SHOW;1394 action |= SA_SSI_SHOW; 1440 1395 } 1441 1396 … … 1443 1398 { 1444 1399 infoPtr->flags = new_flags; 1445 *action |= SA_SSI_REPAINT_ARROWS;1400 action |= SA_SSI_REPAINT_ARROWS; 1446 1401 } 1447 1402 } 1448 1403 1449 1404 done: 1405 /* Update scrollbar */ 1406 1407 if( action & SA_SSI_HIDE ) 1408 ShowScrollBar(hwnd,nBar,FALSE); 1409 else 1410 { 1411 if(action & SA_SSI_SHOW) 1412 ShowScrollBar(hwnd,nBar,TRUE); 1413 1414 if(bRedraw && (action & SA_SSI_REFRESH)) 1415 SCROLL_RefreshScrollBar(hwndScroll,nBar,TRUE,TRUE); 1416 else 1417 { 1418 if (action & SA_SSI_REPAINT_INTERIOR || action & SA_SSI_MOVE_THUMB) 1419 SCROLL_RefreshScrollBar(hwndScroll,nBar,FALSE,TRUE); 1420 if (action & SA_SSI_REPAINT_ARROWS ) 1421 SCROLL_RefreshScrollBar(hwndScroll,nBar,TRUE,FALSE); 1422 } 1423 } 1424 1450 1425 /* Return current position */ 1451 1426 … … 1453 1428 } 1454 1429 /************************************************************************* 1455 * GetScrollInfo 32(USER32.284)1430 * GetScrollInfo (USER32.284) 1456 1431 * GetScrollInfo32 can be used to retrieve the position, upper bound, 1457 1432 * lower bound, and page size of a scrollbar control. … … 1466 1441 SCROLLBAR_INFO *infoPtr; 1467 1442 1468 if (!(infoPtr = SCROLL_GetInfoPtr( hwnd, nBar))) return FALSE;1443 if (!(infoPtr = SCROLL_GetInfoPtr(SCROLL_GetScrollHandle(hwnd,nBar),nBar))) return FALSE; 1469 1444 if (info->fMask & ~(SIF_ALL | SIF_DISABLENOSCROLL)) return FALSE; 1470 1445 if ((info->cbSize != sizeof(*info)) && … … 1483 1458 } 1484 1459 /************************************************************************* 1485 * SetScrollPos 32(USER32.502)1460 * SetScrollPos (USER32.502) 1486 1461 * 1487 1462 * RETURNS … … 1504 1479 1505 1480 dprintf(("SetScrollPos %x %d %d %d", hwnd, nBar, nPos, bRedraw)); 1506 if (!(infoPtr = SCROLL_GetInfoPtr( hwnd, nBar))) return 0;1481 if (!(infoPtr = SCROLL_GetInfoPtr(SCROLL_GetScrollHandle(hwnd,nBar),nBar))) return 0; 1507 1482 oldPos = infoPtr->CurVal; 1508 1483 info.cbSize = sizeof(info); … … 1513 1488 } 1514 1489 /************************************************************************* 1515 * GetScrollPos 32(USER32.285)1490 * GetScrollPos (USER32.285) 1516 1491 * 1517 1492 * RETURNS … … 1531 1506 dprintf(("GetScrollPos %x %d", hwnd, nBar)); 1532 1507 1533 infoPtr = SCROLL_GetInfoPtr( hwnd, nBar);1508 infoPtr = SCROLL_GetInfoPtr(SCROLL_GetScrollHandle(hwnd,nBar),nBar); 1534 1509 if (!infoPtr) return 0; 1535 1510 … … 1537 1512 } 1538 1513 /************************************************************************* 1539 * SetScrollRange 32(USER32.503)1514 * SetScrollRange (USER32.503) 1540 1515 * 1541 1516 * RETURNS STD … … 1558 1533 return TRUE; 1559 1534 } 1535 1560 1536 /************************************************************************* 1561 * SCROLL_SetNCSbState 1562 * 1563 * Updates both scrollbars at the same time. Used by MDI CalcChildScroll(). 1564 */ 1565 INT SCROLL_SetNCSbState(HWND hwnd, int vMin, int vMax, int vPos, 1566 int hMin, int hMax, int hPos) 1567 { 1568 INT vA, hA; 1569 SCROLLINFO vInfo, hInfo; 1570 1571 vInfo.cbSize = hInfo.cbSize = sizeof(SCROLLINFO); 1572 vInfo.nMin = vMin; hInfo.nMin = hMin; 1573 vInfo.nMax = vMax; hInfo.nMax = hMax; 1574 vInfo.nPos = vPos; hInfo.nPos = hPos; 1575 vInfo.fMask = hInfo.fMask = SIF_RANGE | SIF_POS; 1576 1577 SCROLL_SetScrollInfo( hwnd, SB_VERT, &vInfo, &vA ); 1578 SCROLL_SetScrollInfo( hwnd, SB_HORZ, &hInfo, &hA ); 1579 1580 if( !SCROLL_ShowScrollBar( hwnd, SB_BOTH, 1581 (hA & SA_SSI_SHOW),(vA & SA_SSI_SHOW) ) ) 1582 { 1583 /* SetWindowPos() wasn't called, just redraw the scrollbars if needed */ 1584 if( vA & SA_SSI_REFRESH ) 1585 SCROLL_RefreshScrollBar( hwnd, SB_VERT, FALSE, TRUE ); 1586 1587 if( hA & SA_SSI_REFRESH ) 1588 SCROLL_RefreshScrollBar( hwnd, SB_HORZ, FALSE, TRUE ); 1589 } 1590 return 0; 1591 } 1592 1593 1594 /************************************************************************* 1595 * GetScrollRange32 (USER32.286) 1537 * GetScrollRange (USER32.286) 1596 1538 * 1597 1539 * RETURNS STD … … 1605 1547 SCROLLBAR_INFO *infoPtr; 1606 1548 1607 infoPtr = SCROLL_GetInfoPtr( hwnd, nBar);1549 infoPtr = SCROLL_GetInfoPtr(SCROLL_GetScrollHandle(hwnd,nBar),nBar); 1608 1550 if (!infoPtr) 1609 1551 { … … 1616 1558 return TRUE; 1617 1559 } 1560 1618 1561 /************************************************************************* 1619 * SCROLL_ShowScrollBar() 1620 * 1621 * Back-end for ShowScrollBar(). Returns FALSE if no action was taken. 1622 * NOTE: fShowV/fShowH must be zero when nBar is SB_HORZ/SB_VERT. 1623 */ 1624 BOOL SCROLL_ShowScrollBar(HWND hwnd, INT nBar, 1625 BOOL fShowH, BOOL fShowV ) 1626 { 1627 BOOL retvalue = FALSE; 1628 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE); 1629 1630 //TRACE("hwnd=%04x bar=%d horz=%d, vert=%d\n", 1631 // hwnd, nBar, fShowH, fShowV ); 1632 1633 switch(nBar) 1634 { 1635 case SB_CTL: 1636 ShowWindow( hwnd, fShowH ? SW_SHOW : SW_HIDE ); 1637 retvalue = TRUE; 1638 goto END; 1639 1640 case SB_BOTH: 1641 case SB_HORZ: 1642 if (fShowH) 1643 { 1644 fShowH = !(dwStyle & WS_HSCROLL); 1645 dwStyle |= WS_HSCROLL; 1646 } 1647 else /* hide it */ 1648 { 1649 fShowH = (dwStyle & WS_HSCROLL); 1650 dwStyle &= ~WS_HSCROLL; 1651 } 1652 SetWindowLongA(hwnd,GWL_STYLE,dwStyle); 1653 if( nBar == SB_HORZ ) { 1654 fShowV = FALSE; 1655 break; 1656 } 1657 /* fall through */ 1658 1659 case SB_VERT: 1660 if (fShowV) 1661 { 1662 fShowV = !(dwStyle & WS_VSCROLL); 1663 dwStyle |= WS_VSCROLL; 1664 } 1665 else /* hide it */ 1666 { 1667 fShowV = (dwStyle & WS_VSCROLL); 1668 dwStyle &= ~WS_VSCROLL; 1669 } 1670 SetWindowLongA(hwnd,GWL_STYLE,dwStyle); 1671 if ( nBar == SB_VERT ) 1672 fShowH = FALSE; 1673 break; 1674 1675 default: 1676 retvalue = FALSE; /* Nothing to do! */ 1677 goto END; 1678 } 1679 1680 if( fShowH || fShowV ) /* frame has been changed, let the window redraw itself */ 1681 { 1682 SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE 1683 | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED ); 1684 retvalue = TRUE; 1685 goto END; 1686 } 1687 1688 retvalue = FALSE; /* no frame changes */ 1689 END: 1690 return retvalue; 1691 } 1692 1693 1694 /************************************************************************* 1695 * ShowScrollBar32 (USER32.532) 1562 * ShowScrollBar (USER32.532) 1696 1563 * 1697 1564 * RETURNS STD … … 1702 1569 BOOL fShow /* [I] TRUE = show, FALSE = hide */) 1703 1570 { 1704 Win32BaseWindow *window;1705 1706 1571 dprintf(("ShowScrollBar %04x %d %d\n", hwnd, nBar, fShow)); 1707 1572 1708 window = Win32BaseWindow::GetWindowFromHandle(hwnd); 1709 if(!window && nBar != SB_CTL) { 1573 if (nBar == SB_CTL) 1574 { 1575 ShowWindow(hwnd,fShow ? SW_SHOW:SW_HIDE); 1576 1577 return TRUE; 1578 } else 1579 { 1580 Win32BaseWindow *window = Win32BaseWindow::GetWindowFromHandle(hwnd); 1581 1582 if (!window) 1583 { 1710 1584 dprintf(("ShowScrollBar window not found!")); 1711 1585 SetLastError(ERROR_INVALID_WINDOW_HANDLE); 1712 1586 return 0; 1713 } 1714 if(nBar != SB_CTL || (window->getStyle() & (WM_HSCROLL|WM_VSCROLL) != 0)) 1715 { 1716 BOOL rc; 1717 1718 if(nBar == SB_HORZ || nBar == SB_BOTH) 1587 } 1588 1589 if (window->getStyle() & (WS_HSCROLL | WS_VSCROLL)) 1590 { 1591 BOOL rc; 1592 1593 if (nBar == SB_HORZ || nBar == SB_BOTH) 1719 1594 rc = OSLibWinShowScrollBar(window->getOS2FrameWindowHandle(), 1720 1595 window->getHorzScrollHandle(), 1721 1596 OSLIB_HSCROLL, fShow); 1722 1597 1723 if (nBar == SB_VERT || (rc == TRUE && nBar == SB_BOTH))1598 if (nBar == SB_VERT || (rc == TRUE && nBar == SB_BOTH)) 1724 1599 rc = OSLibWinShowScrollBar(window->getOS2FrameWindowHandle(), 1725 1600 window->getVertScrollHandle(), 1726 1601 OSLIB_VSCROLL, fShow); 1727 1728 1602 return rc; 1729 } 1730 1731 SCROLL_ShowScrollBar( hwnd, nBar, (nBar == SB_VERT) ? 0 : fShow, 1732 (nBar == SB_HORZ) ? 0 : fShow ); 1603 } 1604 } 1605 1733 1606 return TRUE; 1734 1607 } 1735 1608 /************************************************************************* 1736 * EnableScrollBar 32(USER32.171)1609 * EnableScrollBar (USER32.171) 1737 1610 */ 1738 1611 BOOL WINAPI EnableScrollBar( HWND hwnd, INT nBar, UINT flags) 1739 1612 { 1740 1613 Win32BaseWindow *window; 1741 BOOL bFineWithMe;1742 1614 SCROLLBAR_INFO *infoPtr; 1743 1615 1744 dprintf(("EnableScrollBar %04x %d %d\n", hwnd, nBar, flags)); 1745 1746 window = Win32BaseWindow::GetWindowFromHandle(hwnd); 1747 if(!window && nBar != SB_CTL) { 1748 dprintf(("EnableScrollBar window not found!")); 1749 SetLastError(ERROR_INVALID_WINDOW_HANDLE); 1750 return 0; 1751 } 1752 if(nBar != SB_CTL || (window->getStyle() & (WM_HSCROLL|WM_VSCROLL) != 0)) 1753 { 1754 BOOL fEnable, rc; 1755 1756 //hwnd = parent window with default scrollbar(s) 1757 switch(flags) { 1758 case ESB_ENABLE_BOTH: 1759 fEnable = TRUE; 1760 break; 1761 case ESB_DISABLE_BOTH: 1762 case ESB_DISABLE_RTDN: 1763 case ESB_DISABLE_LTUP: 1764 fEnable = FALSE; 1765 break; 1766 default: 1767 SetLastError(ERROR_INVALID_PARAMETER); 1768 return 0; 1769 } 1770 if(nBar == SB_HORZ || nBar == SB_BOTH) 1771 rc = OSLibWinEnableScrollBar(window->getOS2FrameWindowHandle(), OSLIB_HSCROLL, fEnable); 1772 1773 if(nBar == SB_VERT || ( rc == TRUE && nBar == SB_BOTH)) 1774 rc = OSLibWinEnableScrollBar(window->getOS2FrameWindowHandle(), OSLIB_VSCROLL, fEnable); 1775 1776 return rc; 1777 } 1778 flags &= ESB_DISABLE_BOTH; 1779 1780 if (nBar == SB_BOTH) 1781 { 1782 if (!(infoPtr = SCROLL_GetInfoPtr( hwnd, SB_VERT ))) return FALSE; 1783 if (!(bFineWithMe = (infoPtr->flags == flags)) ) 1784 { 1616 dprintf(("EnableScrollBar %04x %d %d\n", hwnd, nBar, flags)); 1617 1618 if (nBar == SB_CTL) 1619 { 1620 if (!(infoPtr = SCROLL_GetInfoPtr(hwnd,nBar))) return FALSE; 1621 1622 if (infoPtr->flags != flags) 1623 { 1624 infoPtr->flags = flags; 1625 SCROLL_RefreshScrollBar(hwnd,nBar,TRUE,TRUE); 1626 } 1627 1628 return TRUE; 1629 } else 1630 { 1631 Win32BaseWindow *window = Win32BaseWindow::GetWindowFromHandle(hwnd); 1632 if(!window) 1633 { 1634 dprintf(("EnableScrollBar window not found!")); 1635 SetLastError(ERROR_INVALID_WINDOW_HANDLE); 1636 return FALSE; 1637 } 1638 1639 if(window->getStyle() & (WS_HSCROLL | WS_VSCROLL)) 1640 { 1641 BOOL rc = FALSE; 1642 1643 if (nBar == SB_VERT || nBar == SB_BOTH) 1644 { 1645 HWND hwndScroll = Win32BaseWindow::OS2ToWin32Handle(window->getVertScrollHandle()); 1646 1647 infoPtr = SCROLL_GetInfoPtr(hwndScroll,SB_VERT); 1648 if (infoPtr) 1649 { 1650 if (infoPtr->flags != flags) 1651 { 1785 1652 infoPtr->flags = flags; 1786 SCROLL_RefreshScrollBar( hwnd, SB_VERT, TRUE, TRUE ); 1787 } 1788 nBar = SB_HORZ; 1789 } 1790 else 1791 bFineWithMe = TRUE; 1792 1793 if (!(infoPtr = SCROLL_GetInfoPtr( hwnd, nBar ))) return FALSE; 1794 if (bFineWithMe && infoPtr->flags == flags) return FALSE; 1795 infoPtr->flags = flags; 1796 1797 SCROLL_RefreshScrollBar( hwnd, nBar, TRUE, TRUE ); 1798 return TRUE; 1653 SCROLL_RefreshScrollBar(hwndScroll,nBar,TRUE,TRUE); 1654 } 1655 1656 rc = TRUE; 1657 } 1658 } 1659 if (nBar == SB_HORZ || (rc && nBar == SB_BOTH)) 1660 { 1661 HWND hwndScroll = Win32BaseWindow::OS2ToWin32Handle(window->getVertScrollHandle()); 1662 1663 infoPtr = SCROLL_GetInfoPtr(hwndScroll,SB_VERT); 1664 if (infoPtr) 1665 { 1666 if (infoPtr->flags != flags) 1667 { 1668 infoPtr->flags = flags; 1669 SCROLL_RefreshScrollBar(hwndScroll,nBar,TRUE,TRUE); 1670 } 1671 1672 rc = TRUE; 1673 } 1674 } 1675 1676 return rc; 1677 } 1678 } 1679 1680 return TRUE; 1799 1681 } 1800 1682 //****************************************************************************** -
trunk/src/user32/win32wbase.cpp
r1507 r1511 1 /* $Id: win32wbase.cpp,v 1.6 6 1999-10-28 23:51:05 sandervlExp $ */1 /* $Id: win32wbase.cpp,v 1.67 1999-10-29 16:06:56 cbratschi Exp $ */ 2 2 /* 3 3 * Win32 Window Base Class for OS/2 … … 596 596 597 597 if (dwStyle & WS_HSCROLL) 598 { 599 hwndHorzScroll = OSLibWinQueryScrollBarHandle(OS2HwndFrame, OSLIB_HSCROLL); 600 // OSLibWinShowScrollBar(OS2HwndFrame, hwndHorzScroll, OSLIB_HSCROLL, FALSE, TRUE); 601 } 602 603 if (dwStyle & WS_VSCROLL) { 604 hwndVertScroll = OSLibWinQueryScrollBarHandle(OS2HwndFrame, OSLIB_VSCROLL); 605 // OSLibWinShowScrollBar(OS2HwndFrame, hwndVertScroll, OSLIB_VSCROLL, FALSE, TRUE); 606 } 607 608 //CB: switch off -> OS/2 scrollbars 598 hwndHorzScroll = OSLibWinQueryScrollBarHandle(OS2HwndFrame, OSLIB_HSCROLL); 599 600 if (dwStyle & WS_VSCROLL) 601 hwndVertScroll = OSLibWinQueryScrollBarHandle(OS2HwndFrame, OSLIB_VSCROLL); 602 609 603 subclassScrollBars(dwStyle & WS_HSCROLL,dwStyle & WS_VSCROLL); 610 604 … … 732 726 SendInternalMessageA(WM_DESTROY, 0, 0); 733 727 734 if (hwndHorzScroll && OSLibWinQueryWindow(hwndHorzScroll,QWOS_PARENT) == OSL IB_HWND_OBJECT) OSLibWinDestroyWindow(hwndHorzScroll);735 if (hwndVertScroll && OSLibWinQueryWindow(hwndVertScroll,QWOS_PARENT) == OSL IB_HWND_OBJECT) OSLibWinDestroyWindow(hwndVertScroll);728 if (hwndHorzScroll && OSLibWinQueryWindow(hwndHorzScroll,QWOS_PARENT) == OSLibWinQueryObjectWindow()) OSLibWinDestroyWindow(hwndHorzScroll); 729 if (hwndVertScroll && OSLibWinQueryWindow(hwndVertScroll,QWOS_PARENT) == OSLibWinQueryObjectWindow()) OSLibWinDestroyWindow(hwndVertScroll); 736 730 737 731 if(getFirstChild() == NULL) { … … 1248 1242 } 1249 1243 //****************************************************************************** 1250 //TODO: Not complete (flags)1251 1244 //****************************************************************************** 1252 1245 SCROLLBAR_INFO *Win32BaseWindow::getScrollInfo(int nBar) 1253 1246 { 1254 switch(nBar) { 1247 switch(nBar) 1248 { 1255 1249 case SB_HORZ: 1256 if(horzScrollInfo) { 1257 //CB:horzScrollInfo->CurVal = OSLibWinGetScrollPos(OS2HwndFrame, hwndHorzScroll); 1258 return horzScrollInfo; 1259 } 1260 break; 1250 return horzScrollInfo; 1251 1261 1252 case SB_VERT: 1262 if(vertScrollInfo) { 1263 //CB:vertScrollInfo->CurVal = OSLibWinGetScrollPos(OS2HwndFrame, hwndVertScroll); 1264 return vertScrollInfo; 1265 } 1266 break; 1267 } 1268 return NULL; 1253 return vertScrollInfo; 1254 } 1255 1256 return NULL; 1269 1257 } 1270 1258 /***********************************************************************/
Note:
See TracChangeset
for help on using the changeset viewer.