文章目录
EasyX
EasyX Graphics Library 是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022,简单易用,学习成本极低,应用领域广泛。目前已有许多大学将 EasyX 应用在教学当中。
-
EasyX其实是一个C++库,不是C库,这就像VC只有C++编译器,没有C编译器一样。
-
EasyX最初发布于2009年,其底层是gdi,设计上和Windows API高度耦合,但在使用上基本不用了解太多的Windows API。EasyX是一个图形库,或者说只是一个绘图库,因为它相较于OpenGL以及其他的如SDL2的库而言只有一个优势——简单易用。它能让新人快速上手,了解以及学习绘图算法。
-
如果你是一位新人,那么EasyX对你最大的吸引力大概在于:只用学习少量内容,就能暂时摆脱烦人的黑框框程序,窥得一眼五彩斑斓的GUI世界。
-
EasyX能干什么?EasyX可以绘图,这意味着它能实现一些图像处理功能,或者是一个游戏,一个数据分析软件,一个动画合成软件,等等等等,但需要明确的是,上述内容都不是单单一个EasyX就能完成的。
搭建EasyX的开发环境
-
由于与Windows API高度耦合,EasyX官方仅支持VC工具链,具体版本下至Visual C++ 6.0,上至Visual Studio 2022。(截至目前而言)
-
官方提供了一个安装程序来完成各个版本VC/VS上的一键式部署与卸载。(同时也提供了一个离线文档)
使用EasyX编写GUI程序的简单示例
- 引入EasyX库的头文件,旧版本的EasyX使用graphics.h(这也是你在网上能找到的大多数教程所用的头文件),但现在应该使用easyx.h。目前的graphics.h仅保留了若干已被easyx.h废弃的旧版功能。
#include <easyx.h>
- 初始化绘图窗口,创建一个指定大小(此处示例为640x480像素)的窗口。
initgraph(640, 480);
- 绘图,此处示例为绘制一个圆心为(200,200),半径为100的圆。
circle(200, 200, 100)
- 关闭绘图窗口
closegraph();
- 完整代码
#include <graphics.h>
#include <conio.h>
int main()
{
initgraph(640, 480);
circle(200, 200, 100);
_getch();
closegraph();
return 0;
}
- 运行效果
EasyX中的基本概念
EaysX中颜色的三种表示方式:
-
宏定义:EasyX内建了一些宏常量来表示颜色
宏 值 颜色 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 白 -
16进制:
格式为0xbbggrr(bb=蓝,gg=绿,rr=红)
-
RGB宏:用于将红、绿、蓝颜色分量合成RGB颜色。
COLORREF RGB( BYTE byRed, // 颜色的红色部分,取值范围:0~255,下同 BYTE byGreen, // 颜色的绿色部分 BYTE byBlue // 颜色的蓝色部分 );
-
HSLtoRGB,HSVtoRGB:用于将HSL/HSV颜色空间模型转至RGB。
坐标
-
物理坐标:描述设备的坐标体系,以设备左上角为原点,X轴向右为正,Y轴向下为负,度量单位为像素,不可缩放。
-
逻辑坐标:程序中用于绘图的坐标体系,以窗口左上角为原点,X轴向右为正,Y轴向下为正,度量单位为点。在默认情况下,逻辑坐标与物理坐标一一对应,一个逻辑点即为一个物理像素。
设备
-
“设备”指的是绘图表面。(根据功能,可以粗略理解为画板,但是其实并不仅仅是画板)
-
EasyX中有两种设备:默认的绘图窗口以及IMAGE对象,使用函数SetWorkingImag可更改当前用于绘图的设备,所以的绘图函数都将图形绘制在该设备上。
EasyX部分功能示例
只列出了我认为最有用的部分
清屏:cleardevice
void cleardevice();
设置当前设备绘图背景色:setbkcolor
void setbkcolor(COLORREF color);
设置当前设备图案填充和文字输出时的背景模式
void setbkmode(int mode);
mode参数的各个值 | 说明 |
---|---|
OPAQUE | 背景用当前背景色填充(默认) |
TRANSPARENT | 背景透明 |
设置当前设备填充样式:setfillstyle
void setfillstyle(
FILLSTYLE* pstyle
);
void setfillstyle(
int style,
long hatch = NULL,
IMAGE* ppattern = NULL
);
void setfillstyle(
BYTE* ppattern8x8
);
参数 | 说明 |
---|---|
pstyle | 指向填充样式 FILLSTYLE 的指针 |
style | 指定填充样式 |
hatch | 指定填充图案 |
具体内容请参照[官方文档](EasyX 文档 - setfillstyle)
设置当前设备画线样式:setlinestyle
void setlinestyle(
const LINESTYLE* pstyle
);
void setlinestyle(
int style,
int thickness = 1,
const DWORD *puserstyle = NULL,
DWORD userstylecount = 0
);
参数 | 说明 |
---|---|
pstyle | 指向画线样式 LINESTYLE 的指针 |
style | 画线样式 |
thickness | 线的宽度(单位为像素) |
puserstyle | 用户自定义样式数组 |
userstylecount | 用户自定义样式数组的元素数量。 |
具体内容请参照[官方文档](EasyX 文档 - setlinestyle)
设置当前设备多边形填充模式:setpolyfillmode
mode的各个值 | 说明 |
---|---|
ALTERNATE | 交替填充模式(默认值) |
WINDING | 根据绘图方向填充的模式 |
详见[官方文档](EasyX 文档 - setpolyfillmode)
EasyX的部分函数文档索引
这里其实就是官方文档的内容,只是给大家引个路。
绘制图形
函数或数据类型 | 描述 |
---|---|
arc | 画椭圆弧。 |
circle | 画无填充的圆。 |
clearcircle | 清空圆形区域。 |
clearellipse | 清空椭圆区域。 |
clearpie | 清空扇形区域。 |
clearpolygon | 清空多边形区域。 |
clearrectangle | 清空矩形区域。 |
clearroundrect | 清空圆角矩形区域。 |
ellipse | 画无填充的椭圆。 |
fillcircle | 画有边框的填充圆。 |
fillellipse | 画有边框的填充椭圆。 |
fillpie | 画有边框的填充扇形。 |
fillpolygon | 画有边框的填充多边形。 |
fillrectangle | 画有边框的填充矩形。 |
fillroundrect | 画有边框的填充圆角矩形。 |
floodfill | 填充区域。 |
getheight | 获取绘图区的高度。 |
getpixel | 获取点的颜色。 |
getwidth | 获取绘图区的宽度。 |
line | 画直线。 |
pie | 画无填充的扇形。 |
polybezier | 画三次方贝塞尔曲线。 |
polyline | 画多条连续的线。 |
polygon | 画无填充的多边形。 |
putpixel | 画点。 |
rectangle | 画无填充的矩形。 |
roundrect | 画无填充的圆角矩形。 |
solidcircle | 画无边框的填充圆。 |
solidellipse | 画无边框的填充椭圆。 |
solidpie | 画无边框的填充扇形。 |
solidpolygon | 画无边框的填充多边形。 |
solidrectangle | 画无边框的填充矩形。 |
solidroundrect | 画无边框的填充圆角矩形。 |
文字输出
函数或数据类型 | 描述 |
---|---|
gettextcolor | 获取当前文字颜色。 |
gettextstyle | 获取当前文字样式。 |
LOGFONT | 文字样式的结构体。 |
outtextxy | 在指定位置输出字符串。 |
drawtext | 在指定区域内以指定格式输出字符串。 |
settextcolor | 设置当前文字颜色。 |
settextstyle | 设置当前文字样式。 |
textheight | 获取字符串实际占用的像素高度。 |
textwidth | 获取字符串实际占用的像素宽度。 |
图像处理
函数或数据类型 | 描述 |
---|---|
IMAGE | 保存图像的对象。 |
loadimage | 读取图片文件。 |
saveimage | 保存绘图内容至图片文件。 |
getimage | 从当前绘图设备中获取图像。 |
putimage | 在当前绘图设备上绘制指定图像。 |
GetWorkingImage | 获取指向当前绘图设备的指针。 |
rotateimage | 旋转 IMAGE 中的绘图内容。 |
SetWorkingImage | 设定当前绘图设备。 |
Resize | 调整指定绘图设备的尺寸。 |
GetImageBuffer | 获取绘图设备的显示缓冲区指针。 |
GetImageHDC | 获取绘图设备句柄。 |
消息处理
函数或数据类型 | 描述 |
---|---|
ExMessage | 消息结构体。 |
flushmessage | 清空消息缓冲区。 |
getmessage | 获取一个消息。如果当前消息缓冲区中没有,就一直等待。 |
peekmessage | 获取一个消息,并立即返回。 |
连续绘图
实际上貌似是启用了双缓冲,可以有效解决连续绘图时的闪烁问题,使用如下。
BeginBatchDraw();
// 绘制你的内容...
EndBatchDraw();
EndBatchDraw会将绘制的内容输出,使用FlushBatchDraw能达到同样效果。
获取窗口句柄
EasyX提供了GetHWnd函数以获得当前窗口的句柄,由此你可以使用Windows API对窗口进行进一步的操作,原型如下。
HWND GetHWnd();
输入对话框
EasyX提供了InputBox函数用于以对话框形式获取用户输入,原型如下。
bool InputBox(
LPTSTR pString,
int nMaxCount,
LPCTSTR pPrompt = NULL,
LPCTSTR pTitle = NULL,
LPCTSTR pDefault = NULL,
int width = 0,
int height = 0,
bool bHideCancelBtn = true
);
关于使用EasyX构建一个简单的游戏简述
-
EasyX仅仅是一个绘图库,它只能完成图形的绘制以及鼠标信息的捕获任务,要构建一个完整的游戏,所需要的不仅仅是EasyX。
-
VC/VS中提供了conio.h,能实现非阻塞式的键盘监听(非全局)。
-
Windows API中的mmsystem.h(需要链接winmm.lib)提供了一套简单的音乐播放功能。
-
如果你的游戏中的对象是动态的(比如数量不确定的敌人),那么你需要用到堆内存分配,以及一些用于管理堆内存的数据结构。
-
我之前用EasyX写了一个游戏,有兴趣可以看看,但是代码很乱,因为我懒。