目的:
希望拉动滚动条,可以看到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)区域。麻烦大家帮我看看问题出在哪里?非常感谢
希望拉动滚动条,可以看到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)区域。麻烦大家帮我看看问题出在哪里?非常感谢
改为memDC.SetWindowExt(20000,-420);
就可以看到,实际上我是画了10000到20000的坐标的.希望拖动滚动条可以把它显示出来
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);
} 令人困惑!
永远都是for(i=0;i <=10;i++) ,怎么能看到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)");问问题的好处就是可以理清自己的思路:)
开心~希望可以对遇到同样问题的朋友们有参考价值