目的:
希望拉动滚动条,可以看到10000-20000坐标处的内容


做法:
1. 基类是FormView()
2. 添加了一个函数PaintTry(),内容如下:
   CRect rectStaticClient(0, 0,500,320);
    
CDC *pDC=GetDC();// 1
CDC memDC;//2
memDC.CreateCompatibleDC(pDC);//创建兼容内存DC

CBitmap bmp;  //3 
bmp.CreateCompatibleBitmap(pDC,rectStaticClient.Width(),rectStaticClient.Height()); //创建兼容位图  
    CBitmap *pOldBitmap=memDC.SelectObject(&bmp);  //把位图选入设备环境
    
//设置映射模式
memDC.SetMapMode(MM_ANISOTROPIC); //可变比例映射模式
memDC.SetWindowExt(10000,-420);  //设置窗口范围,y坐标轴向上
memDC.SetViewportOrg(0,rectStaticClient.Height()-1); // 设置坐标原点
memDC.SetViewportExt(rectStaticClient.Width()-1,rectStaticClient.Height()-1); //设置视口范围
    
memDC.SetBkMode(TRANSPARENT);
memDC.SetTextColor(RGB(255,255,255)); //设置画笔
CPen *oldpen;
    CPen bkpen(PS_SOLID,3,RGB(0,50,70)); //1
    CPen graypen(PS_SOLID,1,RGB(192,192,192));//2 //绘图定义变量
int i,x,y,x1,y1;
CString str; // 绘淡蓝背景阴影;
oldpen=memDC.SelectObject(&bkpen);
for(i=1;i<=19999;i++){
x=i*5;
memDC.MoveTo(x,420);
memDC.LineTo(x,20);
}
memDC.SelectObject(oldpen);
bkpen.DeleteObject(); //绘制纵向标线并写距离标
oldpen=memDC.SelectObject(&graypen);
x=0;y=0;
for(i=0;i<=10;i++)
{
x=i*2000;
memDC.MoveTo(x,15);
memDC.LineTo(x,420);
x1=i*2000+20;
y1=20;
str.Format("%d",i*2000);
memDC.TextOut(x1,y1,str);
}
memDC.TextOut(19500,y1,"(m)");    //Horizontal Scroll Info Structure
    horz.cbSize = sizeof(SCROLLINFO);
    horz.fMask = SIF_ALL;   
    horz.nMin = 0;      // parameters to set
    horz.nMax = 100;    // maximum scrolling
    horz.nPage =0;     // the page size of the scroll box
    horz.nPos = 0;     // initial position of the scroll box
    horz.nTrackPos=0;   // immediate position of a scroll box that the user is dragging
    m_hbar.SetScrollInfo(&horz);
//恢复映射模式
memDC.SetMapMode(MM_TEXT);
memDC.SetViewportOrg(0,0);
pDC->BitBlt(600,50,rectStaticClient.Width(),rectStaticClient.Height(),&memDC,0,0,SRCCOPY);  //帖图
memDC.SelectObject(pOldBitmap);
bmp.DeleteObject();//release 3
    memDC.DeleteDC();//release 2
ReleaseDC(pDC);//release 1
3. 添加滚动条响应OnHScroll()
   switch (nSBCode)
{
case SB_TOP:
sourcex = 0;
break;
case SB_BOTTOM:
sourcex = INT_MAX;
break;
case SB_THUMBTRACK:
sourcex= nPos;
break;
}
m_hbar.SetScrollPos(sourcex);
InvalidateRect(&rectStaticClient);
  
4. 头文件里有定义的是:
   void PaintTry();
CRect rectStaticClient;
SCROLLINFO horz;
int sourcex;5. Ontimer()里有调用PiantTry()问题:1.拉动滚动条,条块不能定位在某一个位置,而是闪回最左边
2.图片不能随之动
3.InvalidateRect重绘时,绘制的区域(0,0,500,320)区域是以整个屏幕最左上角重绘的区域,并不是我帖到(600,50)坐标开始的(0,0,500,320)区域。麻烦大家帮我看看问题出在哪里?非常感谢

解决方案 »

  1.   

    如果把memDC.SetWindowExt(10000,-420); 
    改为memDC.SetWindowExt(20000,-420);  
    就可以看到,实际上我是画了10000到20000的坐标的.希望拖动滚动条可以把它显示出来
      

  2.   

    为什么在PaintTry()中一直会这样:1。
        horz.nMin = 0;      // parameters to set
        horz.nMax = 100;    // maximum scrolling
    2。for(i=0;i <=10;i++)
    {
    x=i*2000;
    memDC.MoveTo(x,15);
    memDC.LineTo(x,420);
    x1=i*2000+20;
    y1=20;
    str.Format("%d",i*2000);
    memDC.TextOut(x1,y1,str);
    } 令人困惑!
      

  3.   

    希望拉动滚动条,可以看到10000-20000坐标处的内容
    永远都是for(i=0;i <=10;i++) ,怎么能看到10000-20000坐标处的内容呢。
      

  4.   

    x=i*2000; 所以可以是10000-20000
    这个是绝对没有问题的~~还是早上脑子清楚~已经解决问题了~分享给大家:)首先是图片不能随之动的解决方法:memDC.SetViewportOrg(0,rectStaticClient.Height()-1); 
    改为memDC.SetViewportOrg(-sourcex,rectStaticClient.Height()-1); 然后是滑块不动的问题,如下解决:
     horz.nPos = 0;    // initial position of the scroll box 
    改为 horz.nPos = sourcex; 楼上的一直在纠结我画的标尺。其实是没有任何问题的
    唯一的问题就是那个单位M画错地方了。应该是 memDC.TextOut(21000,y1,"(m)");问问题的好处就是可以理清自己的思路:)
    开心~希望可以对遇到同样问题的朋友们有参考价值