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也很不 ...
随机推荐
- Java中如何动态创建接口的实现
有很多应用场景,用到了接口动态实现,下面举几个典型的应用: 1.mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现. 2.dubbo等分布式服务 ...
- Linux - 进程间通信 - 匿名管道
一.概念:进程间通信( IPC,InterProcess Communication) 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进城之间要交换数据必须通过内 ...
- python——网络编程
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- 京东商城首页jquery轮播特效
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- 由CODEVS笨小猴1053引发的一些思考
#include<cstdio> #include<cstring> ]; ]; int check(int n) { ||n==) ; ;m*m<=n;++m) ) ; ...
- 使用 PHPStorm + Xdebug 实现断点调试(二)
一.配置 Xdebug 配置 Xdebug 相关参数,在 php.ini 文件中新增如下配置,如果没安装的,请参考<PHP 安装 Xdebug扩展>: [xdebug] xdebug.re ...
- Lamp环境搭建Linux CentOS6.5编译安装mysql5.6
经典web开发组合Lamp环境搭建之mysql安装详解 安装前准备 通过rpm命令检查centos上是否已经安装mysql,然后卸载已经存在的mysql版本 [root@localhost src]# ...
- 关于java中的==,equals()
1. 先从一道面试题说起 请问下面的 public class Demo { public static void main(String args[]){ String a = "a&qu ...
- 个人对于epollhup的理解
1.原因 由于最近对于异步connect函数的测试,发现提前将一个套接字加入epoll监听队列会不断爆出epollhup事件 2.示例 ........ iEpoll = epoll_create( ...
- 关于WannaCry病毒的见解与预防,我有话说!
好久没写博客了,自从定性专做技术扩展服务后,已经有两年半没有正式写过博客,要不是这次WannaCry病毒的厉害程度,我也懒得去写博客,为什么呢?写技术文章吗?两年多没有研究新的技术,没有什么好写的!所 ...