写在前面的话
这是刚学C的蒟蒻第一次挑战控制台程序以外的程序设计因为要做课设。第一次自己敲出黑框框之外程序的本蒟蒻肥肠兴奋,就根据视频自学(视频链接),总结视频内容和自己查阅的资料,写出了下面的笔记,希望它可以帮到大家。由于作者水平有限,难免有遗漏和不足之处,望神犇们多多包涵指正。
什么是EasyX
EasyX是一个适合像我这样的蒟蒻编程初学者操作的图形渲染库。
本质上,EasyX是将Windows繁琐的图形绘制操作封装在头文件中,从而实现用函数简单的调用。
使用EasyX
百度EasyX官网,从官网中即可下载安装程序。它可以将EasyX直接安装在VS中。
使用EasyX需要在程序中添加头文件 include<graphics.h>
。
EasyX帮助文档:EasyX在线文档
EasyX中的坐标和设备
坐标
和数学的坐标系不同,EasyX中坐标的y轴正方向应该是向下的。
设备
简单来讲,设备就是绘图表面;
在EasyX中,设备分两种:
1.默认的绘图窗口;
2.Image对象。
通过 SetWorkingImage()
函数可以设置当前用于绘图的设备。
设置当前用于绘图的设备后,所有的绘图函数都会绘制在该设备上。
默认是在绘图窗口绘图.
颜色
EasyX有四种表示颜色的方法:预定义常量,十六进制数字,RGB宏,使用HSLtoRGB
或HSVtoRGB
颜色转换其他色彩模型到RGB颜色。
1.使用预定义常量:
常量 值 颜色
-------- -------- --------
BLACK 0 黑
BLUE 0xAA0000 蓝
GREEN 0x00AA00 绿
CYAN 0xAAAA00 青
RED 0x0000AA 红
MAGENTA 0xAA00AA 紫
BROWN 0x0055AA 棕
LIGHTGRAY 0xAAAAAA 浅灰
DARKGRAY 0x555555 深灰
LIGHTBLUE 0xFF5555 亮蓝
LIGHTGREEN 0x55FF55 亮绿
LIGHTCYAN 0xFFFF55 亮青
LIGHTRED 0x5555FF 亮红
LIGHTMAGENTA 0xFF55FF 亮紫
YELLOW 0x55FFFF 黄
WHITE 0xFFFFFF 白
2.使用16进制数表示颜色
表示规则为:0xbbggrr
bb=蓝 gg=绿 rr=红
3.用RGB宏合成颜色
EasyX文档——RGB
4.用HSLtoRGB
,HSVtoRGB
转换其他色彩模型到RGB颜色
EasyX文档——HSLtoRGB
EasyX文档——HSVtoRGB
EasyX的函数
窗口函数
窗口函数用于对窗口的一些操作。
initgraph(int width,int height,[int flag=NULL])
用于初始化绘图窗口(创建绘图窗口);
三个参数分别为:宽度,高度和窗口样式(默认为NULL,可以不写)
窗口样式的设定有:
SHOWCONSOLE
显示控制台;
NOCLOSE
没有右上角的关闭按钮;
NOMINIMIZE
没有右上角的最小化按钮。
如果需要同时使用他们中的多个,可以用按位或|
间隔。
closegraph()
关闭绘图窗口;
cleardevice()
清空绘图设备。
(设置背景中 cleardevice()
要和 setbkcolor()
联用,先后者再前者)
样式设置函数
格式为 操作类型
+ 对象
+ 操作名称
不管对不对但我是这么理解的
该函数针对的是当前的绘图设备。
操作类型
get
获取
set
设置
对象
所有的图形
背景 bk
填充 fill
画线 line
多边形(填充) poly(fill)
操作名称
模式 mode
(背景和多边形)
样式 style
(画线和填充)
颜色 color
setlinecolor(0xff0000);
setlinecolor(BLUE);
setlinecolor(RGB(0, 0, 255));
setlinecolor(HSLtoRGB(240, 1, 0.5));
图形绘制函数
图形绘制函数用于在窗口上绘制各种图形.
填充样式分类
从填充样式分类,绘图函数可分为无填充,有边框填充,无边框三种.
以画圆为例:
circle
无填充
fillcircle
有边框填充
solidcircle
无边框填充
主要区别就是形状的前缀。
形状分类
从形状分类,常用的有八种(以下均为无填充)
circle(int x,int y,int radius)
画圆
x,y分别为圆心的x,y坐标;
radiu
为圆的半径。
ellipse(int x1,int y1,int x2,int y2)
画椭圆
四个坐标是椭圆的左上端点和右下端点的坐标。
pie(int x1,int y1,int x2,int y2,int stangle,int endangle)
画扇形
四个坐标是扇形左上端点和右下端点的坐标。
stangle
为扇形起始角的弧度, endangle
为扇形终止角的弧度
PS:起始角和终止角的定义
经过圆心画一条水平线和垂直线,水平线以圆心向右为0度,顺着圆逆时针转动.即水平线向右经过0度,垂直向上为90度,水平线向左为180度,垂直线向下为270度。
polygon(POINT points[],int num)
画多边形
points[]
存储多边形的各个顶点位置。函数会自动连接这些点。注意,不是int类型!
num
是顶点的数量。
rectangle(int x1,int y1,int x2,int y2)
画矩形
四个坐标同样是矩形左上顶点和右下顶点的坐标。
roundrect(int x1,int y1,int x2,int y2,int ellipsewidth,int ellipseheight)
画圆角矩形
四个坐标值同样是左上顶点和右下顶点的坐标。
ellipsewidth
是构成圆角矩形的圆角的椭圆的宽度;
ellipseheight
是构成圆角矩形的圆角的椭圆的高度。
line(int x1,int y1,int x2,int y2)
画线
四个坐标是直线两个端点的坐标。
putpixel(int x,int y,COLORREF color)
画点
x和y是点的坐标, color
是点的颜色。
举个栗子
效果如图
……对不起我的长萌萌
如图可见,如果两个图案的位置有冲突,后绘制的图案会覆盖在先绘制的图案上。
文字绘制函数
文字绘制函数用于在窗口上绘制文字。
在指定位置输出字符串
outtextxy(int x,int y,LPCTSTR str)
x,y是待输出字符串头字母的x,y坐标值;str是待输出的字符串的指针。
由于字符集问题直接把字符串""进函数会报错,解决方法为:
1.在字符串前加上大写’L’;
2.用TEXT(str)/_T(str)形式;
3.进入“项目→属性→配置属性→常规”,将字符集改为“使用多字符字符集”。
最好用第三个。
设置当前文字颜色
settextcolor(COLORREF color)
settextstyle(int nHeight,int nWidth,LPCTSTR lpszFace)
设置字体样式
nHeight
指定高度;
nWidth
字符的平均宽度;
lpszFace
字体名称。
设置背景模式
setbkmode
文字是有背景的!
setbkmode(TRANSPARENT)
把文字背景设置成透明;
setbkmode(OPAQUE)
设置成不透明。
(还有一个宏定义值一模一样的BKMODE_LAST
也是不透明…)
设置文字居中显示
需要用到这两个函数:
textheight(LPCTSTR str)
获取字符串实际占用的像素高度;
textwidth(LPCTSTR str)
获取字符串实际占用的像素宽度。
居中的原理
先求出字符串的宽度和需要居中的窗口的左端坐标和宽度
再算出它们的一半
那么字符串输出函数应该填写的x轴坐标就是:
窗 口 左 端 坐 标 + 窗 口 长 度 的 一 半 − 字 符 串 长 度 的 一 半 窗口左端坐标+窗口长度的一半-字符串长度的一半 窗口左端坐标+窗口长度的一半−字符串长度的一半
即左端窗口坐标+窗口和字符串之间的距离,但由于字符串的宽度是随着字符串内容的不同而变化的,所以不可以直接写常数。
宽度同理:
窗 口 上 端 坐 标 + 窗 口 宽 度 的 一 半 − 字 符 串 宽 度 的 一 半 窗口上端坐标+窗口宽度的一半-字符串宽度的一半 窗口上端坐