在ScrollView中画圆,发现重绘时有问题,不能正确重绘
CMyView::OnDraw(CDC* pDC)
{
CRect rect(0,0,100,100);
pDC->DPtoLP(&rect);
pDC->Ellipse(rect);
}做过一下测试
1。 当不使用DPtoLP时,圆无法显示,
2。 当使用DPtoLP时,调节滚动条时,圆不能正确重绘。调了好长一段时间了,没有找到问题所在。
原来写过这样的代码,记得没有什么问题啊。大家帮忙想想可能是哪里出问题了。

解决方案 »

  1.   

    你想干什么?
    如果你想圆随着你的滚动条滚动而滚动,就去掉pDC->DPtoLP(&rect);
    OnDraw本来画的就是逻辑坐标,OnDraw函数自己会进行设备坐标和逻辑坐标的转换,也是比较少使用逻辑坐标的函数。
    如果你想不管你滚动条如何变化画的圆的位置都不变,也就是说设备坐标不变才需要加此句pDC->DPtoLP(&rect);
    ,比如你想固定画一个圆,而不管你的滚动条如何变化,圆在屏幕上都不变化,那么你就加上这句。
      

  2.   

    [Quote=引用 1 楼  的回复:]应该要设置映射模式吧
    [/Quote
    ]说的是OnInitUpdate函数中的映射函数吧?
    在做ScrollView滚动条显示的时候就设置过了,如果不设置或使用默认的则无法显示滚动条,
    现在我的滚动条显示正常。
      

  3.   


    SetScrollSizes(NM_LOENGLISH,...);
    说的是这个函数吧?设置过了
      

  4.   

    问题已找出,其实没有如此复杂。
    如whucv兄所说
    在OnDraw()中使用的是逻辑坐标系。
    那么CRect rect(0,0,100,100);很显然有问题了。
    逻辑坐标系的y轴向下是负的,上句代码俨然是物理坐标系。简单的将CRect rect(0,0,100,100);
    改为CRect rect(0,0,100,-100);   就OK了.DPtoLP是没用的。还有点小疑问,就是我先前使用物理坐标系 ,然后调用DpTOLP,为什么和直接设置逻辑坐标系不一样呢?
    请大家发言。
      

  5.   

    谁说逻辑坐标系向下是负的?如果你没修改的话,默认映射模式为MM_TEXT,Y轴向下为负方向
    其他映射模式下,比如MM_LOMETRIC映射模式Y轴向上为正方向。
      

  6.   

    还有你的OnInitialUpdate中滚动视图的大小修改了嘛,只有你的滚动视图大小比你的显示窗口大的时候才显示滚动条。比如滚动视图大小设为400*300,那么运行程序时,把你的窗口缩小到小于400*300的时候才会出现滚动条,再好好看下映射模式吧SetScrollSizes();
      

  7.   

    多谢whucv的指导,之前太想当然了,坐标的正负和坐标系没有关系,而是与映射模式有关,谢谢,楼上各位指导。