(1)定义视大小SetScrollSizes(5000,5000);
(2)定义菜单消息映射ON_COMMAND(IDM_DRAWRECTANGLE,OnDrawrectangle)
(3)在菜单函数下画矩形
void CMyScrollView::OnDrawrectangle()
{
    CDC* pDC=this->GetDC();
    pDC->Rectangle(50,50,4000,4000);
}
滚动后原来看不见的区域,现在看见了,但是空的,原来看得见的区域,滚动后看不见了,再滚回来也是空的。如果滚动到一个新的位置,此时点击菜单,则从窗口的(50,50)画起,而不是从视的(50,50)画起。用Invalidate()函数则一滚动什么也没有了(在OnScroll或者OnVScroll,OnHscroll都是这样。)当然放在OnDraw函数里画则没什么问题,除了滚动时会闪烁外。但我的目的是通过菜单操作,因为需要各种不同的图形(如:先画底图,再铺画轨迹图,根据用户输入,轨道图需要调整等)。
多谢。

解决方案 »

  1.   

    我在CDC* pDC=this->GetDC();后面加了一句OnPrepareDC(pDC),则画图位置对上了。但滚动后还是没了。
      

  2.   

    你必须把你画的内容保存了,放在OnDraw里面,因为你一移动视,就要触发消息重绘视。
      

  3.   

    你还是要看看绘图过程啦视口的绘制是在 onDraw 中完成的,当窗口变化,系统调用 onDraw 重绘
    根本没有调你的菜单这样试一下你就明白了,你强制在 OnDraw 中调用你的 OnDrawrectangle()
    再怎么动都有啦
      

  4.   

    强制在OnDraw()函数中调用肯定是不行啦。我每次调整图像调用是不是同一个函数啊。这样就算用swich语句解决了,也是个大包袱啊。
      

  5.   

    =>i_love_cpp
    如果保存画的内容,是保存图片还是保存为DC。如果保存DC的话,应该建一个与OnDraw(CDC* pDC)函数里的pDC兼容的吧。那就必须作为一个类变量,在构造函数里建立(除非用标志第一次执行OnDraw函数时建立),具体应该怎么做呢?请赐教,我对OnDraw里的参数不清楚来源。