⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winsbar.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -