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(,);
pDC->LineTo(width-,);
COLORREF c=RGB(,,);
//开始进行循环,画尺子的刻度
for( i=;i<width-;i+=)
{
//尺子距离为1厘米的,刻度竖线长度为7毫米
if(i%==)
{
pDC->MoveTo(i,);
pDC->LineTo(i,-);
}
//尺子距离为5毫米的,刻度竖线长度为6毫米
else if(i%==)
{
pDC->MoveTo(i,);
pDC->LineTo(i,-);
}
//尺子距离为1毫米的,刻度竖线长度为5毫米
else
{
pDC->MoveTo(i,);
pDC->LineTo(i,-);
}
}
(3)画底部的尺子
//bottom ruler 画底部的尺子
//先在底部画一条直线,作为尺子的度量边缘(从上/左往下/右画)
pDC->MoveTo(width,-height+);
pDC->LineTo(,-height+);
//开始进行循环,画尺子的刻度
for( i=;i<width-;i+=)
{ //尺子距离为1厘米的,刻度竖线长度为7毫米
if(i%==)
{
pDC->MoveTo(width-i,-height+);
pDC->LineTo(width-i,-height+);
}
//尺子距离为5毫米的,刻度竖线长度为6毫米
else if(i%==)
{
pDC->MoveTo(width-i,-height+);
pDC->LineTo(width-i,-height+);
}
//尺子距离为1毫米的,刻度竖线长度为5毫米
else
{
pDC->MoveTo(width-i,-height+);
pDC->LineTo(width-i,-height+);
}
}
(4)画左边的尺子
//left ruler 画左边的尺子
//先在最左部画一条直线,作为尺子的度量边缘(从上/左往下/右画)
pDC->MoveTo(,-height);
pDC->LineTo(,-);
//开始进行循环,画尺子的刻度
for( i=;i<height-;i+=)
{
//尺子距离为1厘米的,刻度竖线长度为7毫米
if(i%==)
{
pDC->MoveTo(,-height+i);
pDC->LineTo(,-height+i);
}
//尺子距离为5毫米的,刻度竖线长度为6毫米
else if(i%==)
{
pDC->MoveTo(,-height+i);
pDC->LineTo(,-height+i);
}
//尺子距离为1毫米的,刻度竖线长度为5毫米
else
{
pDC->MoveTo(,-height+i);
pDC->LineTo(,-height+i);
}
}
(5)画右边的尺子
//right ruler 画右边的尺子
//先在最右边画一条直线,作为尺子的度量边缘(从右往左画)
pDC->MoveTo(width,);
pDC->LineTo(width,-height+);
//开始进行循环,画尺子的刻度
for( i=;i<height-;i+=)
{
//尺子距离为1厘米的,刻度竖线长度为7毫米
if(i%==)
{
pDC->MoveTo(width,-i);
pDC->LineTo(width-,-i);
}
//尺子距离为5毫米的,刻度竖线长度为6毫米
else if(i%==)
{
pDC->MoveTo(width,-i);
pDC->LineTo(width-,-i);
}
//尺子距离为1毫米的,刻度竖线长度为5毫米
else
{
pDC->MoveTo(width,-i);
pDC->LineTo(width-,-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(,-height/);
pDC->LineTo(width,-height/);
//画Y轴
pDC->MoveTo(width/,);
pDC->LineTo(width/,-height);
(3)画X轴和Y轴的坐标刻度
//画X轴负半轴刻度
for( i=;i<=width/;i+=)
{
pDC->MoveTo(i,-height/);
pDC->LineTo(i,-height/+);
}
//画X轴正半轴刻度
for( i=width/;i<=width;i+=)
{
pDC->MoveTo(i,-height/);
pDC->LineTo(i,-height/+);
}
//画y轴正半轴刻度
for( i=;i<=height/;i+=)
{
pDC->MoveTo(width/,i);
pDC->LineTo(width/+,i);
}
//画X轴负半轴刻度
for( i=-height/;i<=height;i+=)
{
pDC->MoveTo(width/,-i);
pDC->LineTo(width/+,-i);
}
2.运行结果截图:
![]() |
四、实验结果与讨论
(一)在MFC中绘制出的直尺如下图所示:
![]() |
(二)在MFC中绘制出的坐标系如下图所示:
![]() |
五、总结
(一)本次实验按时按量完成。
(二)通过本次实验,掌握了建立MFC应用程序的方法。
(三)通过本次实验,我掌握了映射模式及其使用。
(四)实验过程中遇到的问题及注意点:
1.客户区实际长度和宽度的设置范围应该为怎么样才能适配屏幕?
2.需要注意的是:映射模式选用的是MM_LOMETRIC,其对应的坐标系特征是:每个逻辑坐标被转换为0.1 mm。正x向右,正y向上。
参见源码:https://github.com/shenxiaolinZERO/Resources/tree/master/Resources/Computer-Graphics/ruler
MFC图形绘制——绘制直尺和坐标系的更多相关文章
- 如何在 Matlab 中绘制带箭头的坐标系
如何在 Matlab 中绘制带箭头的坐标系 如何在 Matlab 中绘制带箭头的坐标系 实现原理 演示效果 完整代码 实现原理 使用 matlab 的绘制函数时,默认设置为一个方框形的坐标系, 图1 ...
- MFC 用gdi绘制填充多边形区域
MFC 用gdi绘制填充多边形区域 这里的代码是实现一个三角形的绘制,并用刷子填充颜色 在OnPaint()函数里面 运用的是给定的三角形的三个点,很多个点可以绘制多边形 CBrush br(RGB( ...
- HTML5 Canvas ( 填充图形的绘制 ) closePath, fillStyle, fill
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Quartz2D常见图形的绘制:线条、多边形、圆
UI高级 Quartz2D http://ios.itcast.cn iOS学院 掌握 drawRect:方法的使用 常见图形的绘制:线条.多边形.圆 绘图状态的设置:文字颜色.线宽等 图形上下文状 ...
- 利用XtraDiagram.DiagramControl进行流程图形的绘制和控制
DevExpress提供了一个比较强大的图形绘制工具,可以用于绘制各种图形,如流程图.组织机构图等等,本篇随笔介绍XtraDiagram.DiagramControl的使用,以及利用代码对其属性进行控 ...
- MFC图形编辑器
前言 vs2015竟然可以完美打开工程,哈哈可以直接生成类图了.由于内容较多,所以根据内容的重要性会安排详略. https://github.com/bajdcc/GraphEditor/releas ...
- MFC-创建MFC图形界面dll
创建MFC图形界面dll 概述: 利用MFC的DLL框架,制作带有图形界面的dll,可以实现很多功能. 流程: 选择静态链接MFC DLL:以免有的库没有. 采用该框架创建的MFC,会自动生产一个MF ...
- 利用Microsoft VC++6.0 的MFC 的绘图工具实现简单图形的绘制
MFC运算功能强大,拥有完备的绘图功能. 在Windows平台上,应用程序的图形设备接口(graphics device interface,GDI)被抽象为设备上下文(Dev ...
- MFC+OpenGL基础绘制<转>
转载地址:https://blog.csdn.net/u013232740/article/details/47904115 ------------------------------------- ...
随机推荐
- tsort - 拓扑排序
tsort - 拓扑排序 本文链接:http://codingstandards.iteye.com/blog/834572 (转载请注明出处) 用途说明 tsort命令通常用于解决一种逻辑问题, ...
- ldap客户端以及jenkins的配置
1.http://www.ldapbrowsermac.com/ 分免费版和收费版,使用免费版即可.请使用正确的协议,不然,中文会乱码:支持两种LDAP v3和LDAP v2 2.https://di ...
- 1、cocos2d-x环境安装
1 所需软件 2 安装python-2.7.8.amd64.msi 注意将当中的有一步设置,Add python.exe to path 设置python的环境变量 3 解压cocos2d-x- ...
- Qt学习之对话框与主窗口的创建
Qt中的信号与槽机制 qt中槽和普通的C++成员函数几乎是一样的--可以是虚函数,可以被重载,可以是共有的,保护的或者私有的. 槽可以和信号连接在一起,在这种情况下,每当发射这个信号的信号,就会自动调 ...
- [转贴]SSL工作原理
SSL协议使用不对称加密技术实现会话双方之间信息的安全传递.可以实现信息传递的保密性.完整性,并且会话双方能鉴别对方身份.不同于常用的http协议,我们在与网站建立SSL安全连接时使用https协议, ...
- 理解 CSS 的 z-index 属性
通常认为HTML页面是二维的,但实际上,CSS还有一个z-index属性,允许层叠元素. 所有的盒模型元素都处于三维坐标系中. 除了我们常用的横坐标和纵坐标, 盒模型元素还可以沿着“z轴”层叠摆放, ...
- 【MySQL】MySQL统计NULL字段处理
select A.user_id,ifnull(sum(ifnull(A.ex_cpu,0)),0) AS a0, ifnull(sum(ifnull(A.ex_mem,0)),0) AS a1, i ...
- iframe之onload事件小记
项目上做了一个具有wizard(向导)功能的菜单导航页面,子页面的引入通过主页面上iframe的src属性切换实现.为了有个良好的交互体验,每次更新iframe的src时,主页面上都显示一个模态的lo ...
- 线程池线程数与(CPU密集型任务和I/O密集型任务)的关系
近期看了一些JVM和并发编程的专栏,结合自身理解,来做一个关于(线程池线程数与(CPU密集型任务和I/O密集型任务)的关系)的总结: 1.任务类型举例: 1.1: CPU密集型: 例如,一般我们系统的 ...
- 【Nodejs】“快算24”扑克牌游戏算法
算24是一款扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过四则运算得到结果24,四张牌必须仅用一次.这是一种挺好的锻炼孩子算数能力的扑克牌游戏. 各地玩法还有点差别,有的只算1-10,其它抽出来:有 ...



