使用MFC在MM_LOMETRIC映射模式下画坐标轴

使用MFC在MM_LOMETRIC映射模式下画坐标轴(源码)
2007年07月31日 星期二 上午 09:44

void CgridView::OnDraw(CDC* pDC)
{
CgridDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
   return;
//设置映射模式,单位为0.1mm,引时窗口坐标系以客户区左上角为原点,X轴的方向为从左往右,Y轴的方向为从下往上
pDC->SetMapMode(MM_LOMETRIC);
//获得客户区域
CRect rc;
GetClientRect(&rc);
//将客户坐标转换为逻辑坐标,
pDC->DPtoLP(&rc);
//在逻辑坐标下,意图将视口原点所置的位置
CSize org(200,-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-500)/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-500)/100;
//相用画X轴上的坐标相同的方法来绘制Y轴坐标,此时注意绘画点的改变
for(int 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);
   }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值