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();
	}