URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [mw/] [src/] [mwin/] [winsbar.2] - Rev 1765
Compare with Previous | Blame | View Log
/** Copyright (c) 2000 Greg Haerr <greg@censoft.com>* Portions Copyright (c) 1999, 2000, Wei Yongming.* jmt: scrollbar thumb ported** Microwindows win32 NonClient Scrollbars*/#define MWINCLUDECOLORS//jmt: for color macros#include "windows.h"#include "wintern.h"#include "wintools.h"#include <stdlib.h>#include <string.h>#include <stdio.h>//printf/* scrollbar status/positions*/#define SBS_UNKNOWN 0x0000#define SBS_LEFTARROW 0x0001#define SBS_RIGHTARROW 0x0002#define SBS_LEFTSPACE 0x0004#define SBS_RIGHTSPACE 0x0008#define SBS_HORZTHUMB 0x0010#define SBS_UPARROW 0x0020#define SBS_DOWNARROW 0x0040#define SBS_UPSPACE 0x0080#define SBS_DOWNSPACE 0x0100#define SBS_VERTTHUMB 0x0200#define SBS_MASK 0x03ff#define SBS_DISABLED 0x4000#define SBS_HIDE 0x8000#define HSCROLLBARVISIBLE(hwnd) ((hwnd)->style & WS_HSCROLL)#define VSCROLLBARVISIBLE(hwnd) ((hwnd)->style & WS_VSCROLL)//#/****************************** Drawing Helpers *******************************/static voidDraw3DUpFrame(HDC hDC, int l, int t, int r, int b){RECT rc;HBRUSH hbr;SetRect(&rc, l, t, r, b);Draw3dBox(hDC, rc.left, rc.top,rc.right-rc.left, rc.bottom-rc.top,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_WINDOWFRAME));InflateRect(&rc, -1, -1);Draw3dBox(hDC, rc.left, rc.top,rc.right-rc.left, rc.bottom-rc.top,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(COLOR_BTNSHADOW));InflateRect(&rc, -1, -1);hbr = CreateSolidBrush(LTGRAY);FillRect(hDC, &rc, hbr);DeleteObject(hbr);}/** Adjust client area smaller if scrollbars visible.* Also, compute the NC hittest regions for the scrollbars.*/voidMwAdjustNCScrollbars(HWND hwnd){BOOL vertbar = VSCROLLBARVISIBLE(hwnd);BOOL horzbar = HSCROLLBARVISIBLE(hwnd);if (vertbar) {hwnd->clirect.right -= mwSYSMETRICS_CXVSCROLL;if (horzbar)hwnd->clirect.bottom -= mwSYSMETRICS_CYHSCROLL;hwnd->vscroll.rc.left = hwnd->clirect.right;hwnd->vscroll.rc.right = hwnd->clirect.right +mwSYSMETRICS_CXVSCROLL;hwnd->vscroll.rc.top = hwnd->clirect.top;hwnd->vscroll.rc.bottom = hwnd->clirect.bottom;} elseSetRectEmpty(&hwnd->vscroll.rc);if (horzbar) {if (!vertbar)hwnd->clirect.bottom -= mwSYSMETRICS_CYHSCROLL;hwnd->hscroll.rc.top = hwnd->clirect.bottom;hwnd->hscroll.rc.bottom = hwnd->clirect.bottom +mwSYSMETRICS_CYHSCROLL;hwnd->hscroll.rc.left = hwnd->clirect.left;hwnd->hscroll.rc.right = hwnd->clirect.right;} elseSetRectEmpty(&hwnd->hscroll.rc);}static intwndGetBorder(HWND hwnd){if (hwnd->style & WS_BORDER) {if ((hwnd->style & WS_CAPTION) == WS_CAPTION)return mwSYSMETRICS_CXFRAME;return mwSYSMETRICS_CXBORDER;}return 0;}static BOOLwndGetVScrollBarRect (HWND hwnd, RECT* rcVBar){if (hwnd->style & WS_VSCROLL) {rcVBar->left = hwnd->winrect.right - mwSYSMETRICS_CXVSCROLL- wndGetBorder (hwnd);rcVBar->right = hwnd->winrect.right - wndGetBorder (hwnd);rcVBar->top = hwnd->clirect.top;rcVBar->bottom = hwnd->winrect.bottom - wndGetBorder (hwnd);if (hwnd->style & WS_HSCROLL && !(hwnd->hscroll.status & SBS_HIDE))rcVBar->bottom -= mwSYSMETRICS_CYHSCROLL;return TRUE;}return FALSE;}static BOOLwndGetHScrollBarRect (HWND hwnd, RECT* rcHBar){if (hwnd->style & WS_HSCROLL) {rcHBar->top = hwnd->winrect.bottom - mwSYSMETRICS_CYHSCROLL- wndGetBorder (hwnd);rcHBar->bottom = hwnd->winrect.bottom - wndGetBorder (hwnd);rcHBar->left = hwnd->clirect.left;rcHBar->right = hwnd->winrect.right - wndGetBorder (hwnd);if (hwnd->style & WS_VSCROLL && !(hwnd->vscroll.status & SBS_HIDE))rcHBar->right -= mwSYSMETRICS_CXVSCROLL;return TRUE;}return FALSE;}voidMwPaintNCScrollbars(HWND hwnd, HDC hdc){BOOL vertbar = VSCROLLBARVISIBLE(hwnd);BOOL horzbar = HSCROLLBARVISIBLE(hwnd);BOOL fGotDC = FALSE;RECT rc,rc2;POINT p3[3];int shrink=2;int start = 0;RECT rcHBar, rcVBar;if (!hdc && (horzbar || vertbar)) {hdc = GetWindowDC(hwnd);fGotDC = TRUE;}if (horzbar && vertbar) {rc.left = hwnd->clirect.right;rc.top = hwnd->clirect.bottom;rc.right = rc.left + mwSYSMETRICS_CXVSCROLL;rc.bottom = rc.top + mwSYSMETRICS_CYHSCROLL;FillRect(hdc, &rc, (HBRUSH)(COLOR_BTNFACE+1));}if (vertbar) {rc = hwnd->vscroll.rc;/* bkgnd */FillRect(hdc, &rc, (HBRUSH)(COLOR_BTNFACE+1));/* up */Draw3dUpDownState(hdc, rc.left, rc.top,mwSYSMETRICS_CXVSCROLL, mwSYSMETRICS_CYHSCROLL,hwnd->vscroll.status & SBS_UPARROW);/* down */Draw3dUpDownState(hdc, rc.left,rc.bottom-mwSYSMETRICS_CYHSCROLL,mwSYSMETRICS_CXVSCROLL, mwSYSMETRICS_CYHSCROLL,hwnd->vscroll.status & SBS_DOWNARROW);#if 1//jmt: draw arrowsSelectObject(hdc,GetStockObject(BLACK_BRUSH));/* up */p3[0].x= rc.left + (mwSYSMETRICS_CXVSCROLL/2) - 1;p3[0].y= rc.top + 2 + shrink;p3[1].x= rc.left + 2 + shrink - 1;p3[1].y= rc.top + (mwSYSMETRICS_CYHSCROLL-4) - shrink;p3[2].x= rc.left + (mwSYSMETRICS_CXVSCROLL-4) - shrink;p3[2].y= rc.top + (mwSYSMETRICS_CYHSCROLL-4) - shrink;Polygon(hdc,p3,3);/* down */p3[0].x= rc.left + (mwSYSMETRICS_CXVSCROLL/2) - 1;p3[0].y= rc.bottom - 4 - shrink;p3[1].x= rc.left + 2 + shrink - 1;p3[1].y= rc.bottom-mwSYSMETRICS_CYHSCROLL + 2 + shrink;p3[2].x= rc.left + (mwSYSMETRICS_CXVSCROLL-4) - shrink;p3[2].y= rc.bottom-mwSYSMETRICS_CYHSCROLL + 2 + shrink;Polygon(hdc,p3,3);#endif#if 1// draw moving barwndGetVScrollBarRect (hwnd, &rcVBar);rcVBar.left -- ;rcVBar.right -- ;start = rcVBar.top + mwSYSMETRICS_CYVSCROLL + hwnd->vscroll.barStart;if (start + hwnd->vscroll.barLen > rcVBar.bottom)start = rcVBar.bottom - hwnd->vscroll.barLen;if (hwnd->vscroll.barLen == 0)hwnd->vscroll.barLen=rc.bottom-rc.top-(mwSYSMETRICS_CYVSCROLL*2);/* bkgnd */rc2.left=rc.left; rc2.right=rc.right/*-1*/;rc2.top=rc.top+mwSYSMETRICS_CYHSCROLL;rc2.bottom=start;if (rc2.bottom>rc2.top)FillRect(hdc, &rc2, (HBRUSH)GetStockObject(DKGRAY_BRUSH));rc2.top=start+hwnd->vscroll.barLen;rc2.bottom=rc.bottom-mwSYSMETRICS_CYHSCROLL;if (rc2.bottom>rc2.top)FillRect(hdc, &rc2, (HBRUSH)GetStockObject(DKGRAY_BRUSH));Draw3DUpFrame (hdc, rcVBar.left, start, rcVBar.right,start + hwnd->vscroll.barLen);#if 0printf("barv:(l,t,r,b):(%d,%d,%d,%d)\n",rcVBar.left, start, rcVBar.right,start + hwnd->vscroll.barLen);#endif#endif}if (horzbar) {rc = hwnd->hscroll.rc;/* bkgnd */FillRect(hdc, &rc, (HBRUSH)(COLOR_BTNFACE+1));/* left */Draw3dUpDownState(hdc, rc.left, rc.top,mwSYSMETRICS_CXVSCROLL, mwSYSMETRICS_CYHSCROLL,hwnd->hscroll.status & SBS_LEFTARROW);/* right */Draw3dUpDownState(hdc, rc.right-mwSYSMETRICS_CXVSCROLL, rc.top,mwSYSMETRICS_CXVSCROLL, mwSYSMETRICS_CYHSCROLL,hwnd->hscroll.status & SBS_RIGHTARROW);#if 1//jmt: draw arrowsSelectObject(hdc,GetStockObject(BLACK_BRUSH));/* left */p3[0].x= rc.left + 2 + shrink;p3[0].y= rc.top + (mwSYSMETRICS_CYHSCROLL/2) ;p3[1].x= rc.left + (mwSYSMETRICS_CXVSCROLL-4) - shrink ;p3[1].y= rc.top + 2 + shrink;p3[2].x= rc.left + (mwSYSMETRICS_CXVSCROLL-4) - shrink;p3[2].y= rc.bottom - 4 - shrink + 1;Polygon(hdc,p3,3);/* right */p3[0].x= rc.right - 4 - shrink;p3[0].y= rc.top + (mwSYSMETRICS_CYHSCROLL/2) ;p3[1].x= rc.right-mwSYSMETRICS_CXVSCROLL + 2 + shrink ;p3[1].y= rc.top + 2 + shrink;p3[2].x= rc.right-mwSYSMETRICS_CXVSCROLL + 2 + shrink;p3[2].y= rc.bottom - 4 - shrink + 1;Polygon(hdc,p3,3);#endif#if 1// draw moving bar.wndGetHScrollBarRect (hwnd, &rcHBar);rcHBar.top -- ;rcHBar.bottom -- ;start = rcHBar.left + mwSYSMETRICS_CXHSCROLL + hwnd->hscroll.barStart;if (start + hwnd->hscroll.barLen > rcHBar.right)start = rcHBar.right - hwnd->hscroll.barLen;if (hwnd->hscroll.barLen == 0)hwnd->hscroll.barLen=rc.right-rc.left-(mwSYSMETRICS_CXHSCROLL*2);/* bkgnd */rc2.top=rc.top; rc2.bottom=rc.bottom/*-1*/;rc2.left=rc.left+mwSYSMETRICS_CXVSCROLL;rc2.right=start;if (rc2.right>rc2.left)FillRect(hdc, &rc2, (HBRUSH)GetStockObject(DKGRAY_BRUSH));rc2.left=start+hwnd->hscroll.barLen;rc2.right=rc.right-mwSYSMETRICS_CXVSCROLL;if (rc2.right>rc2.left)FillRect(hdc, &rc2, (HBRUSH)GetStockObject(DKGRAY_BRUSH));Draw3DUpFrame (hdc, start, rcHBar.top, start + hwnd->hscroll.barLen,rcHBar.bottom);#if 0printf("barh:(l,t,r,b):(%d,%d,%d,%d)\n",start, rcHBar.top, start + hwnd->hscroll.barLen,rcHBar.bottom);#endif#endif}if (fGotDC)ReleaseDC(hwnd, hdc);}/* handle a non-client message for a scrollbar*/voidMwHandleNCMessageScrollbar(HWND hwnd, WPARAM hitcode, LPARAM lParam, UINT msg/*BOOL fDown*/){int pos = SBS_UNKNOWN;BOOL vertbar = VSCROLLBARVISIBLE(hwnd);BOOL horzbar = HSCROLLBARVISIBLE(hwnd);int * pStat;POINT pt;RECT rc;static BOOL bDraw;static int downPos = SBS_UNKNOWN;//static int sbCode;int newThumbPos;int itemMoveable,itemCount,itemVisible,moveRange;//jmt:2k0819int moveTop,moveBottom,moveLeft,moveRight;//jmt:2k0819POINTSTOPOINT(pt, lParam);for (;;) { /* use for() to allow break statement*/if (hitcode == HTVSCROLL && vertbar){pStat = &hwnd->vscroll.status;rc = hwnd->vscroll.rc;rc.bottom = rc.top + mwSYSMETRICS_CYVSCROLL;if (PtInRect(&rc, pt)){pos = SBS_UPARROW;break;}rc.bottom = hwnd->vscroll.rc.bottom;rc.top = rc.bottom - mwSYSMETRICS_CYVSCROLL;if (PtInRect(&rc, pt)){pos = SBS_DOWNARROW;break;}pos = SBS_VERTTHUMB;} else if (hitcode == HTHSCROLL && horzbar){pStat = &hwnd->hscroll.status;rc = hwnd->hscroll.rc;rc.right = rc.left + mwSYSMETRICS_CXHSCROLL;if (PtInRect(&rc, pt)) {pos = SBS_LEFTARROW;break;}rc.right = hwnd->hscroll.rc.right;rc.left = rc.right - mwSYSMETRICS_CXHSCROLL;if (PtInRect(&rc, pt)) {pos = SBS_RIGHTARROW;break;}pos = SBS_HORZTHUMB;} elsereturn;break;}if (pos == SBS_UNKNOWN)return;*pStat &= ~SBS_MASK; /* remove stray mouse states*/if (msg == WM_NCLBUTTONDOWN || msg == WM_NCLBUTTONDBLCLK)//jmt:2k0819*pStat |= pos;else *pStat &= ~pos;if (msg == WM_NCLBUTTONDOWN || msg == WM_NCLBUTTONDBLCLK)//jmt:2k0819bDraw=TRUE;if (bDraw)MwPaintNCScrollbars(hwnd, NULL);if (pos == SBS_UPARROW || pos == SBS_LEFTARROW)//jmt:2k0820{if (hwnd->vscroll.curPos != hwnd->vscroll.minPos)sbCode = SB_LINEUP;}else if (pos == SBS_DOWNARROW || pos == SBS_RIGHTARROW)//jmt:2k0820{if (hwnd->vscroll.curPos != hwnd->vscroll.maxPos)sbCode = SB_LINEDOWN;}else if (pos == SBS_VERTTHUMB || pos == SBS_HORZTHUMB)//{sbCode = SB_THUMBTRACK;//}switch(msg){case WM_NCLBUTTONDOWN:case WM_NCLBUTTONDBLCLK://jmt:2k0819downPos = pos;break;case WM_NCMOUSEMOVE://jmt:2k0819if (hitcode == HTVSCROLL && vertbar){if (sbCode == SB_THUMBTRACK && downPos == SBS_VERTTHUMB)//{//jmt(2k0819): new algorithm for SB_THUMBTRACKrc = hwnd->vscroll.rc;moveTop = rc.top + mwSYSMETRICS_CYVSCROLL;moveBottom = hwnd->vscroll.rc.bottom - mwSYSMETRICS_CYVSCROLL;moveRange = moveBottom - moveTop;itemCount = hwnd->vscroll.maxPos - hwnd->vscroll.minPos + 1;itemVisible = hwnd->vscroll.pageStep;itemMoveable = itemCount - itemVisible + 1;newThumbPos = ((pt.y - moveTop) * itemMoveable) / moveRange;printf("((%d-%d)*%d)/%d=%d\n",pt.y,moveTop,itemMoveable,moveRange,newThumbPos);//#if ( newThumbPos >= hwnd->vscroll.minPos &&newThumbPos <= hwnd->vscroll.maxPos)SendMessage (hwnd,WM_VSCROLL, SB_THUMBTRACK, newThumbPos);break;}}if (hitcode == HTHSCROLL && horzbar){if (sbCode == SB_THUMBTRACK && downPos == SBS_HORZTHUMB)//{//jmt(2k0819): new algorithm for SB_THUMBTRACKrc = hwnd->hscroll.rc;moveLeft = rc.left + mwSYSMETRICS_CXHSCROLL;moveRight = hwnd->hscroll.rc.right - mwSYSMETRICS_CXHSCROLL;moveRange = moveRight - moveLeft;itemCount = hwnd->hscroll.maxPos - hwnd->hscroll.minPos + 1;itemVisible = hwnd->hscroll.pageStep;itemMoveable = itemCount - itemVisible + 1;newThumbPos = ((pt.x - moveLeft) * itemMoveable) / moveRange;printf("((%d-%d)*%d)/%d=%d\n",pt.y,moveLeft,itemMoveable,moveRange,newThumbPos);//#if ( newThumbPos >= hwnd->hscroll.minPos &&newThumbPos <= hwnd->hscroll.maxPos)SendMessage (hwnd,WM_HSCROLL, SB_THUMBTRACK, newThumbPos);break;}}break;case WM_NCLBUTTONUP://jmt:2k0819bDraw=FALSE;downPos = SBS_UNKNOWN;//if (sbCode==SB_THUMBTRACK){if (hitcode == HTVSCROLL && vertbar){//jmt(2k0819): new algorithm for SB_THUMBTRACKrc = hwnd->vscroll.rc;moveTop = rc.top + mwSYSMETRICS_CYVSCROLL;moveBottom = hwnd->vscroll.rc.bottom - mwSYSMETRICS_CYVSCROLL;moveRange = moveBottom - moveTop;itemCount = hwnd->vscroll.maxPos - hwnd->vscroll.minPos + 1;itemVisible = hwnd->vscroll.pageStep;itemMoveable = itemCount - itemVisible + 1;newThumbPos = ((pt.y - moveTop) * itemMoveable) / moveRange;printf("((%d-%d)*%d)/%d=%d\n",pt.y,moveTop,itemMoveable,moveRange,newThumbPos);//#if ( newThumbPos >= hwnd->vscroll.minPos &&newThumbPos <= hwnd->vscroll.maxPos)SendMessage (hwnd,WM_VSCROLL, SB_THUMBTRACK, newThumbPos);break;}if (hitcode == HTHSCROLL && horzbar){//jmt(2k0819): new algorithm for SB_THUMBTRACKrc = hwnd->hscroll.rc;moveLeft = rc.left + mwSYSMETRICS_CXHSCROLL;moveRight = hwnd->hscroll.rc.right - mwSYSMETRICS_CXHSCROLL;moveRange = moveRight - moveLeft;itemCount = hwnd->hscroll.maxPos - hwnd->hscroll.minPos + 1;itemVisible = hwnd->hscroll.pageStep;itemMoveable = itemCount - itemVisible + 1;newThumbPos = ((pt.x - moveLeft) * itemMoveable) / moveRange;printf("((%d-%d)*%d)/%d=%d\n",pt.y,moveLeft,itemMoveable,moveRange,newThumbPos);//#if ( newThumbPos >= hwnd->hscroll.minPos &&newThumbPos <= hwnd->hscroll.maxPos)SendMessage (hwnd,WM_HSCROLL, SB_THUMBTRACK, newThumbPos);break;}}else//jmt:2k0820{if (hitcode == HTVSCROLL && vertbar)SendMessage (hwnd, WM_VSCROLL, sbCode, 0);if (hitcode == HTHSCROLL && horzbar)SendMessage (hwnd, WM_HSCROLL, sbCode, 0);}break;}}static BOOLPtInRect2(const RECT *lprc, int x, int y){POINT p;p.x = x;p.y = y;return PtInRect(lprc, p);}#if 1//0000static voidwndScrollBarPos (HWND hwnd, BOOL bIsHBar, RECT* rcBar){UINT moveRange;PMWSCROLLBARINFO pSBar;if (bIsHBar)pSBar = &hwnd->hscroll;elsepSBar = &hwnd->vscroll;if (pSBar->minPos == pSBar->maxPos) {pSBar->status |= SBS_HIDE;return;}if (bIsHBar)moveRange = (rcBar->right - rcBar->left) - (mwSYSMETRICS_CXHSCROLL<<1);elsemoveRange = (rcBar->bottom - rcBar->top) - (mwSYSMETRICS_CYVSCROLL<<1);#define MWM_DEFBARLEN 18//#define MWM_MINBARLEN 8//if (pSBar->pageStep == 0){pSBar->barLen = MWM_DEFBARLEN;if (pSBar->barLen > moveRange)pSBar->barLen = MWM_MINBARLEN;}else{pSBar->barLen = moveRange * pSBar->pageStep /(pSBar->maxPos - pSBar->minPos + 1);if (pSBar->barLen < MWM_MINBARLEN)pSBar->barLen = MWM_MINBARLEN;}pSBar->barStart = moveRange * (pSBar->curPos - pSBar->minPos) /(pSBar->maxPos - pSBar->minPos + 1);if (pSBar->barStart + pSBar->barLen > moveRange)pSBar->barStart = moveRange - pSBar->barLen;if (pSBar->barStart < 0)pSBar->barStart = 0;}static PMWSCROLLBARINFO wndGetScrollBar (HWND pWin, int iSBar){if (iSBar == SB_HORZ) {if (pWin->style & WS_HSCROLL)return &pWin->hscroll;}else if (iSBar == SB_VERT) {if (pWin->style & WS_VSCROLL)return &pWin->vscroll;}return NULL;}BOOL EnableScrollBar (HWND hWnd, int iSBar, BOOL bEnable){PMWSCROLLBARINFO pSBar;HWND pWin;BOOL bPrevState;RECT rcBar;pWin = (HWND)hWnd;if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )//okreturn FALSE;bPrevState = !(pSBar->status & SBS_DISABLED);if (bEnable && !bPrevState)pSBar->status &= ~SBS_DISABLED;else if (!bEnable && bPrevState)pSBar->status |= SBS_DISABLED;elsereturn FALSE;if (iSBar == SB_VERT){wndGetVScrollBarRect (pWin, &rcBar);rcBar.left --;rcBar.right --;}else{wndGetHScrollBarRect (pWin, &rcBar);rcBar.top --;rcBar.bottom --;}#if 0SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));#elseMwPaintNCScrollbars(hWnd,NULL);//a must#endifreturn TRUE;}BOOL GetScrollPos (HWND hWnd, int iSBar, int* pPos){PMWSCROLLBARINFO pSBar;HWND pWin;pWin = (HWND)hWnd;if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )return FALSE;*pPos = pSBar->curPos;return TRUE;}BOOL GetScrollRange (HWND hWnd, int iSBar, int* pMinPos, int* pMaxPos){PMWSCROLLBARINFO pSBar;HWND pWin;pWin = (HWND)hWnd;if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )return FALSE;*pMinPos = pSBar->minPos;*pMaxPos = pSBar->maxPos;return TRUE;}BOOL SetScrollPos (HWND hWnd, int iSBar, int iNewPos)//ok{PMWSCROLLBARINFO pSBar;HWND pWin;RECT rcBar;pWin = (HWND)hWnd;if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )return FALSE;if (iNewPos < pSBar->minPos)pSBar->curPos = pSBar->minPos;elsepSBar->curPos = iNewPos;{int max = pSBar->maxPos;max -= ((pSBar->pageStep - 1) > 0)?(pSBar->pageStep - 1):0;if (pSBar->curPos > max)pSBar->curPos = max;}if (iSBar == SB_VERT){wndGetVScrollBarRect (pWin, &rcBar);rcBar.left --;rcBar.right --;}else{wndGetHScrollBarRect (pWin, &rcBar);rcBar.top --;rcBar.bottom --;}wndScrollBarPos (pWin, iSBar == SB_HORZ, &rcBar);#if 0SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));#elseMwPaintNCScrollbars(hWnd,NULL);//a must#endifreturn TRUE;}BOOL SetScrollRange (HWND hWnd, int iSBar, int iMinPos, int iMaxPos){PMWSCROLLBARINFO pSBar;HWND pWin;RECT rcBar;pWin = (HWND)hWnd;if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )return FALSE;pSBar->minPos = (iMinPos < iMaxPos)?iMinPos:iMaxPos;pSBar->maxPos = (iMinPos > iMaxPos)?iMinPos:iMaxPos;// validate parameters.if (pSBar->curPos < pSBar->minPos)pSBar->curPos = pSBar->minPos;if (pSBar->pageStep <= 0)pSBar->pageStep = 0;else if (pSBar->pageStep > (pSBar->maxPos - pSBar->minPos + 1))pSBar->pageStep = pSBar->maxPos - pSBar->minPos + 1;{int max = pSBar->maxPos;max -= ((pSBar->pageStep - 1) > 0)?(pSBar->pageStep - 1):0;if (pSBar->curPos > max)pSBar->curPos = max;}if (iSBar == SB_VERT){wndGetVScrollBarRect (pWin, &rcBar);rcBar.left --;rcBar.right --;}else{wndGetHScrollBarRect (pWin, &rcBar);rcBar.top --;rcBar.bottom --;}wndScrollBarPos (pWin, iSBar == SB_HORZ, &rcBar);#if 0SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));#elseMwPaintNCScrollbars(hWnd,NULL);//a must#endifreturn TRUE;}BOOL SetScrollInfo (HWND hWnd, int iSBar,LPCSCROLLINFO lpsi, BOOL fRedraw)//ok{PMWSCROLLBARINFO pSBar;HWND pWin;RECT rcBar;pWin = (HWND)hWnd;if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )return FALSE;if( lpsi->fMask & SIF_RANGE ){pSBar->minPos = (lpsi->nMin < lpsi->nMax)?lpsi->nMin:lpsi->nMax;pSBar->maxPos = (lpsi->nMin < lpsi->nMax)?lpsi->nMax:lpsi->nMin;}if( lpsi->fMask & SIF_POS )pSBar->curPos = lpsi->nPos;if( lpsi->fMask & SIF_PAGE )pSBar->pageStep = lpsi->nPage;// validate parameters.if (pSBar->curPos < pSBar->minPos)pSBar->curPos = pSBar->minPos;if (pSBar->pageStep <= 0)pSBar->pageStep = 0;else if (pSBar->pageStep > (pSBar->maxPos - pSBar->minPos + 1))pSBar->pageStep = pSBar->maxPos - pSBar->minPos + 1;{int max = pSBar->maxPos;max -= ((pSBar->pageStep - 1) > 0)?(pSBar->pageStep - 1):0;if (pSBar->curPos > max)pSBar->curPos = max;}if(fRedraw){if (iSBar == SB_VERT){wndGetVScrollBarRect (pWin, &rcBar);rcBar.left --;rcBar.right --;}else{wndGetHScrollBarRect (pWin, &rcBar);rcBar.top --;rcBar.bottom --;}wndScrollBarPos (pWin, iSBar == SB_HORZ, &rcBar);#if 0SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));#elseMwPaintNCScrollbars(hWnd,NULL);//a must#endif}return TRUE;}BOOL GetScrollInfo(HWND hWnd, int iSBar, LPSCROLLINFO lpsi){PMWSCROLLBARINFO pSBar;HWND pWin;pWin = (HWND)hWnd;if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )return FALSE;if( lpsi->fMask & SIF_RANGE ){lpsi->nMin = pSBar->minPos;lpsi->nMax = pSBar->maxPos;}if( lpsi->fMask & SIF_POS ){lpsi->nPos = pSBar->curPos;}if( lpsi->fMask & SIF_PAGE )lpsi->nPage = pSBar->pageStep;return TRUE;}BOOL ShowScrollBar (HWND hWnd, int iSBar, BOOL bShow){PMWSCROLLBARINFO pSBar;HWND pWin;BOOL bPrevState;RECT rcBar;pWin = (HWND)hWnd;if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )return FALSE;bPrevState = !(pSBar->status & SBS_HIDE);if (bShow && !bPrevState)pSBar->status &= ~SBS_HIDE;else if (!bShow && bPrevState)pSBar->status |= SBS_HIDE;elsereturn FALSE;#if 0//fix: no WM_CHANGESIZESendMessage (hWnd, WM_CHANGESIZE, 0, 0);#endifif (iSBar == SB_VERT)wndGetVScrollBarRect (pWin, &rcBar);elsewndGetHScrollBarRect (pWin, &rcBar);{RECT rcWin, rcClient;memcpy (&rcWin, &pWin->winrect.left, sizeof (RECT));rcClient.left = 0;rcClient.top = 0;rcClient.right = pWin->clirect.right - pWin->clirect.left;rcClient.bottom = pWin->clirect.bottom - pWin->clirect.top;#if 0//fix: no WM_SIZECHANGEDSendMessage/*SendAsyncMessage*/ (hWnd, WM_SIZECHANGED,(WPARAM)&rcWin, (LPARAM)&rcClient);#endif}if (bShow) {SendMessage (hWnd, WM_NCPAINT, 0, 0);}else {rcBar.left -= pWin->clirect.left;rcBar.top -= pWin->clirect.top;rcBar.right -= pWin->clirect.left;rcBar.bottom -= pWin->clirect.top;SendMessage (hWnd, WM_NCPAINT, 0, 0);InvalidateRect (hWnd, &rcBar, TRUE);}return TRUE;}#endif
