📄 scrlbar.c
字号:
}
else if (pos == SBS_VERTTHUMB || pos == SBS_HORZTHUMB)
{
sbCode = SB_THUMBTRACK;
}
switch(msg)
{
case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONDBLCLK:
downPos = pos;
break;
case WM_NCMOUSEMOVE:
if (vertbar)
{
if (sbCode == SB_THUMBTRACK && downPos == SBS_VERTTHUMB)
{
/* jmt(2k0819): new algorithm for SB_THUMBTRACK */
rc = hwnd->winrect;
moveTop = rc.top + cx;
moveBottom = hwnd->winrect.bottom - cx;
moveRange = moveBottom - moveTop;
itemCount = pData->maxPos - pData->minPos + 1;
itemVisible = pData->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 >= pData->minPos &&
newThumbPos <= pData->maxPos)
{
SendMessage (hwnd,
WM_VSCROLL, SB_THUMBTRACK, newThumbPos);
SendMessage (GetParent(hwnd),
WM_VSCROLL, SB_THUMBTRACK, newThumbPos);
}
break;
}
}
if (horzbar)
{
if (sbCode == SB_THUMBTRACK && downPos == SBS_HORZTHUMB)
{
/* jmt(2k0819): new algorithm for SB_THUMBTRACK */
rc = hwnd->winrect;
moveLeft = rc.left + cy;
moveRight = hwnd->winrect.right - cy;
moveRange = moveRight - moveLeft;
itemCount = pData->maxPos - pData->minPos + 1;
itemVisible = pData->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 >= pData->minPos &&
newThumbPos <= pData->maxPos)
{
SendMessage (hwnd,
WM_HSCROLL, SB_THUMBTRACK, newThumbPos);
SendMessage (GetParent(hwnd),
WM_HSCROLL, SB_THUMBTRACK, newThumbPos);
}
break;
}
}
break;
case WM_NCLBUTTONUP:
bDraw=FALSE;
downPos = SBS_UNKNOWN;
if (sbCode==SB_THUMBTRACK)
{
if (vertbar)
{
/* jmt(2k0819): new algorithm for SB_THUMBTRACK */
rc = hwnd->winrect;
moveTop = rc.top + cx;
moveBottom = hwnd->winrect.bottom - cx;
moveRange = moveBottom - moveTop;
itemCount = pData->maxPos - pData->minPos + 1;
itemVisible = pData->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 >= pData->minPos &&
newThumbPos <= pData->maxPos)
{
SendMessage (hwnd,
WM_VSCROLL, SB_THUMBTRACK, newThumbPos);
SendMessage (GetParent(hwnd),
WM_VSCROLL, SB_THUMBTRACK, newThumbPos);
}
break; /* case */
}
if (horzbar)
{
/* jmt(2k0819): new algorithm for SB_THUMBTRACK */
rc = hwnd->winrect;
moveLeft = rc.left + cy;
moveRight = hwnd->winrect.right - cy;
moveRange = moveRight - moveLeft;
itemCount = pData->maxPos - pData->minPos + 1;
itemVisible = pData->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 >= pData->minPos &&
newThumbPos <= pData->maxPos)
{
SendMessage (hwnd,
WM_HSCROLL, SB_THUMBTRACK, newThumbPos);
SendMessage (GetParent(hwnd),
WM_HSCROLL, SB_THUMBTRACK, newThumbPos);
}
break; /* case */
}
}
else
{
if (vertbar)
{
SendMessage (hwnd, WM_VSCROLL, sbCode, 0);
SendMessage (GetParent(hwnd), WM_VSCROLL, sbCode, 0);
}
if (horzbar)
{
SendMessage (hwnd, WM_HSCROLL, sbCode, 0);
SendMessage (GetParent(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);
}
static void
wndScrollBarPos (HWND hwnd, BOOL bIsHBar, RECT* rcBar) /* jmt: 2k0820 */
{
UINT moveRange;
PMWSCROLLBARINFO pSBar;
int cx,cy;
RECT rc;
rc = hwnd->winrect;
cx=rc.right-rc.left;
cy=rc.bottom-rc.top;
pSBar = (MWSCROLLBARINFO *)hwnd->userdata;
if (pSBar->minPos == pSBar->maxPos) {
pSBar->status |= SBS_HIDE;
return;
}
if (bIsHBar)
moveRange = (rcBar->right - rcBar->left) - (cy << 1);
else
moveRange = (rcBar->bottom - rcBar->top) - (cx << 1);
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) /* jmt: 2k0820 */
{
MWSCROLLBARINFO* pData;
pData = (MWSCROLLBARINFO *)pWin->userdata;
if (!strcmp(pWin->pClass->lpszClassName,"SCROLLBAR"))
return pData;
else
return NULL;
}
BOOL EnableScrollBarEx (HWND hWnd, int iSBar, BOOL bEnable) /* jmt: iSBar not used */
{
PMWSCROLLBARINFO pSBar;
HWND pWin;
BOOL bPrevState;
RECT rcBar;
DWORD dwStyle; /* jmt:2k0820 */
pWin = (HWND)hWnd;
if ( !(pSBar = wndGetScrollBar (pWin)) )
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;
dwStyle = (GetWindowStyle (hWnd) & SBS_TYPEMASK); /* jmt: 2k0820 */
if (dwStyle == SBS_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
MwPaintScrollbars(hWnd,NULL,dwStyle); /* a must */
#endif
return TRUE;
}
BOOL GetScrollPosEx (HWND hWnd, int iSBar, int* pPos) /* jmt: iSBar not used */
{
PMWSCROLLBARINFO pSBar;
HWND pWin;
pWin = (HWND)hWnd;
if ( !(pSBar = wndGetScrollBar (pWin)) )
return FALSE;
*pPos = pSBar->curPos;
return TRUE;
}
BOOL GetScrollRangeEx (HWND hWnd, int iSBar, int* pMinPos, int* pMaxPos) /* jmt: iSBar not used */
{
PMWSCROLLBARINFO pSBar;
HWND pWin;
pWin = (HWND)hWnd;
if ( !(pSBar = wndGetScrollBar (pWin)) )
return FALSE;
*pMinPos = pSBar->minPos;
*pMaxPos = pSBar->maxPos;
return TRUE;
}
BOOL SetScrollPosEx (HWND hWnd, int iSBar, int iNewPos) /* jmt: iSBar not used */
{
PMWSCROLLBARINFO pSBar;
HWND pWin;
RECT rcBar;
DWORD dwStyle; /* jmt:2k0820 */
pWin = (HWND)hWnd;
if ( !(pSBar = wndGetScrollBar (pWin)) )
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;
}
dwStyle = (GetWindowStyle (hWnd) & SBS_TYPEMASK); /* jmt: 2k0820 */
if (dwStyle == SBS_VERT)
{
wndGetVScrollBarRect (pWin, &rcBar);
rcBar.left --;
rcBar.right --;
}
else
{
wndGetHScrollBarRect (pWin, &rcBar);
rcBar.top --;
rcBar.bottom --;
}
wndScrollBarPos (pWin, dwStyle == SBS_HORZ, &rcBar);
#if 0
SendMessage (hWnd, WM_NCPAINT, 0, (LPARAM)(&rcBar));
#else
MwPaintScrollbars(hWnd,NULL,dwStyle); /* a must */
#endif
return TRUE;
}
BOOL SetScrollRangeEx (HWND hWnd, int iSBar, int iMinPos, int iMaxPos) /* jmt: iSBar not used */
{
PMWSCROLLBARINFO pSBar;
HWND pWin;
RECT rcBar;
DWORD dwStyle; /* jmt:2k0820 */
pWin = (HWND)hWnd;
if ( !(pSBar = wndGetScrollBar (pWin)) )
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))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -