int WINAPI CoolSB_SetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw) { BOOL fRecalcFrame = FALSE; if (!lpsi) return FALSE; SCROLLINFO *mysi = GetScrollInfoFromHwnd(hwnd, fnBar); if (!mysi) return SetScrollInfo(hwnd, fnBar, lpsi, fRedraw); if (lpsi->fMask & SIF_RANGE) { mysi->nMin = lpsi->nMin; mysi->nMax = lpsi->nMax; } //The nPage member must specify a value from 0 to nMax - nMin +1. if (lpsi->fMask & SIF_PAGE) { UINT t = (UINT)(mysi->nMax - mysi->nMin + 1); mysi->nPage = min(lpsi->nPage, t); } //The nPos member must specify a value between nMin and nMax - max(nPage - 1, 0). if (lpsi->fMask & SIF_POS) { mysi->nPos = max(lpsi->nPos, mysi->nMin); mysi->nPos = min((UINT)mysi->nPos, mysi->nMax - max(mysi->nPage - 1, 0)); } SCROLLBAR *sbar = GetScrollBarFromHwnd(hwnd, fnBar); if (sbar == NULL) return 0; if ((lpsi->fMask & SIF_DISABLENOSCROLL) || (sbar->fScrollFlags & CSBS_THUMBALWAYS)) { if (!sbar->fScrollVisible) { CoolSB_ShowScrollBar(hwnd, fnBar, TRUE); fRecalcFrame = TRUE; } } else { if (mysi->nPage > (UINT)mysi->nMax || mysi->nPage == (UINT)mysi->nMax && mysi->nMax == 0 || mysi->nMax <= mysi->nMin) { if (sbar->fScrollVisible) { CoolSB_ShowScrollBar(hwnd, fnBar, FALSE); fRecalcFrame = TRUE; } } else { if (!sbar->fScrollVisible) { CoolSB_ShowScrollBar(hwnd, fnBar, TRUE); fRecalcFrame = TRUE; } } } if (fRedraw && !CoolSB_IsThumbTracking(hwnd)) RedrawNonClient(hwnd, fRecalcFrame); return mysi->nPos; }
int WINAPI CoolSB_SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL fRedraw) { int oldpos; SCROLLINFO *mysi = GetScrollInfoFromHwnd(hwnd, nBar); if (!mysi) return SetScrollPos(hwnd, nBar, nPos, fRedraw); //validate and set the scollbar position oldpos = mysi->nPos; mysi->nPos = max(nPos, mysi->nMin); mysi->nPos = min((UINT)mysi->nPos, mysi->nMax - max(mysi->nPage - 1, 0)); if (fRedraw && !CoolSB_IsThumbTracking(hwnd)) RedrawNonClient(hwnd, FALSE); return oldpos; }
int WINAPI CoolSB_SetScrollRange(HWND hwnd, int nBar, int nMinPos, int nMaxPos, BOOL fRedraw) { SCROLLINFO *mysi = GetScrollInfoFromHwnd(hwnd, nBar); if (!mysi) return SetScrollRange(hwnd, nBar, nMinPos, nMaxPos, fRedraw); if (CoolSB_IsThumbTracking(hwnd)) return mysi->nPos; //hide the scrollbar if nMin == nMax //nMax-nMin must not be greater than MAXLONG mysi->nMin = nMinPos; mysi->nMax = nMaxPos; if (fRedraw) RedrawNonClient(hwnd, FALSE); return TRUE; }
int WINAPI CoolSB_SetScrollPos(HWND hwnd, int nBar, int nPos, BOOL fRedraw) { SCROLLINFO *mysi; int oldpos; if(!(mysi = GetScrollInfoFromHwnd(hwnd, nBar))) { return SetScrollPos(hwnd, nBar, nPos, fRedraw); } //this is what should happen, but real scrollbars don't work like this.. //if(CoolSB_IsThumbTracking(hwnd)) // return mysi->nPos; //validate and set the scollbar position oldpos = mysi->nPos; mysi->nPos = max(nPos, mysi->nMin); mysi->nPos = min((UINT)mysi->nPos, mysi->nMax - max(mysi->nPage - 1, 0)); if(fRedraw && !CoolSB_IsThumbTracking(hwnd)) RedrawNonClient(hwnd, FALSE); return oldpos; }