vc mfc 滚动

来源:百度知道 编辑:UC知道 时间:2024/06/06 21:05:35
哪位大侠看看这段代码哪里错了呀?我用的时候不能实现滚屏,一滚动就出现一道道竖线(乱的),并且刷新后总是显示最左上角的那一部分。
void CForex1View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
CScrollView::OnPrepareDC(pDC, pInfo);
CRect rect;
GetClientRect(&rect);
。。。
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetViewportOrg(20,pDoc->m_sizeDoc.cy+40);
pDC->SetWindowOrg(0,0);

pDC->SetViewportExt(pDoc->m_KWidth,pDoc->m_sizeDoc.cy);
pDC->SetWindowExt(1*pDoc->m_xRate,-(int)((pDoc->m_yRate)*(pDoc->m_maxPrice - pDoc->m_minPrice)));

SetScrollSizes(MM_TEXT, pDoc->m_sizeDoc);
}
恩 这个问题我自己解决了:
因为CScrollView::OnPrepareDC(pDC, pInfo);里面会对视口原点根据滚动条的位置进行调整(具体请看MFC源代码),而我又在执行完这个函数后又重新设置了视口原点,导致滚动不成功。具体应将代码改为 pDC->SetViewportOrg(pDC->GetViewportOrg() + CPoint(20,pDoc->m_sizeDoc.cy+40));这样就可以了。不过 高尾山 仍然答对一个,就是不该有SetScrollSizes这个调用,因为视口大小不会总是变化,当需要改变时用一下就可以了,所以把分给你吧,^_^

滚屏不需要改这个函数,重设DC,直接在OnDraw()里做描画处理就可以了。

SetScrollSizes在需要的时候,在任何地点都可以设定。

在这个函数里这样写
void CPanSDIView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();

CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 800;
SetScrollSizes(MM_TEXT, sizeTotal,CSize(200,100),CSize(20,10));
}