在ScrollView中画圆,发现重绘时有问题,不能正确重绘
CMyView::OnDraw(CDC* pDC)
{
CRect rect(0,0,100,100);
pDC->DPtoLP(&rect);
pDC->Ellipse(rect);
}做过一下测试
1。 当不使用DPtoLP时,圆无法显示,
2。 当使用DPtoLP时,调节滚动条时,圆不能正确重绘。调了好长一段时间了,没有找到问题所在。
原来写过这样的代码,记得没有什么问题啊。大家帮忙想想可能是哪里出问题了。
CMyView::OnDraw(CDC* pDC)
{
CRect rect(0,0,100,100);
pDC->DPtoLP(&rect);
pDC->Ellipse(rect);
}做过一下测试
1。 当不使用DPtoLP时,圆无法显示,
2。 当使用DPtoLP时,调节滚动条时,圆不能正确重绘。调了好长一段时间了,没有找到问题所在。
原来写过这样的代码,记得没有什么问题啊。大家帮忙想想可能是哪里出问题了。
如果你想圆随着你的滚动条滚动而滚动,就去掉pDC->DPtoLP(&rect);
OnDraw本来画的就是逻辑坐标,OnDraw函数自己会进行设备坐标和逻辑坐标的转换,也是比较少使用逻辑坐标的函数。
如果你想不管你滚动条如何变化画的圆的位置都不变,也就是说设备坐标不变才需要加此句pDC->DPtoLP(&rect);
,比如你想固定画一个圆,而不管你的滚动条如何变化,圆在屏幕上都不变化,那么你就加上这句。
[/Quote
]说的是OnInitUpdate函数中的映射函数吧?
在做ScrollView滚动条显示的时候就设置过了,如果不设置或使用默认的则无法显示滚动条,
现在我的滚动条显示正常。
SetScrollSizes(NM_LOENGLISH,...);
说的是这个函数吧?设置过了
如whucv兄所说
在OnDraw()中使用的是逻辑坐标系。
那么CRect rect(0,0,100,100);很显然有问题了。
逻辑坐标系的y轴向下是负的,上句代码俨然是物理坐标系。简单的将CRect rect(0,0,100,100);
改为CRect rect(0,0,100,-100); 就OK了.DPtoLP是没用的。还有点小疑问,就是我先前使用物理坐标系 ,然后调用DpTOLP,为什么和直接设置逻辑坐标系不一样呢?
请大家发言。
其他映射模式下,比如MM_LOMETRIC映射模式Y轴向上为正方向。