CFormView的对话框,全屏显示绘图,添加了滚动条,在OnPaint()中写下如下代码
{CPaintDC dc(this);
dc.MoveTo(20,800);
dc.LineTo(20,1800);
}
图形超出了屏幕大小,我拖动滚动条到相应的坐标处没有图形显示出来。求教高人解答

解决方案 »

  1.   

    处理响应的滚动消息,并调用invalidate重绘视图,formview继承自CScrollView,注意当绘图超出范围并不会自动修改Formview的大小,处于formview外的图形是不会被显示的,需要自己处理这种情况
      

  2.   

    在每次OnPaint中都需要重新贴图的吧,不然会被背景覆盖。建议先贴到内存dc中,然后再从内存dc贴到相应视图dc。
      

  3.   

    我的程序就是在内存中绘图然后在OnPaint()函数中拷贝显示的,结果也是这样的只有不超过屏幕范围的图形能够显示,超出范围就不能显示了
      

  4.   

    超出范围仍然会绘图(只是clip区域外,所以不显示),要把拖动滚动条的范围设大,就出现图形
      

  5.   

    如何把滚动条范围设大?在初始化函数中SetScrollSize(12000,80000);这样吗
      

  6.   

    SetScrollSize(12000,80000);
    各小10倍,你这样超过 16位了
      

  7.   

    我在绘图函数里加上这么一句dc.SetWindowsOrg(m_nHScroll,m_nVScroll);
    其中参数分别是水平的垂直滚动条的位置,这样就行了。但我不知道这是为啥,你能给看看吗
      

  8.   

    需要重新设置窗口原点
    假设滚动条滚动了100 单位的距离,则相应的窗口原点应该移动100个单位,否则你画的始终在剪切区域外,当然就不会显示了。在onpaint,或者直接在onhscroll 滚动条事件中设置窗口原点:
    SetWindowOrg(100,0)
      

  9.   

    谢谢你了,应该就是你说的那个原因,我想请教一下,我现在实现在内存中画图,然后拷贝显示,同样是这个问题CPaintDC dc(this); // device context for painting
        CRect rect;
    this->GetClientRect(&rect);
    // 指针
    pDC = this->GetDC();//屏幕绘图上下文设备的指针

        //内存绘图
        CBitmap memBitmap;//定义一个位图对象
    CBitmap* pOldBmp = NULL;
    memDC.CreateCompatibleDC(pDC);//内存绘图设备建立与屏幕显示设备兼容的内存显示设备
    memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);//建立与屏幕显示兼容的位图
    pOldBmp = memDC.SelectObject(&memBitmap);//将位图对象选入内存显示设备只有选入了位图的内存显示设备才有地方绘图,画到指定的位图 memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);
    memDC.SetWindowOrg(m_nHScrollPos, m_nVScrollPos);
    memDC.MoveTo(90,900);
    memDC.LineTo(90,9000);
    pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);//将内存中的图拷贝到屏幕上进行显示 memDC.SelectObject(pOldBmp);
    memDC.DeleteDC();
    memBitmap.DeleteObject();
    上面是我在OnPaint()函数中的代码,我的滚动条范围SetScrollSize(12000,80000);拖动滚动条看不到绘制的直线能不能帮忙看一看
      

  10.   


    this->GetClientRect(&rect);//去掉这句,因为这句是绊脚石,它是取得你当前可见的区域做为画布大小,所以你永远不可能画到9000那里去
    把CRect rect;改为CRect rect(0,0,900,9000);