📄 winsbar.c
字号:
rc = 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_THUMBTRACK */ rc = 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 /* 0000 */static voidwndScrollBarPos (HWND hwnd, BOOL bIsHBar, RECT* rcBar){ UINT moveRange; PMWSCROLLBARINFO pSBar; if (bIsHBar) pSBar = &hwnd->hscroll; else pSBar = &hwnd->vscroll; if (pSBar->minPos == pSBar->maxPos) { pSBar->status |= SBS_HIDE; return; } if (bIsHBar) moveRange = (rcBar->right - rcBar->left) - (mwSYSMETRICS_CXHSCROLL<<1); else moveRange = (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)) ) return FALSE; bPrevState = !(pSBar->status & SBS_DISABLED); if (bEnable && !bPrevState) pSBar->status &= ~SBS_DISABLED; else if (!bEnable && bPrevState) pSBar->status |= SBS_DISABLED; else return FALSE; if (iSBar == SB_VERT) { wndGetVScrollBarRect (pWin, &rcBar); rcBar.left --; rcBar.right --; } else { wndGetHScrollBarRect (pWin, &rcBar); rcBar.top --; rcBar.bottom --; }#if 0 SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));#else MwPaintNCScrollbars(hWnd,NULL); /* a must */#endif return 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){ PMWSCROLLBARINFO pSBar; HWND pWin; RECT rcBar; pWin = (HWND)hWnd; if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) ) return FALSE; if (iNewPos < pSBar->minPos) pSBar->curPos = pSBar->minPos; else pSBar->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 0 SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));#else MwPaintNCScrollbars(hWnd,NULL); /* a must */#endif return 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 0 SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));#else MwPaintNCScrollbars(hWnd,NULL); /* a must */#endif return TRUE;}BOOL SetScrollInfo (HWND hWnd, int iSBar, LPCSCROLLINFO lpsi, BOOL fRedraw){ 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 0 SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));#else MwPaintNCScrollbars(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; else return FALSE;#if 0 /* fix: no WM_CHANGESIZE */ SendMessage (hWnd, WM_CHANGESIZE, 0, 0);#endif if (iSBar == SB_VERT) wndGetVScrollBarRect (pWin, &rcBar); else wndGetHScrollBarRect (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_SIZECHANGED */ SendMessage/*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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -