MFC图形绘制——绘制直尺和坐标系

一、实验目的

1.掌握建立MFC应用程序的方法;

2.掌握映射模式。

二、实验内容

1.在MFC中绘制直尺,直尺需要有刻度,类似于日常学生使用的透明塑料直尺,需要建立四个直尺,分别分布在屏幕客户区的上、下、左、右四个边界。尺子需要有刻度,那客户区上端的尺子距离,应该有厘米、5毫米、1毫米刻度,刻度用竖线显示,长度分别为7毫米、6毫米、5毫米,外观类似于学生直尺,右端留出一公分,防止4个尺子碰在一起。

2.画出一坐标系,给出x坐标变化范围、y坐标变化范围,画出坐标轴,并在坐标轴上标出刻度、原点,要求坐标轴充满客户区。

三、实验步骤

(一)在MFC中绘制直尺。

1.设计思路:

(1)声明客户区矩形

(2)获得客户区坐标

(3)设置映射模式

(4)分四个方向画尺子,并且通过循环画出尺子刻度

注意:

映射模式选用的是MM_LOMETRIC,其对应的坐标系特征是:每个逻辑坐标被转换为0.1 mm。正x向右,正y向上。

2.代码如下:

(1)声明客户区矩形并设置映射模式

void CRulerView::OnDraw(CDC* pDC)

{

    CRulerDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CRect rect;   //声明客户区矩形
    GetClientRect(&rect);   //获得客户区坐标
    pDC->SetMapMode(MM_LOMETRIC);  //设置映射模式为:MM_LOMETRIC,即每个逻辑坐标被转换为0.1 mm。正x向右,正y向上。
    //设置实际的客户区窗口的长度和宽度范围
    int height=rect.Height()*2.5;
    int width=rect.Width()*2.5;
    int i;

(2)画顶部的尺子

//top ruler 画顶部的尺子

    //先在最上部画一条直线,作为尺子的度量边缘,从上(/左)往下(/右)画
    pDC->MoveTo(0,0);
    pDC->LineTo(width-100,0);
    COLORREF c=RGB(0,0,255);
    //开始进行循环,画尺子的刻度
    for( i=0;i<width-100;i+=10)
    {
        //尺子距离为1厘米的,刻度竖线长度为7毫米
        if(i%100==0)
        {
            pDC->MoveTo(i,0);
            pDC->LineTo(i,-70);
        }

        //尺子距离为5毫米的,刻度竖线长度为6毫米
        else if(i%50==0)
        {
            pDC->MoveTo(i,0);
            pDC->LineTo(i,-60);
        }

        //尺子距离为1毫米的,刻度竖线长度为5毫米
        else
        {
            pDC->MoveTo(i,0);
            pDC->LineTo(i,-50);
        }

    }

(3)画底部的尺子

//bottom ruler  画底部的尺子
    //先在底部画一条直线,作为尺子的度量边缘(从上/左往下/右画)
    pDC->MoveTo(width,-height+100);
    pDC->LineTo(100,-height+100);
    //开始进行循环,画尺子的刻度
    for( i=0;i<width-100;i+=10)
    {    //尺子距离为1厘米的,刻度竖线长度为7毫米
        if(i%100==0)
        {
            pDC->MoveTo(width-i,-height+100);
            pDC->LineTo(width-i,-height+30);
        }
         //尺子距离为5毫米的,刻度竖线长度为6毫米
        else if(i%50==0)
        {
            pDC->MoveTo(width-i,-height+100);
            pDC->LineTo(width-i,-height+40);
        }
        //尺子距离为1毫米的,刻度竖线长度为5毫米
        else
        {
            pDC->MoveTo(width-i,-height+100);
            pDC->LineTo(width-i,-height+50);
        }
    }

(4)画左边的尺子

//left ruler  画左边的尺子
    //先在最左部画一条直线,作为尺子的度量边缘(从上/左往下/右画)
    pDC->MoveTo(0,-height);
    pDC->LineTo(0,-100);
    //开始进行循环,画尺子的刻度
    for( i=0;i<height-100;i+=10)
    {
         //尺子距离为1厘米的,刻度竖线长度为7毫米
        if(i%100==0)
        {
            pDC->MoveTo(0,-height+i);
            pDC->LineTo(70,-height+i);
        }
         //尺子距离为5毫米的,刻度竖线长度为6毫米
        else if(i%50==0)
        {
            pDC->MoveTo(0,-height+i);
           pDC->LineTo(60,-height+i);
        }
        //尺子距离为1毫米的,刻度竖线长度为5毫米
        else
        {
            pDC->MoveTo(0,-height+i);
            pDC->LineTo(50,-height+i);
        }
    }

(5)画右边的尺子

//right ruler  画右边的尺子
    //先在最右边画一条直线,作为尺子的度量边缘(从右往左画)
    pDC->MoveTo(width,0);
    pDC->LineTo(width,-height+150);
    //开始进行循环,画尺子的刻度
    for( i=0;i<height-150;i+=10)
    {
         //尺子距离为1厘米的,刻度竖线长度为7毫米
        if(i%100==0)
        {
            pDC->MoveTo(width,-i);
            pDC->LineTo(width-70,-i);
        }
         //尺子距离为5毫米的,刻度竖线长度为6毫米
        else if(i%50==0)
        {
            pDC->MoveTo(width,-i);
            pDC->LineTo(width-60,-i);
        }
        //尺子距离为1毫米的,刻度竖线长度为5毫米
        else
        {
            pDC->MoveTo(width,-i);
            pDC->LineTo(width-50,-i);
        }
    }

2.运行结果截图:

 

(二)绘制坐标系。

1.设计思路:

(1)声明客户区矩形

(2)获得客户区坐标

(3)设置映射模式

(4)画出X轴、Y轴,并且通过循环画出坐标变化范围

注意:

映射模式选用的是MM_LOMETRIC,其对应的坐标系特征是:每个逻辑坐标被转换为0.1 mm。正x向右,正y向上。

2.代码如下:

(1)声明客户区矩形并设置映射模式

void CCoordinateSystemView::OnDraw(CDC* pDC)

{
    CCoordinateSystemDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CRect rect;//声明客户区矩形
    GetClientRect(&rect);//获得客户区坐标

    int height=(int)rect.Height()*2.5;
    int width=(int)rect.Width()*2.5;
    int i;
     pDC->SetMapMode(MM_LOMETRIC);  //设置映射模式为:MM_LOMETRIC,即每个逻辑坐标被转换为0.1 mm。正x向右,正y向上。
     pDC->SetWindowExt(width,height); //设置窗口
     pDC->SetViewportExt(width,-height); //x轴水平向右,y轴垂直向上
     //pDC->SetViewportOrg(width/2,height/2); //客户区中心为坐标系原点

(2)画X轴和Y轴

    //画X轴
     pDC->MoveTo(0,-height/2);
     pDC->LineTo(width,-height/2);
     //画Y轴
     pDC->MoveTo(width/2,0);
     pDC->LineTo(width/2,-height);

(3)画X轴和Y轴的坐标刻度

    //画X轴负半轴刻度
     for( i=0;i<=width/2;i+=100)
     {
         pDC->MoveTo(i,-height/2);
         pDC->LineTo(i,-height/2+70);
     }
     //画X轴正半轴刻度
     for( i=width/2;i<=width;i+=100)
     {
         pDC->MoveTo(i,-height/2);
         pDC->LineTo(i,-height/2+70);
     }
     //画y轴正半轴刻度
     for( i=0;i<=height/2;i+=100)
     {
         pDC->MoveTo(width/2,i);
         pDC->LineTo(width/2+70,i);
     }
     //画X轴负半轴刻度
     for( i=-height/2;i<=height;i+=100)
     {
         pDC->MoveTo(width/2,-i);
         pDC->LineTo(width/2+70,-i);
     }

2.运行结果截图:

 

四、实验结果与讨论

(一)在MFC中绘制出的直尺如下图所示:

 

(二)在MFC中绘制出的坐标系如下图所示:

 

五、总结

(一)本次实验按时按量完成。

(二)通过本次实验,掌握了建立MFC应用程序的方法。

(三)通过本次实验,我掌握了映射模式及其使用。

(四)实验过程中遇到的问题及注意点:

1.客户区实际长度和宽度的设置范围应该为怎么样才能适配屏幕?

2.需要注意的是:映射模式选用的是MM_LOMETRIC,其对应的坐标系特征是:每个逻辑坐标被转换为0.1 mm。正x向右,正y向上。

时间: 2024-10-08 14:13:01

MFC图形绘制——绘制直尺和坐标系的相关文章

自定义View之绘图篇(一):基础图形的绘制

生活是一面镜子,你对它笑,它就对你笑:你对它哭,它也对你哭.--萨克雷 在正文开始之前,我先抛一个脑洞大开的题目给大家:商人以45元一双进购了2双鞋子,然后亏本30一双出售.某个顾客给了他100买了2双鞋子,商人没零钱找于是拿着这100找邻居换了100的零钱,后来邻居发现这100是假的,商人只得陪了邻居100真的... 请问商人亏了多少?? 相关文章: Android自定义View之Path解析 一.Paint与Canvas 绘图需要两个工具,笔和纸.这里的 Paint相当于笔,而 Canvas

Quartz2D常见图形的绘制:线条、多边形、圆

UI高级 Quartz2D http://ios.itcast.cn  iOS学院 掌握 drawRect:方法的使用 常见图形的绘制:线条.多边形.圆 绘图状态的设置:文字颜色.线宽等 图形上下文状态的保存与恢复(图形上下文栈) 图片裁剪 截图 什么是Quartz2D Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作 Ø绘制图形 : 线条\三角形\矩形\圆\弧等 Ø绘制文字 Ø绘制\生成图片(图像) Ø读取\生成PDF Ø截图\裁剪图片 Ø自定义

ios 基本图形的绘制 基于bitmap 位图

内容包括 图片水印,图片裁剪,屏幕截图,背景平铺 1.图片水印功能 #import "UIImage+MJ.h" @implementation UIImage (MJ) + (instancetype)waterImageWithBg:(NSString *)bg logo:(NSString *)logo { UIImage *bgImage = [UIImage imageNamed:bg]; // 1.创建一个基于位图的上下文(开启一个基于位图的上下文) UIGraphicsB

ios 基本图形的绘制

基本图形的绘制 包括: 代码画线,画文字 图片 裁剪 重绘  简单动画 当自定义view的时候 系统会自动调用drawRect 方法 画线 - (void)drawRect:(CGRect)rect { // Drawing code // 1.获得图形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 2.拼接图形(路径) // 设置线段宽度 CGContextSetLineWidth(ctx, 10); // 设置线段头尾部的样式

HTML5 Canvas ( 填充图形的绘制 ) closePath, fillStyle, fill

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>canvas</title> <script type="text/javascript" src="../js/jQuery.js"></script> <style type="text/css">

MFC 用gdi绘制填充多边形区域

MFC 用gdi绘制填充多边形区域 这里的代码是实现一个三角形的绘制,并用刷子填充颜色 在OnPaint()函数里面 运用的是给定的三角形的三个点,很多个点可以绘制多边形 [cpp] view plaincopy CBrush br(RGB(40,130,170)); CRgn rgn; CPoint arrpt[3]; arrpt[0].x = m_rcAT.right-8; arrpt[0].y = m_rcAT.top+m_rcAT.Height()*2/5; arrpt[1].x = a

零基础HTML5游戏制作教程 第2章 简单图形的绘制

第二章 简单图形的绘制 HTML5支持使用Canvas和SVG等方式在网页直接绘制图形.其中SVG适合用来绘制高质量的矢量图形,不适合用来做游戏,所以我们做游戏一般使用Canvas. 由于本教程以简单为原则,所以在初学阶段请不要把注意力分散到美工.画质等细节,我们只需要掌握矩形.多边形.圆形等简单图形的绘制,并对这些图形编程,使之具有一定的运动能力和游戏效果. (如果你偷懒,你甚至可以跳过本章中多边形和圆形的绘制,只学矩形,然后直接去看下一章.) 一,矩形的绘制 命令的格式是context.fi

MFC图形图像

一.CDC类 CDC类简介 CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户区关联的显示上下文的成员函数.使用CDC的成员函数可以进行所有的绘图操作,包括处理绘图工具.GDI对象的选择.颜色和调色板的处理.获取和设置绘图属性.映射.窗口范围.坐标转换.剪切以及绘制直线.简单图形.椭圆和多边形等,另外它还为文本输出.处理字体.使用打印机跳转和滚动等提供了成员函数. 如上所述,CDC类几乎封装了所有的Windows GDI函数,另外,MFC

利用Microsoft VC++6.0 的MFC 的绘图工具实现简单图形的绘制

MFC运算功能强大,拥有完备的绘图功能. 在Windows平台上,应用程序的图形设备接口(graphics device interface,GDI)被抽象为设备上下文(Device Context,DC). 在微软基类库MFC中,CDC类是定义设备上下文对象的基类,所有绘图函数都在CDC基类中定义.当需要输出文字或图形时,就需要调用CDC类的成员函数,这些成员函数具备输出文本.绘制图形的功能. 本文讲解的例程全部在TestView.cpp文件的void CTestView::OnDraw(CD