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(); }
void ESSimpleRenderView::OnPaintClient(_DC *pDC, _Rect* pRectDC, _Rect* pRectClient){ ESChildScrollView::OnPaintClient(pDC, pRectDC, pRectClient); _Rect rcControlDC, rcInvalid; _Rect rRect = GetClientRect(); rcControlDC.left = (rRect.left - pRectClient->left) + pRectDC->left; rcControlDC.top = (rRect.top - pRectClient->top) + pRectDC->top; rcControlDC.right = rcControlDC.left + rRect.Width(); rcControlDC.bottom = rcControlDC.top + rRect.Height(); rcControlDC.DeflateRect(m_nBorderWidth, m_nBorderWidth, m_nBorderWidth, m_nBorderWidth); if( m_pVScroll && m_pVScroll->IsVisible() ) rcControlDC.right -= m_pVScroll->GetClientWidth(); _Point ptOffset(rcControlDC.left, rcControlDC.top); _Rect rcLineDC, rcDrawDC; int nScrollPos = GetVScrollPos(); m_pTopLine = GetLineByOffset(nScrollPos); if( m_pTopLine ) m_nTopOffsetY = nScrollPos; else m_nTopOffsetY = 0; RenderLine* pLine = m_pTopLine; if( !pLine ) pLine = m_pRootLine->m_pNextLine; int nLineIndex = 0; // CPen penBorder(PS_SOLID, 1, m_crLineBorder); // CPen* penOld = pDC->SelectObject(&penBorder); // CBrush brushClr1(m_crLine1); // CBrush brushClr2(m_crLine2); while( pLine ){ rcLineDC.left = ptOffset.x; rcLineDC.top = ptOffset.y - m_nTopOffsetY; rcLineDC.right = rcControlDC.right; rcLineDC.bottom = rcLineDC.top + pLine->m_szLine.cy; rcDrawDC = rcControlDC&rcLineDC; if( !rcDrawDC.IsRectEmpty() ){ if( m_bLineColors ){ _Rect rcFillLine = rcDrawDC; if( rcLineDC.top == rcDrawDC.top && nLineIndex ){ // pDC->MoveTo(rcDrawDC.left, rcDrawDC.top); // pDC->LineTo(rcDrawDC.right, rcDrawDC.top); rcFillLine.top ++; } // Completely visible last line. if( !pLine->m_pNextLine && rcLineDC.bottom == rcDrawDC.bottom ){ // pDC->MoveTo(rcDrawDC.left, rcDrawDC.bottom-1); // pDC->LineTo(rcDrawDC.right, rcDrawDC.bottom-1); rcFillLine.bottom --; } pDC->FillSolidRect(rcFillLine, ((nLineIndex%2) ? m_crLine2 : m_crLine1)); } pLine->Draw(pDC, rcLineDC, rcDrawDC, this); } pLine = pLine->m_pNextLine; ptOffset.y += rcLineDC.Height(); if( ptOffset.y >= (rcControlDC.bottom + m_nTopOffsetY) ) break; nLineIndex ++; } // penBorder.DeleteObject(); // brushClr1.DeleteObject(); // brushClr2.DeleteObject(); }