【EasyX】 使用说明
EasyX 使用说明
基本说明
EasyX 是针对 C++ 的图形库,可以帮助 C/C++ 初学者快速上手图形和游戏编程。
比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法,等等。
许多人学编程都是从 C 语言入门的,而现状是:
- 有些学校以 Turbo C 为环境学习 C 语言,只是 Turbo C 实在太老了,复制粘贴都很不方便。
- 有些学校直接拿 VC 来讲 C 语言,因为 VC 的编辑和调试环境都很优秀,并且 VC 有适合教学的免费版本。可惜在 VC 里面只能做一些文字性的练习题,想画条直线或一个圆都很难,例如需要注册窗口类、建消息循环等等,初学者会受严重打击的。初学编程想要绘图就得用 TC,很是无奈。
- 还有计算机图形学,这门课程的重点是绘图算法,而不是 Windows 编程。所以,许多老师不得不用 TC 教学,因为 Windows 绘图太复杂了,会偏离教学的重点。新的图形学的书有不少是用的 OpenGL,可是门槛依然很高。
所以,我们想给大家一个更好的学习平台,就是 VC 方便的开发平台和 TC 简单的绘图功能,于是就有了这个 EasyX 库。如果您刚开始学 C 语言,或者您是一位教 C 语言的老师,再或者您在教计算机图形学,那么这个库一定会让您兴奋的。
EasyX_2023大暑版
https://easyx.cn
安装
系统支持
操作系统:Windows XP(sp3) 及以上操作系统。
编译环境:Visual C++ 6.0,Visual Studio 2008 至 Visual Studio 2022 (x86 & x64)。
安装
请下载最新版 EasyX 安装程序,直接运行,并跟随提示安装即可。
安装程序会自动检测您已经安装的 VC 版本,并根据您的选择将对应的 .h 和 .lib 文件安装至 VC 的 include 和 lib 文件夹内。安装程序不会修改注册表或者您本机的其它任何文件。
卸载
由于安装程序并不修改注册表,因此您在应用程序列表中不会看到 EasyX 的卸载项。如需卸载,请再次执行对应版本的安装程序,并根据提示卸载。也可以手动将相关的 .h 和 .lib 删除,系统中不会残留任何垃圾信息。
手动安装方法
EasyX 安装程序是用 7-Zip 封装的自解压缩包程序。
手动安装时,可以直接用 7-Zip 将安装文件解压,再根据下面的文件列表说明,将解压后的相关文件分别拷贝到 VC 对应的 include 和 lib 文件夹内。
您也可以将所需的 include 和 lib 文件夹放到任意位置,然后在 VC 中增加 Lib 和 Include 的引用路径。
文件列表说明:
EasyX 安装程序├ include <folder>│ ├ easyx.h // 头文件(提供了当前最新版本的接口)│ └ graphics.h // 头文件(在 easyx.h 的基础上,保留了若干旧接口)├ lib <folder>│ ├ VC6 <folder>│ │ └ x86 <folder>│ │ ├ EasyXa.lib // VC6 库文件(MBCS 版本)│ │ └ EasyXw.lib // VC6 库文件(Unicode 版本)│ ├ VC2008 <folder>│ │ ├ x64 <folder>│ │ │ ├ EasyXa.lib // VC2008 ~ 2013 库文件(x64, MBCS 版本)│ │ │ └ EasyXw.lib // VC2008 ~ 2013 库文件(x64, Unicode 版本)│ │ └ x86 <folder>│ │ ├ EasyXa.lib // VC2008 ~ 2013 库文件(x86, MBCS 版本)│ │ └ EasyXw.lib // VC2008 ~ 2013 库文件(x86, Unicode 版本)│ └ VC2015 <folder>│ ├ x64 <folder>│ │ ├ EasyXa.lib // VC2015 ~ 2022 库文件(x64, MBCS 版本)│ │ └ EasyXw.lib // VC2015 ~ 2022 库文件(x64, Unicode 版本)│ └ x86 <folder>│ ├ EasyXa.lib // VC2015 ~ 2022 库文件(x86, MBCS 版本)│ └ EasyXw.lib // VC2015 ~ 2022 库文件(x86, Unicode 版本)└ Setup.hta // 安装程序
Copy
获取帮助文档
EasyX 的使用帮助,请参考 https://docs.easyx.cn。
可以从该网站下载离线版本的帮助文档。
项目依赖
EasyX 库采用静态链接方式,不会为您的程序增加任何额外的 DLL 依赖。
使用教程
EasyX 在使用上非常简单。
比如:启动 Visual C++,创建一个空的控制台项目(Win32 Console Application),然后添加一个新的代码文件(.cpp),并引用 graphics.h 头文件就可以了。
看一个画圆的例子:
#include <graphics.h> // 引用图形库头文件
#include <conio.h>
int main()
{initgraph(640, 480); // 创建绘图窗口,大小为 640x480 像素circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100_getch(); // 按任意键继续closegraph(); // 关闭绘图窗口return 0;
}
Copy
当然,EasyX 也可以在 Win32 Application 项目上使用。需要注意的是,Win32 Application 项目没有控制台,所以无法使用控制台相关的函数。
基本概念
相关内容如下:
基本概念 | 描述 |
---|---|
颜色 | 描述颜色的各种表示方法。 |
坐标 | 描述坐标系。 |
设备 | 描述“设备”概念。 |
颜色
EasyX 使用 24bit 真彩色,不支持调色板模式。
表示颜色的方法
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 白
Copy
2. 用 16 进制数字表示颜色
16 进制的颜色表示规则为:0xbbggrr (bb=蓝,gg=绿,rr=红)
3. 用 RGB 宏合成颜色
详见 RGB。
4. 用 HSLtoRGB、HSVtoRGB 转换其他色彩模型到 RGB 颜色
详见 HSLtoRGB、HSVtoRGB。
示例
以下是几种设置画线颜色的方法:
setlinecolor(0xff0000);
setlinecolor(BLUE);
setlinecolor(RGB(0, 0, 255));
setlinecolor(HSLtoRGB(240, 1, 0.5));
坐标
在 EasyX 中,坐标分两种:物理坐标和逻辑坐标。
物理坐标
物理坐标是描述设备的坐标体系。
坐标原点在设备的左上角,X 轴向右为正,Y 轴向下为正,度量单位是像素。
坐标原点、坐标轴方向、缩放比例都不能改变。
逻辑坐标
逻辑坐标是在程序中用于绘图的坐标体系。
坐标默认的原点在窗口的左上角,X 轴向右为正,Y 轴向下为正,度量单位是点。
默认情况下,逻辑坐标与物理坐标是一一对应的,一个逻辑点等于一个物理像素。
在本手册中,凡是没有注明的坐标,均指逻辑坐标。
请参阅
setorigin:修改坐标原点。
setaspectratio:修改坐标轴方向。
setaspectratio:修改缩放比例。
设备
“设备”,是指绘图表面。
在 EasyX 中,设备分两种,一种是默认的绘图窗口,另一种是 IMAGE 对象。通过 SetWorkingImage 函数可以设置当前用于绘图的设备。
设置当前用于绘图的设备后,所有的绘图函数都会绘制在该设备上。
函数说明
EasyX 函数分为以下几类:
-
绘图设备相关函数
-
颜色模型
-
颜色及样式设置相关函数
-
绘制图形相关函数
-
文字输出相关函数
-
图像处理相关函数
-
消息处理相关函数
-
其它函数
-
[graphics.h 暂绘图设备相关函数
相关函数如下:
函数或数据类型 描述 cleardevice 清除屏幕内容。 initgraph 初始化绘图窗口。 closegraph 关闭图形窗口。 getaspectratio 获取当前缩放因子。 setaspectratio 设置当前缩放因子。 graphdefaults 恢复绘图窗口为默认值。 setorigin 设置坐标原点。 setcliprgn 设置当前绘图设备的裁剪区。 clearcliprgn 清除裁剪区的屏幕内容。 -
留函数
clearcliprgn
这个函数用于清空裁剪区。
void clearcliprgn();
Copy
参数
无
返回值
无
示例
无
cleardevice
这个函数使用当前背景色清空绘图设备。
void cleardevice();
Copy
参数
无
返回值
无
示例
无
closegraph
这个函数用于关闭绘图窗口。
void closegraph();
Copy
参数
无
返回值
无
示例
无
getaspectratio
这个函数用于获取当前缩放因子。
void getaspectratio(float *pxasp,float *pyasp
);
Copy
参数
pxasp
返回 x 方向上的缩放因子。
pyasp
返回 y 方向上的缩放因子。
返回值
无
示例
无
graphdefaults
这个函数用于重置视图、当前点、绘图色、背景色、线形、填充样式、字体为默认值。
void graphdefaults();
Copy
参数
无
返回值
无
示例
无
initgraph
这个函数用于初始化绘图窗口。
HWND initgraph(int width,int height,int flag = NULL
);
Copy
参数
width
绘图窗口的宽度。
height
绘图窗口的高度。
flag
绘图窗口的样式,默认为 NULL。可为以下值:
值 | 含义 |
---|---|
EX_DBLCLKS | 在绘图窗口中支持鼠标双击事件。 |
EX_NOCLOSE | 禁用绘图窗口的关闭按钮。 |
EX_NOMINIMIZE | 禁用绘图窗口的最小化按钮。 |
EX_SHOWCONSOLE | 显示控制台窗口。 |
返回值
返回新建绘图窗口的句柄。
示例
以下代码片段创建一个尺寸为 640x480 的绘图窗口:
initgraph(640, 480);
Copy
以下代码片段创建一个尺寸为 640x480 的绘图窗口,同时显示控制台窗口:
initgraph(640, 480, EX_SHOWCONSOLE);
Copy
以下代码片段创建一个尺寸为 640x480 的绘图窗口,同时显示控制台窗口,并禁用关闭按钮:
initgraph(640, 480, EX_SHOWCONSOLE | EX_NOCLOSE);
setaspectratio
这个函数用于设置当前缩放因子。
void setaspectratio(float xasp,float yasp
);
Copy
参数
xasp
x 方向上的缩放因子。例如绘制宽度为 100 的矩形,实际的绘制宽度为 100 * xasp。
yasp
y 方向上的缩放因子。例如绘制高度为 100 的矩形,实际的绘制高度为 100 * yasp。
返回值
无
备注
如果缩放因子为负,可以实现坐标轴的翻转。例如,执行 setaspectratio(1, -1) 后,可使 y 轴向上为正。
示例
无
setcliprgn
这个函数用于设置当前绘图设备的裁剪区。
void setcliprgn(HRGN hrgn);
Copy
参数
hrgn
区域的句柄。创建区域所使用的坐标为物理坐标。
如果该值为 NULL,表示取消之前设置的裁剪区。
返回值
无
备注
HRGN 是 Windows 定义的表示区域的句柄。将该区域设置为裁剪区后,任何区域外的绘图都将无效(但仍然可以通过操作显示缓冲区在裁剪区外绘图)。
可以使用 Windows GDI 函数创建一个区域。例如,创建矩形区域可以使用函数:
HRGN CreateRectRgn(int left, int top, int right, int bottom);
此外,还可以使用函数 CreateEllipticRgn 创建椭圆形的区域,使用 CreatePolygonRgn 创建多边形的区域等等。还可以使用 CombineRgn 组合区域。更多关于区域的 GDI 函数,请参考 MSDN 中的 Region Functions。
注意:创建区域后,如果不再使用,请执行 DeleteObject(HRGN hrgn) 以释放该区域对应的系统资源。
示例
以下代码用于创建一个矩形裁剪区,并在该裁剪区内画圆,请观察裁剪效果:
#include <graphics.h>
#include <conio.h>int main()
{// 初始化绘图窗口initgraph(640, 480);// 创建一个矩形区域HRGN rgn = CreateRectRgn(100, 100, 200, 200);// 将该矩形区域设置为裁剪区setcliprgn(rgn);// 不再使用 rgn,清理 rgn 占用的系统资源DeleteObject(rgn);// 画圆,受裁剪区影响,只显示出四段圆弧circle(150, 150, 55);// 取消之前设置的裁剪区setcliprgn(NULL);// 画圆,不再受裁剪区影响,显示出一个完整的圆circle(150, 150, 60);// 按任意键退出_getch();closegraph();
}
setorigin
这个函数用于设置坐标原点。
void setorigin(int x, int y);
Copy
x
原点的 x 坐标(使用物理坐标)。
y
原点的 y 坐标(使用物理坐标)。
返回值
无
示例
无
颜色模型
相关函数如下:
函数或数据类型 | 描述 |
---|---|
GetBValue | 返回指定颜色中的蓝色值。 |
GetGValue | 返回指定颜色中的绿色值。 |
GetRValue | 返回指定颜色中的红色值。 |
HSLtoRGB | 转换 HSL 颜色为 RGB 颜色。 |
HSVtoRGB | 转换 HSV 颜色为 RGB 颜色。 |
RGB | 通过红、绿、蓝颜色分量合成颜色。 |
RGBtoGRAY | 转换 RGB 颜色为 灰度颜色。 |
RGBtoHSL | 转换 RGB 颜色为 HSL 颜色。 |
RGBtoHSV | 转换 RGB 颜色为 HSV 颜色。 |
BGR | 交换颜色中的红色和蓝色。 |
BGR
BGR 宏用于交换颜色中的红色和蓝色。
COLORREF BGR(COLORREF color);
Copy
参数
color
需要交换红色和蓝色的颜色。
返回值
返回交换红色和蓝色后的颜色。
备注
颜色在内存中的表示形式为:0xbbggrr (bb=蓝,gg=绿,rr=红),但是显示缓冲区中的颜色表现形式为 0xrrggbb。注意,两者的红色和蓝色是相反的。直接操作显示缓冲区时,可以通过 BGR 宏交换颜色的红色和蓝色部分。
GetBValue
GetBValue 宏用于返回指定颜色中的蓝色值。
BYTE GetBValue(COLORREF rgb);
Copy
参数
rgb
指定的颜色。
返回值
返回指定颜色中的蓝色值,值的范围是 0~255。
备注
GetBValue 宏在 Windows SDK 中定义。
GetGValue
GetGValue 宏用于返回指定颜色中的绿色值。
BYTE GetGValue(COLORREF rgb);
Copy
参数
rgb
指定的颜色。
返回值
返回指定颜色中的绿色值,值的范围是 0~255。
备注
GetGValue 宏在 Windows SDK 中定义。
GetRValue
GetRValue 宏用于返回指定颜色中的红色值。
BYTE GetRValue(COLORREF rgb);
Copy
参数
rgb
指定的颜色。
返回值
返回指定颜色中的红色值,值的范围是 0~255。
备注
GetRValue 宏在 Windows SDK 中定义。
HSLtoRGB
该函数用于转换 HSL 颜色为 RGB 颜色。
COLORREF HSLtoRGB(float H,float S,float L
);
Copy
参数
H
原 HSL 颜色模型的 Hue(色相) 分量,0 <= H < 360。
S
原 HSL 颜色模型的 Saturation(饱和度) 分量,0 <= S <= 1。
L
原 HSL 颜色模型的 Lightness(亮度) 分量,0 <= L <= 1。
返回值
对应的 RGB 颜色。
备注
HSL 又称 HLS。
HSL 的颜色模型如图所示:
H 是英文 Hue 的首字母,表示色相,即组成可见光谱的单色。红色在 0 度,绿色在 120 度,蓝色在 240 度,以此方向过渡。
S 是英文 Saturation 的首字母,表示饱和度,等于 0 时为灰色。在最大饱和度 1 时,具有最纯的色光。
L 是英文 Lightness 的首字母,表示亮度,等于 0 时为黑色,等于 0.5 时是色彩最鲜明的状态,等于 1 时为白色。
示例
HSVtoRGB
该函数用于转换 HSV 颜色为 RGB 颜色。
COLORREF HSVtoRGB(float H,float S,float V
);
Copy
参数
H
原 HSV 颜色模型的 Hue(色相) 分量,0 <= H < 360。
S
原 HSV 颜色模型的 Saturation(饱和度) 分量,0 <= S <= 1。
V
原 HSV 颜色模型的 Value(明度) 分量,0 <= V <= 1。
返回值
对应的 RGB 颜色。
备注
HSV 又称 HSB。
HSV 的颜色模型如图所示:
H 是英文 Hue 的首字母,表示色相,即组成可见光谱的单色。红色在 0 度,绿色在 120 度,蓝色在 240 度,以此方向过渡。
S 是英文 Saturation 的首字母,表示饱和度,等于 0 时为灰色。在最大饱和度 1 时,每一色相具有最纯的色光。
V 是英文 Value 的首字母,表示明度,等于 0 时为黑色,在最大明度 1 时,是色彩最鲜明的状态。
RGB
RGB 宏用于将红、绿、蓝颜色分量合成颜色。
COLORREF RGB(BYTE byRed, // 颜色的红色部分BYTE byGreen, // 颜色的绿色部分BYTE byBlue // 颜色的蓝色部分
);
Copy
参数
byRed
颜色的红色部分,取值范围:0~255。
byGreen
颜色的绿色部分,取值范围:0~255。
byBlue
颜色的蓝色部分,取值范围:0~255。
返回值
返回合成的颜色。
备注
可以通过 GetRValue、GetGValue、GetBValue 宏从颜色中分离出红、绿、蓝颜色分量。
RGB 宏在 Windows SDK 中定义。
RGBtoGRAY
该函数用于返回与指定颜色对应的灰度值颜色。
COLORREF RGBtoGRAY(COLORREF rgb
);
Copy
参数
rgb
原 RGB 颜色。
返回值
对应的灰度颜色。
RGBtoHSL
该函数用于转换 RGB 颜色为 HSL 颜色。
void RGBtoHSL(COLORREF rgb,float *H,float *S,float *L
);
Copy
参数
rgb
原 RGB 颜色。
H
用于返回 HSL 颜色模型的 Hue(色相) 分量,0 <= H < 360。
S
用于返回 HSL 颜色模型的 Saturation(饱和度) 分量,0 <= S <= 1。
L
用于返回 HSL 颜色模型的 LigRGBtoHSV
该函数用于转换 RGB 颜色为 HSV 颜色。
void RGBtoHSV(COLORREF rgb,float *H,float *S,float *V
);
Copy
参数
rgb
原 RGB 颜色。
H
用于返回 HSV 颜色模型的 Hue(色相) 分量,0 <= H < 360。
S
用于返回 HSV 颜色模型的 Saturation(饱和度) 分量,0 <= S <= 1。
V
用于返回 HSV 颜色模型的 Value(明度) 分量,0 <= V <= 1。
返回值
无
备注
HSV 详见 HSVtoRGB。htness(亮度) 分量,0 <= L <=
图形颜色及样式设置相关函数
相关函数如下:
函数或数据类型 | 描述 |
---|---|
FILLSTYLE | 填充样式对象。 |
getbkcolor | 获取当前设备背景色。 |
getbkmode | 获取当前设备图案填充和文字输出时的背景模式。 |
getfillcolor | 获取当前设备填充颜色。 |
getfillstyle | 获取当前设备填充样式。 |
getlinecolor | 获取当前设备画线颜色。 |
getlinestyle | 获取当前设备画线样式。 |
getpolyfillmode | 获取当前设备多边形填充模式。 |
getrop2 | 获取当前设备二元光栅操作模式。 |
LINESTYLE | 画线样式对象。 |
setbkcolor | 设置当前设备绘图背景色。 |
setbkmode | 设置当前设备图案填充和文字输出时的背景模式。 |
setfillcolor | 设置当前设备填充颜色。 |
setfillstyle | 设置当前设备填充样式。 |
setlinecolor | 设置当前设备画线颜色。 |
setlinestyle | 设置当前设备画线样式。 |
setpolyfillmode | 设置当前设备多边形填充模式。 |
setrop2 | 设置当前设备二元光栅操作模式。 |
图形绘制相关函数
相关函数如下:
函数或数据类型 | 描述 |
---|---|
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 | 获取绘图设备句柄。 |
消息处理相关函数
消息缓冲区可以缓冲 63 个未处理的消息。每次获取消息时,将从消息缓冲区取出一个最早发生的消息。消息缓冲区满了之后,不再接收任何消息。
相关函数如下:
函数或数据类型 | 描述 |
---|---|
ExMessage | 消息结构体。 |
flushmessage | 清空消息缓冲区。 |
getmessage | 获取一个消息。如果当前消息缓冲区中没有,就一直等待。 |
peekmessage | 获取一个消息,并立即返回。 |
setcapture | 设置允许捕获绘图窗口外的鼠标消息。 |
releasecapture | 设置禁止捕获绘图窗口外的鼠标消息 |
其它函数
相关函数如下:
函数或数据类型 | 描述 |
---|---|
BeginBatchDraw | 开始批量绘图。 |
EndBatchDraw | 结束批量绘制,并执行未完成的绘制任务。 |
FlushBatchDraw | 执行未完成的绘制任务。 |
GetEasyXVer | 获取当前 EasyX 库的版本信息。 |
GetHWnd | 获取绘图窗口句柄。 |
InputBox | 以对话框形式获取用户输入。 |
graphics.h 暂留函数
在 easyx.h 的基础上,graphics.h 暂时保留了若干已经废弃的函数,以提高对旧程序的兼容性。
在 graphics.h 里面额外提供的相关函数如下:
函数或数据类型 | 描述 |
---|---|
bar | 画无边框填充矩形。 |
bar3d | 画有边框三维填充矩形。 |
drawpoly | 画无填充的多边形。 |
fillpoly | 画有边框的填充多边形。 |
getcolor | 获取当前绘图前景色。 |
getmaxx | 获取绘图窗口的物理坐标中的最大 x 坐标。 |
getmaxy | 获取绘图窗口的物理坐标中的最大 y 坐标。 |
getx | 获取当前 x 坐标。 |
gety | 获取当前 y 坐标。 |
linerel | 画直线。 |
lineto | 画直线。 |
moverel | 移动当前点。 |
moveto | 移动当前点。 |
outtext | 在当前位置输出字符串。 |
setcolor | 设置当前绘图前景色。 |
setwritemode | 设置前景的二元光栅操作模式。 |
鼠标相关函数
鼠标消息缓冲区可以缓冲 63 个未处理的鼠标消息。每次获取鼠标消息时,将从鼠标消息缓冲区取出一个最早发生的鼠标消息。鼠标消息缓冲区满了之后,不再接收任何鼠标消息。
相关函数如下:
函数或数据类型 | 描述 |
---|---|
FlushMouseMsgBuffer | 清空鼠标消息缓冲区。 |
GetMouseMsg | 获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。 |
PeekMouseMsg | 获取一个鼠标消息,并立即返回。 |
MouseHit | 检测当前是否有鼠标消息。 |
MOUSEMSG | 保存鼠标消息的结构体。 |
示例程序
更多示例程序,请访问 https://codebus.cn
示例名称 | 描述 |
---|---|
字符阵 | 该程序示范了常见的绘图操作,包括设置字体、画线等。 |
星空 | 该程序实现了二维星空的动态效果。 |
鼠标操作 | 该程序示范了常见的鼠标操作,程序执行后会在鼠标的移动轨迹上画红点,按左键画小方块,按 Ctrl + 左键画大方块,按右键退出程序。 |
彩虹 | 该程序是 HSL 色彩模型的应用范例,程序通过调节 HSL 模型的亮度绘制渐变的天空,调节色相绘制七色彩虹。 |
字符阵
该程序示范了常见的绘图操作,包括设置字体、画线等。
// 编译环境:Visual C++ 6.0~2022,EasyX_2023大暑版
// https://easyx.cn
//
#include <graphics.h>
#include <time.h>
#include <conio.h>int main()
{// 设置随机种子srand((unsigned) time(NULL));// 初始化图形模式initgraph(640, 480);int x, y;char c;settextstyle(16, 8, _T("Courier")); // 设置字体// 设置颜色settextcolor(GREEN);setlinecolor(BLACK);for (int i = 0; i <= 479; i++){// 在随机位置显示三个随机字母for (int j = 0; j < 3; j++){x = (rand() % 80) * 8;y = (rand() % 20) * 24;c = (rand() % 26) + 65;outtextxy(x, y, c);}// 画线擦掉一个像素行line(0, i, 639, i);Sleep(10); // 延时if (i >= 479) i = -1;if (_kbhit()) break; // 按任意键退出}// 关闭图形模式closegraph();return 0;
}
星空
该程序实现了二维星空的动态效果。
// 编译环境:Visual C++ 6.0~2022,EasyX_2023大暑版
// https://easyx.cn
//
#include <graphics.h>
#include <time.h>
#include <conio.h>#define MAXSTAR 200 // 星星总数struct STAR
{double x;int y;double step;int color;
};STAR star[MAXSTAR];// 初始化星星
void InitStar(int i)
{star[i].x = 0;star[i].y = rand() % 480;star[i].step = (rand() % 5000) / 1000.0 + 1;star[i].color = (int)(star[i].step * 255 / 6.0 + 0.5); // 速度越快,颜色越亮star[i].color = RGB(star[i].color, star[i].color, star[i].color);
}// 移动星星
void MoveStar(int i)
{// 擦掉原来的星星putpixel((int)star[i].x, star[i].y, 0);// 计算新位置star[i].x += star[i].step;if (star[i].x > 640) InitStar(i);// 画新星星putpixel((int)star[i].x, star[i].y, star[i].color);
}// 主函数
int main()
{srand((unsigned)time(NULL)); // 随机种子initgraph(640, 480); // 创建绘图窗口// 初始化所有星星for(int i = 0; i < MAXSTAR; i++){InitStar(i);star[i].x = rand() % 640;}// 绘制星空,按任意键退出while(!_kbhit()){for(int i = 0; i < MAXSTAR; i++)MoveStar(i);Sleep(20);}closegraph(); // 关闭绘图窗口return 0;
}
鼠标操作
该程序示范了常见的鼠标操作,程序执行后会在鼠标的移动轨迹上画红点,按左键画小方块,按 Ctrl + 左键画大方块,按右键退出程序。
// 编译环境:Visual C++ 6.0~2022,EasyX_2023大暑版
// https://easyx.cn
//
#include <graphics.h>int main()
{// 初始化图形窗口initgraph(640, 480);ExMessage m; // 定义消息变量while(true){// 获取一条鼠标或按键消息m = getmessage(EX_MOUSE | EX_KEY);switch(m.message){case WM_MOUSEMOVE:// 鼠标移动的时候画红色的小点putpixel(m.x, m.y, RED);break;case WM_LBUTTONDOWN:// 如果点左键的同时按下了 Ctrl 键if (m.ctrl)// 画一个大方块rectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10);else// 画一个小方块rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5);break;case WM_KEYDOWN:if (m.vkcode == VK_ESCAPE)return 0; // 按 ESC 键退出程序}}// 关闭图形窗口closegraph();return 0;
}
更多示例程序,请访问 https://codebus.cn
彩虹
该程序是 HSL 色彩模型的应用范例,程序通过调节 HSL 模型的亮度绘制渐变的天空,调节色相绘制七色彩虹。
// 编译环境:Visual C++ 6.0~2022,EasyX_2023大暑版
// https://easyx.cn
//
#include <graphics.h>
#include <conio.h>int main()
{// 创建绘图窗口initgraph(640, 480);// 画渐变的天空(通过亮度逐渐增加)float H = 190; // 色相float S = 1; // 饱和度float L = 0.7f; // 亮度for(int y = 0; y < 480; y++){L += 0.0005f;setlinecolor( HSLtoRGB(H, S, L) );line(0, y, 639, y);}// 画彩虹(通过色相逐渐增加)H = 0;S = 1;L = 0.5f;setlinestyle(PS_SOLID, 2); // 设置线宽为 2for(int r = 400; r > 344; r--){H += 5;setlinecolor( HSLtoRGB(H, S, L) );circle(500, 480, r);}// 按任意键退出_getch();closegraph();return 0;
}
编译错误:2 个重载中没有一个可以转换所有参数类型
错误描述:
一些程序在 VC6 下运行好好地,但是放到 VC2008 及更高版本 VC 下编译却报错误(以下仅以 VC2008 举例,高版本 VC 类似),例如使用如下语句:
outtextxy(10, 20, "Hello World");
Copy
在 VC6 下可以成功编译,但在 VC2008 下编译后会有错误。
错误提示如下:
error C2665: “outtextxy”: 2 个重载中没有一个可以转换所有参数类型
Copy
同样的,对于其他一些包含字符串调用的函数,例如 loadimage、drawtext 等,也会遇到类似问题。
错误原因:
简单来说,这是由于字符编码问题引起的。
VC6 默认使用的 MBCS 编码,而 VC2008 及高版本 VC 默认使用的 Unicode 编码。以下详细解释这个问题:
用 char 表示字符时,英文占用一个字节,中文占用两个字节。这样有一个严重的问题:两个连续字节,究竟是两个英文字符,还是一个中文字符?为了解决这个问题,Unicode 编码诞生了。Unicode 编码不管中文英文都用两个字节表示。
对于 MBCS 编码,字符变量用 char 定义。
对于 Unicode 编码中,字符变量用 wchar_t 定义。
为了提高代码的自适应性,微软在 tchar.h 里面定义了 TCHAR,而 TCHAR 会根据项目定义的编码,自动展开为 char 或 wchar_t。
在 Windows API 和 EasyX 里面的大多数字符串指针都用的 LPCTSTR 或 LPTSTR 类型,LPCTSTR / LPTSTR 就是“Long Point (Const) Tchar STRing”的缩写。所以可以认为,LPCTSTR 就是 const TCHAR *,LPTSTR 就是 TCHAR * 。
于是,在 VS2008 里面,给函数传递 char 字符串时,就会提示前述错误。
解决方案:
解决方法有多个,目的一样,都是让字符编码相匹配。
**方法一:**将所有字符串都修改为 TCHAR 版本。
简单来说需要注意以下几点:
- 在程序中使用 #include 添加对 TCHAR 的支持。
- 对于字符串,例如 “abc” 用 _T(“abc”) 表示。就是加上 _T(“”)。
- 定义字符变量时,将 char 换成 TCHAR。
- 操作字符串的函数也要换成相应的 TCHAR 版本,例如 strcpy 要换成 _tcscpy。(详见 MSDN)
**方法二:**在代码中取消 Unicode 编码的宏定义,让后续编译都以 MBCS 编码进行。
方法很简单,只需要在代码文件的顶部增加以下代码:
#undef UNICODE
#undef _UNICODE
Copy
这样就可以取消 Unicode 编码的宏定义,让整个项目以 MBCS 编码编译。
**方法三:**在 VC2008 里面,将项目属性中的字符编码修改为 MBCS。
操作步骤:点菜单“项目-> xxx 属性…”,点左侧的“配置属性”,在右侧的设置中找到“字符集”,修改默认的“使用 Unicode 字符集”为“使用多字节字符集”。
设置完毕后,再次编译就可以看到问题已经解决。
编译错误:EasyX is only for C++
错误描述:
在 Visual C++ 中编译引用 graphics.h 头文件后,编译产生错误:
fatal error C1189: #error : EasyX is only for C++
Copy
错误原因:
为了降低学习编程的干扰,EasyX 库在很大程度上简化了图形函数的使用。由于在简化图形函数的过程中使用了部分 c++ 的特性,因此,当代码是 .c 扩展名时,Visual C++ 会调用 c 编译器而不是 c++ 编译器,以至于产生这个编译错误。
解决方案:
不用修改任何程序代码,只需要将代码文件的扩展名由 .c 修改为 .cpp,就能解决这个编译问题。
对于学习编程而言,通常可以认为 c 语言是 c++ 语言的一个子集,因此,在 .cpp 文件中学习 c 语言编程是没有什么问题的。
相关文章:

【EasyX】 使用说明
EasyX 使用说明 基本说明 EasyX 是针对 C 的图形库,可以帮助 C/C 初学者快速上手图形和游戏编程。 比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏&am…...

以太坊基金会JUSTIN DRAKE确认出席Hack.Summit() 2024区块链开发者大会
以太坊基金会JUSTIN DRAKE确认将出席由Hack VC主办,AltLayer、Berachain协办,并获得了Solana、The Graph、Blockchain Academy、ScalingX、0G、SNZ以及数码港的大力支持,本次大会由Techub News承办的Hack.Summit() 2024区块链开发者盛会。 Ju…...
数学建模常用代码
SVM分类器 1.命令函数部分: clear;%清屏 clc; X load(data.txt); n length(X);%总样本数量 y X(:,4);%类别标志 X X(:,1:3); TOL 0.0001;%精度要求 C 1;%参数,对损失函数的权重 b 0;%初始设置截距b Wold 0;%未更新a时的W(a) Wnew 0;%更新a后的…...

学点儿Java_Day7_在实体类当中IDEA无法进行单元测试(@Test没有启动按钮)
在敲代码体会继承和访问修饰符的时候忽然遇到了单元测试不管用的情况,表现为没有启动按钮 经过一番折腾,发现我的测试是在具有构造函数的实体类Person当中进行的,当我把所有的构造函数删除后,启动按钮又出来了,加…...
C语言:二叉树基础
一、树 1.1 树的概念 1.树是有n个节点组成的具有层次关系的集合,是一种非线性的结构。 2.树的第一个节点称为根,根没有前驱节点。 3.除了根节点,其余每个节点都只有一个前驱节点,有0个或多个后继节点。 4.节点的度&#x…...
LeetCode热题Hot100-两数之和
充分意识到Coding能力的重要性,重启算法刷题之旅。 没想到这么简单的题目都写的磕磕绊绊。 一刷只写自己的解,二刷再看有没有其他更巧妙的方法~ 题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目…...

鸿蒙实战开发-如何通过拖动滑块调节应用内字体大小
介绍 本篇Codelab将介绍如何使用基础组件Slider,通过拖动滑块调节应用内字体大小。要求完成以下功能: 实现两个页面的UX:主页面和字体大小调节页面。拖动滑块改变字体大小系数,列表页和调节页面字体大小同步变化。往右拖动滑块字…...

matlab实现神经网络检测手写数字
一、要求 1.计算sigmoid函数的梯度; 2.随机初始化网络权重; 3.编写网络的代价函数。 二、算法介绍 神经网络结构: 不正则化的神经网络的代价函数: 正则化: S型函数求导: 反向传播算法&…...
增强现实与虚拟现实中的大模型应用:沉浸式体验的创新
增强现实与虚拟现实中的大模型应用:沉浸式体验的创新 1. 背景介绍 随着技术的进步,增强现实(AR)和虚拟现实(VR)正在成为越来越受欢迎的沉浸式体验方式。大模型,如神经网络和深度学习模型&…...

【数据分析案列】--- 北京某平台二手房可视化数据分析
一、引言 本案列基于北京某平台的二手房数据,通过数据可视化的方式对二手房市场进行分析。通过对获取的数据进行清冼(至关重要),对房屋价格、面积、有无电梯等因素的可视化展示,我们可以深入了解北京二手房市场的特点…...
【Golang星辰图】创造美丽图表,洞察数据:解析Go语言中的数据可视化和数据分析库
解锁数据的力量:深入研究Go语言中的数据可视化和数据分析库 前言 本文将介绍Go语言中几个优秀的数据可视化和数据分析库,以帮助开发者更好地处理和分析数据。这些库提供了丰富的功能和工具,可用于创建漂亮的可视化图表、进行数值计算和数据…...

阿里云原生:如何熟悉一个系统
原文地址:https://mp.weixin.qq.com/s/J8eK-qRMkmHEQZ_dVts9aQ?poc_tokenHMA-_mWjfcDmGVW6hXX1xEDDvuJPE3pL9-8uSlyY 导读:本文总结了熟悉系统主要分三部分:业务学习、技术学习、实战。每部分会梳理一些在学习过程中需要解答的问题,这些问题…...
Scala第十一章节(正则表达式和异常处理)
4. 正则表达式 4.1 概述 所谓的正则表达式指的是正确的,符合特定规则的式子, 它是一门独立的语言, 并且能被兼容到绝大多数的编程语言中。在scala中, 可以很方便地使用正则表达式来匹配数据。具体如下: Scala中提供了Regex类来定义正则表达式.要构造一个Regex对象࿰…...
Flutter运行MacOs网络请求报错Unhandled Exception: DioException [connection error]:...
报错信息 [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: DioException [connection error]: The connection errored: Connection failed This indicates an error which most likely cannot be solved by the library. Error: SocketException: …...

基于SpringBoot+MyBatis框架的智慧生活商城系统的设计与实现(源码+LW+部署+讲解)
目录 前言 需求分析 可行性分析 技术实现 后端框架:Spring Boot 持久层框架:MyBatis 前端框架:Vue.js 数据库:MySQL 功能介绍 前台功能拓展 商品详情单管理 个人中心 秒杀活动 推荐系统 评论与评分系统 后台功能拓…...

Godot 学习笔记(5):彻底的项目工程化,解决GodotProjectDir is null
文章目录 前言GodotProjectDir is null解决方法解决警告问题根本解决代码问题测试引用其实其它库的输出路径无所谓。 总结 前言 Godot 项目工程化上有一朵乌云,我看Godot的Visual Studio 项目的时候,发现如果是手动新建项目导入Godot包,会导…...
Openharmony
OpenHarmony 是一个开源的、多设备分布式操作系统,由开放原子开源基金会(OpenAtom Foundation)孵化及运营。它旨在提供跨多种设备的统一开发体验,支持一次开发,多端部署。OpenHarmony 的系统架构遵循分层设计原则&…...
24计算机考研调剂 | 华南师范大学
华南师范大学接收调剂研究生 考研调剂招生信息 学校:华南师范大学 专业:- 年级:2024 招生人数:- 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 课题组主要研究生物拉曼光谱技术、基于荧光的微生物快检技术、显微成像设备与相…...

【Node.js】全局变量和全局 API
node 环境中没有 dom 和 bom ,此外 es 基本上都是可以正常使用的。 如果一定要使用 dom 和bom,可以借助第三方库 jsdom 帮助我们实现操作。npm i jsdom 实例: const fs require(node:fs) const {JSDOM} require(jsdom)const dom new JS…...

Install Docker
Docker Desktop 直接安装 Docker Desktop Docker Desktop includes the Docker daemon (dockerd), the Docker client (docker), Docker Compose, Docker Content Trust, Kubernetes, and Credential Helper. Linux下安装Docker CE 参考官方文档 参见阿里云的文档 # step 1…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...