C++经典绘图工具EasyX
EasyX简介
在学习C语言时,很多同学抱怨说C只能写最简单的Demo程序,通过printf在屏幕上打印字符来验证代码。这样的编程很枯燥,一点没觉得自己在设计软件。
EasyX是针对C++的第三方图形库,通过它我们能够在屏幕上绘制出自己喜欢的各种颜色的图形。有了它,自己编写好玩的小游戏不是梦哦。
使用EasyX有下面几点要求:
- 只能在Windows下使用
- 建议使用Visual Studio作为IDE
- 必须写C++代码(文件后缀名为cpp)
EasyX安装
下载路径
安装
解压下载目录 EasyX_20151015(beta).zip 如下:

双击 setup.hta 文件

找到需要的VS版本点击安装即可。
PS:在解压缩的文件中,有个EasyX_help.chm文件,它是EasyX的文档,所有API的介绍都在里面。
作为一个软件开发人员,阅读文档是最基本的技能,希望大家从现在开始培养自己这方面的能力。如果你通读了这个文档之后,相信你完全能够自己完成在屏幕上画出自己想要的图案。
EasyX基本API
在EasyX的文档中,有一节是“超简单的使用预览”,里面有这样一段代码。
#include <iostream>
#include <graphics.h>
#include <conio.h>
void main()
{
initgraph(640, 480); // 创建图形界面
circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100
getch(); // 按任意键继续
closegraph(); // 关闭图形界面
}
这段代码的执行结果如下:

这个Demo程序实现了在屏幕上画一个圆形的功能。
1. 画布的创建和销毁
main函数中,第一行和最后一行代码是创建和删除图形界面,这个图形界面常常被叫做“画布”。
- initgraph()
创建画布时,需要输入目标窗口的长宽值。
- closegraph()
和C语言中一样,C++也强调代码的对称性,申请资源和释放资源的代码总是成对出现的。
2. 坐标系
在 EasyX 中,坐标分为:逻辑坐标和物理坐标。
我们这里只介绍逻辑坐标。
逻辑坐标是在程序中用于绘图的坐标体系。
坐标默认的原点在屏幕的左上角,X 轴向右为正,Y 轴向下为正,度量单位是象素。
坐标的原点,方向和单位都可以通过特定函数修改。我们一般只采用默认设置。
3. 圆形绘制
circle这个函数用于画圆。
void circle(
int x,
int y,
int radius
);
参数:
- x
圆的圆心 x 坐标。 - y
圆的圆心 y 坐标。 - radius
圆的半径。
Demo程序中就是用这个函数绘制了一个圆心为(200, 200),半径为100的圆形。
4. 直线绘制
这个函数用于画线。还可以用 linerel 和 lineto 画线。
void line(
int x1,
int y1,
int x2,
int y2
);
参数
x1
线的起始点的 x 坐标。y1
线的起始点的 y 坐标。x2
线的终止点的 x 坐标。y2
线的终止点的 y 坐标。
5. 矩形绘制
这个函数用于画空心矩形。
void rectangle(
int left,
int top,
int right,
int bottom
);
参数
left
矩形左部 x 坐标。top
矩形上部 y 坐标。right
矩形右部 x 坐标。bottom
矩形下部 y 坐标。
6. 椭圆绘制
这个函数用于画椭圆。
void ellipse(
int left,
int top,
int right,
int bottom
);
参数
left
椭圆外切矩形的左上角 x 坐标。top
椭圆外切矩形的左上角 y 坐标。righ椭圆外切矩形的右下角 x 坐标。
bottom
椭圆外切矩形的右下角 y 坐标。
上面是几个基本图形的绘制方法,它们有个特点是画出的都是空心的图形。与之对应的是一组绘制带有填充颜色图形的接口。
fillcircle(), fillellipse(), fillrectangle()
它们的参数和画空心的接口完全一样,只不过使用前需要调用下面这个接口设置填充颜色。
setfillcolor()
下面我们来看看这些函数究竟能做什么。
EasyX实战

上面这幅图就是用EasyX实现的。哈哈,貌似有点丑, 不过假如你能独立写出这个功能,说明你已经基本掌握了EasyX的用法。
提供一个代码框架:
#include <iostream>
#include <graphics.h>
void main()
{
initgraph(800, 600);
// Add your code
closegraph();
}
这里请先自己思考一下,不要急往下看。
(... 15分钟过去了 ...)
分析
这幅图主要是由圆形、椭圆形、矩形和直线组成的,这几个形状的API我们都已经介绍过了。我们只要按顺序把它们画在屏幕上就好了。
代码实现
在C++工程的main.cpp文件中输入下面代码。
#include <iostream>
#include <graphics.h>
#include <conio.h>
void main()
{
initgraph(800, 600);
// 记录当前填充颜色
COLORREF save_color = getfillcolor();
// 绘制矩形框
rectangle(50, 50, 550, 550);
// 画空心圆
circle(200, 150, 50);
circle(400, 150, 50);
// 画空心椭圆
ellipse(100, 100, 500, 300);
// 填充椭圆内的绿色部分
setfillcolor(GREEN);
floodfill(300, 200, getlinecolor());
// 填充一个白色的椭圆
setfillcolor(WHITE);
fillellipse(200, 210, 400, 290);
// 填充一个绿色的矩形
setfillcolor(GREEN);
fillrectangle(150, 300, 450, 500);
// 画一条直线
line(300, 500, 300, 550);
// 按任意键继续
getch();
// 恢复填充颜色
setfillcolor(save_color);
closegraph();
}
好了,按一下Ctrl + F5,是不是看到效果了?
对大多数人来说,椭圆内部的不规则的绿色面积应该是最难实现的,floodfill()这个函数就是帮助我们将一个点所在的封闭范围内全部用填充颜色涂掉。除了设置点坐标之外还要输入这个封闭区域边框的颜色。
这里需要强调的是,在初始化画布之后,我们获取了当前的填充颜色,在绘制完成后又把当前填充颜色恢复到了我们程序执行之前的状态。
这个习惯非常重要,就是要让我们的程序在运行过之后,系统环境没有任何变化。否则在未来负责的工程中,很可能因为某个模块乱改系统设置产生很多不必要的bug。
好了,现在是不是比较有成就感呢?
由于EasyX的使用会贯穿于我们这个系列的项目中,因此这里就不过多介绍了,后面用到了新内容我们再讲。
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
639368839,我们一起学C/C++!
C++经典绘图工具EasyX的更多相关文章
- UML系列01之 UML和绘图工具Visio介绍
概要 UML,全称是Unified Modeling Language,中文是"统一建模语言".通俗点说,UML是一种创建模型的语言.UML是在开发阶段,说明,可视化,构建和书写一 ...
- 用MSoffice里的绘图工具
试过一些绘图表的工具,在xbeta推荐的替代visio一文中介绍的一些软件.之前用得最多的就是Dia,在linux下也有.现在才发现在微软的office下的绘图工具已经足够我使用了,不需要专业的图形符 ...
- 一起来画画!8款最佳HTML5绘图工具
HTML5无疑是当前最受宠的一项技术,今天推荐8款HTML5绘图工具,同样惊艳你的眼球!这些绘图工具大多数是用HTML5画布(Canvas)实现的,部分辅以Javascript.对每一个web设计者来 ...
- Opencv实现的简易绘图工具
第一次写博,还是个菜鸟.最近开始学习Opencv,试着写了个简易的绘图工具(目前只写了画线和橡皮擦部分,画其它图形还有待往里添加),也算是记录自己的学习之路. #include "stdaf ...
- HTML5 canvas 在线画笔绘图工具(一)
HTML5 canvas 在线画笔绘图工具(一) 功能介绍 这是我用Javascript写的第一个程序,在写的过程中走了很多弯路,所以写完之后想分享出来,给与我一样的初学者做为学习的参考,同时在编写这 ...
- 绘图工具graphviz学习使用
画图工具: http://www.tuicool.com/articles/r2iAfa http://www.tuicool.com/articles/RjQfey 绘图工具graphviz学习使用 ...
- HTML5 canvas 在线画笔绘图工具(三)
组装画板(TDrawBuilder) 在这一小节中我们要把工具条和画板组装起来,让他们可以协同进行工作. 画板通过一个命名为TDrawBuilder来进行组装.在详细讲解TDrawBuilder对象之 ...
- Android 绘图工具库AChartEngine
From: http://www.oschina.net/p/achartengine AChartEngine是为android应用而设计的绘图工具库.目前该库的最新稳定版本是0.7,支持绘制以下类 ...
- PS2: 这篇文章中的图片绘图工具使用的是Dia (sudo apt-get install dia)。据说yEd也很不错。
SBCL编译过程 - O.Nixie的专栏 - 博客频道 - CSDN.NET PS2: 这篇文章中的图片绘图工具使用的是Dia (sudo apt-get install dia).据说yEd也很不 ...
随机推荐
- 《算法4》读书笔记 1.4 - 算法分析(Analysis of Algorithm)
--------------------------- First priority is to make you code ** CLEAR and CORRECT, but PERFORMANCE ...
- [.NET产品源码保护].NET防止反编译(非混淆加密)
.NET产品源码保护产生的背景: .NET源码加密方案支持C#及VB.NET等语言开发的ASP.NET及WINFORM应用.利用.NET支持托管代码与非托管代码共存的特性,将C#代码经过处理放于非托管 ...
- Unity使用GL画线
脚本需挂在相机上,如果你的脚本,编辑器报错了,Matrix stack full depth reached,加上这个方法试试GL.LoadPixelMatrix(); using System.Co ...
- websocket技术分享
开发环境: spring3+tomcat7+spring-websocket4 运行环境: windows.Linux 一.背景: 产品将要发布的消息或其他需要让客户提前知道的消息,在客户端和服务端建 ...
- CF #335 div1 A. Sorting Railway Cars
题目链接:http://codeforces.com/contest/605/problem/A 大意是对一个排列进行排序,每一次操作可以将一个数字从原来位置抽出放到开头或结尾,问最少需要操作多少次可 ...
- Android Gradle manifestPlaceholders 占位符详解
Android Gradle manifestPlaceholders 占位符详解 在实际项目中,AndroidManifest里十几个地方的值是需要动态的改变(生成apk文件的时候).如果每次去改也 ...
- 三、Dotnet Core Code First 创建数据库
1.在项目中创建Models文件夹2.在Models文件夹中建立 表的属性类:如 User类.3.在Models文件夹创建DataContext 继承DbContext类(可以选择重写OnModelC ...
- json数据渲染表单元素出现的问题
解析页面表单元素 parseForm: function () { var data = {}; $(this).find('input').each(function () { switch ($( ...
- 八种创建等高列布局【出自w3c】
高度相等列在Web页面设计中永远是一个网页设计师的需求.如果所有列都有相同的背景色,高度相等还是不相等都无关紧要,因为你只要在这些列的父元素中设置一个背景色就可以了.但是,如果一个或多个列需要单独设置 ...
- Oracle学习历程--创建用户,分配表空间
记录下学习Oracle12c的过程中的点点滴滴. Oracle12c新特性:http://www.cnblogs.com/kerrycode/p/3386917.html --创建临时表空间CREAT ...