逻辑坐标和设备坐标 以及滚动条正常显示
if (!pDoc)
return;
//设置映射模式,单位为0.1mm,引时窗口坐标系以客户区左上角为原点,X轴的方向为从左往右,Y轴的方向为从下往上
pDC->SetMapMode(MM_LOMETRIC);
//获得客户区域
CRect rc;
GetClientRect(&rc);
//将客户坐标转换为逻辑坐标,
pDC->DPtoLP(&rc);
//在逻辑坐标下,意图将视口原点所置的位置
CSize org(100,-(rc.bottom+200));
//将该位置转换为设置坐标,方便移动视口坐标原点
pDC->LPtoDP(&org);
//移动视口坐标原点,整个坐标尺在可见区域
pDC->SetViewportOrg(org.cx,org.cy);
//在逻辑坐标系下画X轴,起点为逻辑坐标系下的原点,终点为自定的
pDC->MoveTo(0,0);
//X轴的长度为客户区的宽度减去5厘米(一个象素单位为0.1mm),此时X轴终点距右边框的距离将为3cm(视口原点已经移
//动到距左边框2cm处)
pDC->LineTo(rc.right-500,0);
//以下代码用来画X轴的终点箭头
pDC->MoveTo(rc.right-540,20);
pDC->LineTo(rc.right-500,0);
pDC->MoveTo(rc.right-540,-20);
pDC->LineTo(rc.right-500,0);
pDC->TextOut(rc.right-450,0,"x(cm)");
//在逻辑坐标系下画Y轴,起点为逻辑坐标系下的原点,终点为自定的
pDC->MoveTo(0,0);
//Y轴的长度为客户区的高度减去5厘米(一个象素单位为0.1mm),此时Y轴终点距上边框的距离将为3cm(视口原点已经移
//动到距下边框2cm处)
pDC->LineTo(0,-rc.bottom-500);
//以下代码用来画Y轴的终点箭头
pDC->MoveTo(-20,-rc.bottom-540);
pDC->LineTo(0,-rc.bottom-500);
pDC->MoveTo(20,-rc.bottom-540);
pDC->LineTo(0,-rc.bottom-500);
pDC->TextOut(0,-rc.bottom-450,"y(cm)");
//在画标尺时,刻度的最大单位为cm,最小单位为mm,坐标轴上只画有整数个cm段,并在相应的位置标明cm刻度
//计算X轴可以画出多少个cm刻度
int num = (rc.right-100)/100;
//利用循环画X轴上的刻度,i表示第多少个mm刻度,总共为num*10个毫米刻度
for( int i = 1;i<=num*10; i++)
{
//毫米刻度能为5整除,此时的可能值为:5,10,15……
if(i%5==0)
{
//刻度为10的倍数时,画出刻度标记,它的长度为4mm,并在刻度的下方标明刻度值,单位为cm
if(i%10==0)
{
pDC->MoveTo(i*10,0);
pDC->LineTo(i*10,40);
CString str;
str.Format("%d",i/10);
pDC->TextOut(i*10-10,-10,str);
}
else////刻度为5,15等时,画出刻度标记,它的长度为2mm
{
pDC->MoveTo(i*10,0);
pDC->LineTo(i*10,20);
}
}
else//画出其它毫米刻度
{
pDC->MoveTo(i*10,0);
pDC->LineTo(i*10,10);
}
}
//计算Y轴可以画出多少个cm刻度
num = (-rc.bottom-100)/100;
//相用画X轴上的坐标相同的方法来绘制Y轴坐标,此时注意绘画点的改变
for( i = 1;i<=num*10; i++)
{
if(i%5==0)
{
if(i%10==0)
{
pDC->MoveTo(0,i*10);
pDC->LineTo(40,i*10);
CString str;
str.Format("%d",i/10);
pDC->TextOut(-45,i*10+10,str);
}
else
{
pDC->MoveTo(0,i*10);
pDC->LineTo(20,i*10);
}
}
else
{
pDC->MoveTo(0,i*10);
pDC->LineTo(10,i*10);
}
}