// TODO: Avoid flickering! void MScrollView::UpdateScrollInfo() { MRect rcClient; MScrollView::GetClientRect(&rcClient); SCROLLINFO si; si.cbSize = sizeof(si); si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; si.nMin = 0; si.nMax = Extent().cx; si.nPage = rcClient.Width(); if (static_cast<UINT>(si.nMax) < si.nPage) ScrollPos().x = 0; si.nPos = ScrollPos().x; SetHScrollInfo(&si, TRUE); si.cbSize = sizeof(si); si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; si.nMin = 0; si.nMax = Extent().cy; si.nPage = rcClient.Height(); if (static_cast<UINT>(si.nMax) < si.nPage) ScrollPos().y = 0; si.nPos = ScrollPos().y; SetVScrollInfo(&si, TRUE); ::InvalidateRect(m_hwndParent, NULL, TRUE); }
void MScrollView::UpdateCtrlsPos() { const int siz = static_cast<int>(size()); HDWP hDWP = ::BeginDeferWindowPos(siz); if (hDWP) { for (int i = 0; i < siz; ++i) { MRect& rcCtrl = m_vecInfo[i].m_rcCtrl; ::DeferWindowPos(hDWP, m_vecInfo[i].m_hwndCtrl, NULL, rcCtrl.left - ScrollPos().x, rcCtrl.top - ScrollPos().y, rcCtrl.Width(), rcCtrl.Height(), SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOCOPYBITS); } ::EndDeferWindowPos(hDWP); } }
void MScrollView::VScroll(int nSB_, int nPos) { SCROLLINFO si; si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetVScrollInfo(&si); switch (nSB_) { case SB_TOP: SetVScrollPos(0); break; case SB_BOTTOM: SetVScrollPos(si.nMax - si.nPage); break; case SB_LINELEFT: SetVScrollPos(si.nPos - 16); break; case SB_LINERIGHT: SetVScrollPos(si.nPos + 16); break; case SB_PAGELEFT: SetVScrollPos(si.nPos - si.nPage); break; case SB_PAGERIGHT: SetVScrollPos(si.nPos + si.nPage); break; case SB_THUMBPOSITION: case SB_THUMBTRACK: SetVScrollPos(nPos); break; } ScrollPos().y = GetVScrollPos(); UpdateAll(); }
dim::point2di GUIListGadget::getItemsStartPos() const { dim::point2di ScrollPos(getScrollPosition()); return dim::point2di(Rect_.Left + 2 + ScrollPos.X, Rect_.Top + 2 + COLUMN_HEIGHT + ScrollPos.Y); }