📄 winsbar.c
字号:
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 BOOL PtInRect2(const RECT *lprc, int x, int y)
{
POINT p;
p.x = x;
p.y = y;
return PtInRect(lprc, p);
}
*/
#if 1 /* 0000 */
static void wndScrollBarPos (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;
pSBar = wndGetScrollBar (pWin, iSBar);
if(!pSBar)
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;
pSBar = wndGetScrollBar(pWin,iSBar);
if(!pSBar)
return FALSE;
*pPos = pSBar->curPos;
return TRUE;
}
BOOL GetScrollRange (HWND hWnd, int iSBar, int* pMinPos, int* pMaxPos)
{
PMWSCROLLBARINFO pSBar;
HWND pWin;
pWin = (HWND)hWnd;
pSBar = wndGetScrollBar(pWin,iSBar);
if(!pSBar)
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;
pSBar = wndGetScrollBar(pWin,iSBar);
if(!pSBar)
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;
pSBar = wndGetScrollBar(pWin,iSBar);
if(!pSBar)
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;
pSBar = wndGetScrollBar(pWin,iSBar);
if(!pSBar)
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;
pSBar = wndGetScrollBar(pWin,iSBar);
if(!pSBar)
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;
pSBar = wndGetScrollBar(pWin,iSBar);
if(!pSBar)
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);
#if 0 /* fix: no WM_SIZECHANGED */
{
RECT rcWin;
RECT rcClient;
s_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;
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 //-- if 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -