我用VC6.0在对话框上画了一个坐标系,但是不能随着滚动条滑动,而其它控件可以滑动,说明滚动条没有问题.我是这样做的:在::OnInitDialog()中初始化变量m_nY=450;然后在::OnPaint() 中添加下面的代码: 
        CRect   rect;     
GetClientRect(&rect);       //客户区的矩形
CDC* pDC=this->GetDC();
CBrush brush(RGB(0,120,20));
pDC->FillRect(rect,&brush);
    CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(0,0,255));
cpen.CreatePen(PS_SOLID,1,RGB(255,0,0));
pDC->SelectObject(&pen);
//指向原点
pDC->SetViewportOrg(rect.left+60,rect.bottom-100);
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetTextColor(RGB(255,0,0)); //绘制横坐标
CString sPIText[]={"","","0.15","0.30","0.45","1.00","1.15","1.30",
"1.45","2.00","2.15","2.30","2.45","3.00","3.15","3.45","4.00"};

for(int n=0;n<=16;n++)
{
pDC->LineTo(m_nY*n+m_nY/3,0);
pDC->LineTo(m_nY*n+m_nY/3,-15);
pDC->MoveTo(0,0);
pDC->LineTo(m_nY*n+2*m_nY/3,0);
pDC->LineTo(m_nY*n+2*m_nY/3,-15);
pDC->MoveTo(0,0);
pDC->LineTo(m_nY*n,0);
pDC->LineTo(m_nY*n,-30);
pDC->MoveTo(m_nY*n,0);
pDC->TextOut(m_nY*n-sPIText[n+1].GetLength()*3,-40,sPIText[n+1]);
}
    pDC->TextOut(m_nY*8,-100,"time");
pDC->MoveTo(0,0);
CString sTmp;
//绘制纵坐标
for(n=20;n<=140;n+=20)
{
pDC->LineTo(0,10*(n-10));
pDC->LineTo(-20,10*(n-10));
pDC->MoveTo(0,0);
pDC->LineTo(0,10*n);
pDC->LineTo(-20,10*n);
pDC->MoveTo(0,0);
sTmp.Format("%d",n);
pDC->TextOut(-100,10*n+25,sTmp);
}
      pen.DeleteObject();
我听人说,画图可以通过建一个新类,在这个类画图,就可以避免.请高手指点,尽量把步骤说清楚.只要运行成功,立即结帖!

解决方案 »

  1.   

    你的m_nX,m_nY与滚动条联动就可以了。
      

  2.   

    将此代码//指向原点 
    pDC->SetViewportOrg(rect.left+60,rect.bottom-100); 
    pDC->SetMapMode(MM_LOMETRIC); 
    pDC->SetTextColor(RGB(255,0,0)); 
    修改为
    // 获取滚动条当前位置 GetScrollPos()
    int cx = ??  // 获取当前滚动条水平位置  
    int cy = ??   // 获取当前滚动条垂直位置  
    //指向原点
    pDC->SetViewportOrg(cx + rect.left+60, cy + rect.bottom-100); 
    pDC->SetMapMode(MM_LOMETRIC); 
    pDC->SetTextColor(RGB(255,0,0));
      

  3.   


    // 获取滚动条当前位置 GetScrollPos()
    int cx = ??  // 获取当前滚动条水平位置  
    int cy = ??   // 获取当前滚动条垂直位置  
    //指向原点
    pDC->SetViewportOrg(cx + rect.left+60, cy + rect.bottom-100); 
    pDC->SetMapMode(MM_LOMETRIC); 
    pDC->SetTextColor(RGB(255,0,0));
      

  4.   

    刚才忘了看你的坐标系设置,考虑应该改为 负值// 获取滚动条当前位置 GetScrollPos() 
    int cx = ??  // 获取当前滚动条水平位置  
    int cy = ??  // 获取当前滚动条垂直位置  
    //指向原点 
    pDC->SetViewportOrg(-cx + rect.left+60, -cy + rect.bottom-100); 
    pDC->SetMapMode(MM_LOMETRIC); 
    pDC->SetTextColor(RGB(255,0,0)); 
      

  5.   

    我只设置了水平滚动条,你把cx和cy的值发过来,我运行一下,有没有错.
      

  6.   

    处理滚动条事件,取得滚动的横,纵偏移(dx, dy)值,相应更新绘制的坐标(+/- dx or dy),并且刷新绘制区域用InvalidateRect
      

  7.   

    我说过绘图是没有错的,关键是水平滚动这方面的错,图不能随着滚动条的移动而移动.要不把你的源代码发给我.email:[email protected];只要运行成功,立即结帖.
      

  8.   

    两种办法:1.  调用 m_scrollHelper->SetDisplaySize(701, 0);   // 把y轴大小设置为0,禁止滚动条出现2. 在void CScrollDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)里面直接返回,不调用m_scrollHelper->OnVScroll(nSBCode, nPos, pScrollBar);