C/C++图形库_EasyX 基本使用
一、窗口创建
1、头文件
graphics.h(包含已经淘汰的函数)
easy.h(只包含最新的)
2、窗口函数
1)、初始化绘图窗口
initgraph();
2)、关闭图形窗口
closegraph();
3)、清除屏幕内容
cleardevice();
3、创建实例代码
#include<graphics.h>
int main()
{
initgraph(200, 200,NOCLOSE);//设置宽度为200,高度为200,NOCLOSE指无法关闭的窗口
//以下语句暂不做解释
getchar();
closegraph();
return 0;
}
4、窗口坐标系:
左上为原点0,横向为x坐标,垂向为y坐标。

二、基本图形绘制
1、设置填充样式函数
绘图函数从填充样式分类可分为无填充、有边框填充、无边框三种。
以画圆为例:
circle():无填充
fillcircle():有边框填充
solidcircle():无边框填充
2、设置颜色函数
1)、设置填充颜色函数:
setfillcolor(颜色)
2)、设置线条颜色函数:
setlinecolor(颜色)
3)、设置线条样式函数:
setlinestyle(线型, 宽度)
4)、设置背景颜色函数:
setbkcolor(颜色);
3、代码实例
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
int main()
{
initgraph(800, 600); // 设置宽度为800,高度为600
setbkcolor(LIGHTGRAY); //设置背景色为灰色
cleardevice(); // 用背景色清空屏幕
setfillcolor(GREEN); //设置填充颜色
setlinecolor(RED); //设置线条颜色
setlinestyle(PS_SOLID, 5); //设置线条样式及宽度
circle(100,100,50); //无填充
fillcircle(200,100,50); //有边框填充
solidcircle(300,100,50); //无边框填充
// 以下语句暂不做解释
getchar();
closegraph();
return 0;
}
4、运行结果

三、文字绘制
1、文字函数
1)、输出字符串函数:
outtextxy(int x, int y, LPCTSTR str);
2)、设置文字样式函数:
settextstyle(int font, int direction, int charsize);
3)、设置文字背景模式:
setbkmode(int mode);
4)、设置文字颜色函数:
settextcolor(COLORREF color);
5)、获取文本宽和高函数:
textheight(LPCTSTR str) 和 textwidth(LPCTSTR str);
2、实例代码
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
int main()
{
SetConsoleOutputCP(CP_UTF8);
initgraph(800, 600); // 设置宽度为800,高度为600
setbkmode(TRANSPARENT); //设置文字背景色
settextstyle(40, 0, _T("微软雅黑")); //设置文字样式。
settextcolor(RED); //设置文字颜色
outtextxy(0, 0, _T("测试")); //输出文字
int nHeight = textheight(_T("测试")); //获取文字高度
int nWidth = textwidth(_T("测试")); //获取文字宽度
TCHAR str[20];
_stprintf(str,_T("高度为:%d,宽度为:%d"),nHeight,nWidth); //格式化字符串
outtextxy(0, 100, str); //输出文字
// 以下语句暂不做解释
getchar();
closegraph();
return 0;
}
3、运行结果

四、消息处理
1、消息结构体
struct ExMessage
{
USHORT message; // 消息标识
union
{
// 鼠标消息的数据
struct
{
bool ctrl :1; // Ctrl 键是否按下
bool shift :1; // Shift 键是否按下
bool lbutton :1; // 鼠标左键是否按下
bool mbutton :1; // 鼠标中键是否按下
bool rbutton :1; // 鼠标右键
short x; // 鼠标的 x 坐标
short y; // 鼠标的 y 坐标
short wheel; // 鼠标滚轮滚动值,为 120 的倍数
};
// 按键消息的数据
struct
{
BYTE vkcode; // 按键的虚拟键码
BYTE scancode; // 按键的扫描码(依赖于 OEM)
bool extended :1; // 按键是否是扩展键
bool prevdown :1; // 按键的前一个状态是否按下
};
// 字符消息的数据
TCHAR ch;
// 窗口消息的数据
struct
{
WPARAM wParam;
LPARAM lParam;
};
};
};
2、消息函数
1)、获取一个消息,并立即返回
peekmessage();
2)、清空消息缓冲区
flushmessage();
3、实例代码
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
int main()
{
initgraph(800, 600,EX_DBLCLKS); // 设置宽度为800,高度为600 // 输出文字
ExMessage msg; // 定义一个ExMessage类型的变量msg,用于存储消息
while (true)
{
peekmessage(&msg, EM_MOUSE|EM_KEY); // 检查是否有鼠标消息,将消息存储在m中
switch (msg.message)
{
case WM_LBUTTONDOWN: // 左键按下
printf("左键按下\n");
break;
case WM_RBUTTONDOWN: // 右键按下
printf("右键按下\n");
break;
case WM_LBUTTONUP: // 左键抬起
printf("左键抬起\n");
break;
case WM_RBUTTONUP: // 右键抬起
printf("右键抬起\n");
break;
case WM_LBUTTONDBLCLK: // 左键双击
printf("左键双击\n");
break;
case WM_RBUTTONDBLCLK: // 右键双击
printf("右键双击\n");
break;
case WM_MBUTTONDOWN: // 中键按下
printf("中键按下\n");
break;
case WM_MBUTTONUP: // 中键抬起
printf("中键抬起\n");
break;
case WM_MOUSEWHEEL: // 鼠标滚动
printf("鼠标滚动 %d\n",msg.wheel);
break;
/* case WM_MOUSEMOVE: // 鼠标移动
printf("鼠标移动 x:%d,y%d\n",msg.x,msg.y);
break;*/
case WM_KEYDOWN: // 按键按下
printf("keydown\n");
switch (msg.vkcode)
{
case VK_UP:
printf("上键按下\n");
break;
case VK_DOWN:
printf("下键按下\n");
break;
case VK_LEFT:
printf("左键按下\n");
break;
case VK_RIGHT:
printf("右键按下\n");
break;
case 'A'://字母按键必须大写
printf("按下A键\n");
break;
case VK_SPACE://具体其他按键还得去文档里看
printf("按下空格\n");
break;
}
break;
default:
break;
}
}
closegraph();
return 0;
}
五、图像管理
1、清屏
在图像重新刷新前最好清一下屏。
cleardevice();
2、双缓冲
EasyX双缓冲是一种用于优化图形绘制性能的技术,在频繁刷新屏幕时能有效减少闪烁,提升视觉效果。
BeginBatchDraw() 开始批量绘图,即开始在内存中绘制;
EndBatchDraw() 结束批量绘图,将内存中的图像一次性显示到屏幕上;
3、帧率控制
在 EasyX 图形编程中,实现稳定且精确的帧率控制是提升动画和游戏流畅度的关键。
核心目标是确保每一帧的持续时间(包括绘图和逻辑计算)尽可能接近你设定的目标帧时间(例如,目标 60 FPS 时,每帧应持续约 16.67 毫秒)。
1)、基础方法使用clock()函数
利用标准库函数 clock()来测量一帧的运行时间,并通过 Sleep()函数休眠剩余时间。
#include <easyx.h>
#include <time.h>
int main() {
initgraph(640, 480);
const int FPS = 60; // 目标帧率
const clock_t frameTime = 1000 / FPS; // 计算每帧理论时间(毫秒)
while (true) {
clock_t startTime = clock(); // 记录帧开始时间
// ... 你的游戏逻辑和绘图代码 ...
// 例如:cleardevice(), 绘制图像, 更新物体位置等
// 强烈建议使用双缓冲函数防止闪烁
BeginBatchDraw();
// 所有的绘图操作
EndBatchDraw();
clock_t elapsedTime = clock() - startTime; // 计算本帧已用时间
// 如果本帧绘制用时少于目标时间,则休眠剩余时间
if (elapsedTime < frameTime) {
Sleep(frameTime - elapsedTime);
}
}
closegraph();
return 0;
}
2)、高精度方法:使用 QueryPerformanceCounter()
对于需要更精确控制的场景,Windows 提供了高精度性能计数器,可以达到微秒级别的计时精度。
#include <easyx.h>
#include <windows.h> // 需要包含此头文件以使用高精度计时函数
int main() {
initgraph(640, 480);
const int FPS = 60;
const long long targetMicrosecPerFrame = 1000000 / FPS; // 将目标帧时间转换为微秒
LARGE_INTEGER freq, startCount, endCount;
QueryPerformanceFrequency(&freq); // 获取计数器的频率(每秒计数次数)
// 可选:提高 Sleep 函数的定时精度(通常在 1ms 左右)
timeBeginPeriod(1);
while (true) {
QueryPerformanceCounter(&startCount); // 开始计时
// ... 你的游戏逻辑和绘图代码 ...
BeginBatchDraw();
// 绘图操作
EndBatchDraw();
QueryPerformanceCounter(&endCount); // 结束计时
// 计算本帧实际消耗的时间(微秒)
long long elapsedMicrosec = (endCount.QuadPart - startCount.QuadPart) * 1000000 / freq.QuadPart;
// 高精度等待:循环检查直到达到目标帧时间
while (elapsedMicrosec < targetMicrosecPerFrame) {
Sleep(1); // 每次休眠 1ms 以避免空转消耗过多 CPU
QueryPerformanceCounter(&endCount);
elapsedMicrosec = (endCount.QuadPart - startCount.QuadPart) * 1000000 / freq.QuadPart;
}
}
timeEndPeriod(1); // 与 timeBeginPeriod(1) 配对使用
closegraph();
return 0;
}
六、图片
1、图片类型
在使用图像之前,需要定义一个对象,然后把图片加载进变量才能使用。
在使用图片的时候需要EasyX提供给我们的类型:IMAGE ,如IMAGE img;
2、相关函数
1)、图像加载函数:loadimage
2)、图像输出函数:putimage
3、加载并输出一张图片示例:
//实例化一个img对象
IMAGE img;
//加载图片
//相对路径:"./"表示当前文件夹,"../"表示当前文件夹的上一级文件夹,比如:./图片名.png
//绝对路径:比如:D:\\biancheng\\Project31\\图片名.png,得用双反斜杠
loadimage(&img,"./图片.png");//以相对路径加载一张图片
//loadimage(&img,"D:\\biancheng\\Project31\\图片名.png");以绝对路径加载一张图片
putimage(0,0,&img);//从窗口的(0,0)位置输出图片
七、播放音乐
1、包含windowsAPI相关头文件
包含头文件windos.h和mmsystem.h(如果已经包含graphics.h则无需包含windos.h; mmsystem.h需要放在graphics.h的下方)
#include<graphics.h>//包含图形库头文件
#include<mmsystem.h>//包含多媒体设备接口头文件
2、加载静态库winmm.lib
#pragma comment(lib,"winmm.lib")//加载静态库
3、使用mciSendString函数播放音乐
//播放音乐
void BGM()
{
//打开音乐
mciSendString("open ./music.mp3", 0, 0, 0);//mci:多媒体设备接口 send:发送 string:字符串
//播放音乐 repeat:重复播放
mciSendString("play ./music.mp3", 0, 0, 0);
mciSendString("play ./music.mp3 repeat", 0, 0, 0);
}
4、实例代码
#include <Windows.h> // 包含 Windows.h 头文件,提供 Windows 平台下的 API 支持
#include <stdio.h> // 包含标准输入输出库头文件
#include <mmsystem.h> // 包含多媒体系统 API 头文件
#pragma comment(lib,"winmm.lib") // 指定链接到 winmm.lib 库
void makeMenu() // 定义函数 makeMenu,用于打印菜单
{
printf("-------[音乐播放]-------\n"); // 打印菜单标题
printf("\t\t0.退出\n"); // 打印退出选项
printf("\t\t1.播放音乐\n"); // 打印播放音乐选项
printf("\t\t2.暂停音乐\n"); // 打印暂停音乐选项
printf("\t\t3.继续音乐\n"); // 打印继续音乐选项
printf("\t\t4.关闭音乐\n"); // 打印关闭音乐选项
printf("-------------------\n"); // 打印分隔线
}
void keyDown() // 定义函数 keyDown,用于处理用户输入并执行相应操作
{
int userkey = 0; // 定义变量 userkey 存储用户输入
scanf_s("%d", &userkey); // 读取用户输入
switch (userkey) // 根据用户输入执行相应操作
{
case 0: // 用户输入为 0,退出程序
exit(0);
case 1: // 用户输入为 1,播放音乐
mciSendString(L"play ./music/1.mp3 repeat", NULL, 0, NULL); // 播放音乐文件,并设置为循环播放
break;
case 2: // 用户输入为 2,暂停音乐
mciSendString(L"pause ./music/1.mp3 ", NULL, 0, NULL); // 暂停音乐播放
break;
case 3: // 用户输入为 3,继续音乐
mciSendString(L"resume ./music/1.mp3 ", NULL, 0, NULL); // 继续音乐播放
break;
case 4: // 用户输入为 4,关闭音乐
mciSendString(L"close ./music/1.mp3 ", NULL, 0, NULL); // 关闭音乐文件
break;
}
}
int main() // 主函数
{
mciSendString(L"open ./music/1.mp3", NULL, 0, NULL); // 打开音乐文件
while (1) // 进入主循环,持续显示菜单并处理用户输入
{
makeMenu(); // 显示菜单
keyDown(); // 处理用户输入
}
}
八、EasyX函数
1、绘图设备相关函数
| 函数或数据类型 | 描述 |
|---|---|
| cleardevice | 清除屏幕内容。 |
| initgraph | 初始化绘图窗口。 |
| closegraph | 关闭图形窗口。 |
| getaspectratio | 获取当前缩放因子。 |
| setaspectratio | 设置当前缩放因子。 |
| graphdefaults | 恢复绘图窗口为默认值。 |
| setorigin | 设置坐标原点。 |
| setcliprgn | 设置当前绘图设备的裁剪区。 |
| clearcliprgn | 清除裁剪区的屏幕内容。 |
2、颜色模型
| 函数或数据类型 | 描述 |
|---|---|
| GetBValue | 返回指定颜色中的蓝色值。 |
| GetGValue | 返回指定颜色中的绿色值。 |
| GetRValue | 返回指定颜色中的红色值。 |
| HSLtoRGB | 转换 HSL 颜色为 RGB 颜色。 |
| HSVtoRGB | 转换 HSV 颜色为 RGB 颜色。 |
| RGB | 通过红、绿、蓝颜色分量合成颜色。 |
| RGBtoGRAY | 转换 RGB 颜色为 灰度颜色。 |
| RGBtoHSL | 转换 RGB 颜色为 HSL 颜色。 |
| RGBtoHSV | 转换 RGB 颜色为 HSV 颜色。 |
| BGR | 交换颜色中的红色和蓝色。 |
3、颜色及样式设置相关函数
| 函数或数据类型 | 描述 |
|---|---|
| FILLSTYLE | 填充样式对象。 |
| getbkcolor | 获取当前设备背景色。 |
| getbkmode | 获取当前设备图案填充和文字输出时的背景模式。 |
| getfillcolor | 获取当前设备填充颜色。 |
| getfillstyle | 获取当前设备填充样式。 |
| getlinecolor | 获取当前设备画线颜色。 |
| getlinestyle | 获取当前设备画线样式。 |
| getpolyfillmode | 获取当前设备多边形填充模式。 |
| getrop2 | 获取当前设备二元光栅操作模式。 |
| LINESTYLE | 画线样式对象。 |
| setbkcolor | 设置当前设备绘图背景色。 |
| setbkmode | 设置当前设备图案填充和文字输出时的背景模式。 |
| setfillcolor | 设置当前设备填充颜色。 |
| setfillstyle | 设置当前设备填充样式。 |
| setlinecolor | 设置当前设备画线颜色。 |
| setlinestyle | 设置当前设备画线样式。 |
| setpolyfillmode | 设置当前设备多边形填充模式。 |
| setrop2 | 设置当前设备二元光栅操作模式。 |
4、绘制图形相关函数
| 函数或数据类型 | 描述 |
|---|---|
| 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 | 画无边框的填充圆角矩形。 |
5、文字输出相关函数
| 函数或数据类型 | 描述 |
|---|---|
| gettextcolor | 获取当前文字颜色。 |
| gettextstyle | 获取当前文字样式。 |
| LOGFONT | 文字样式的结构体。 |
| outtextxy | 在指定位置输出字符串。 |
| drawtext | 在指定区域内以指定格式输出字符串。 |
| settextcolor | 设置当前文字颜色。 |
| settextstyle | 设置当前文字样式。 |
| textheight | 获取字符串实际占用的像素高度。 |
| textwidth | 获取字符串实际占用的像素宽度。 |
6、图像处理相关函数
| 函数或数据类型 | 描述 |
|---|---|
| IMAGE | 保存图像的对象。 |
| loadimage | 读取图片文件。 |
| saveimage | 保存绘图内容至图片文件。 |
| getimage | 从当前绘图设备中获取图像。 |
| putimage | 在当前绘图设备上绘制指定图像。 |
| GetWorkingImage | 获取指向当前绘图设备的指针。 |
| rotateimage | 旋转 IMAGE 中的绘图内容。 |
| SetWorkingImage | 设定当前绘图设备。 |
| Resize | 调整指定绘图设备的尺寸。 |
| GetImageBuffer | 获取绘图设备的显示缓冲区指针。 |
| GetImageHDC | 获取绘图设备句柄。 |
7、消息处理相关函数
| 函数或数据类型 | 描述 |
|---|---|
| ExMessage | 消息结构体。 |
| flushmessage | 清空消息缓冲区。 |
| getmessage | 获取一个消息。如果当前消息缓冲区中没有,就一直等待。 |
| peekmessage | 获取一个消息,并立即返回。 |
| setcapture | 设置允许捕获绘图窗口外的鼠标消息。 |
| releasecapture | 设置禁止捕获绘图窗口外的鼠标消息。 |
8、其它函数
| 函数或数据类型 | 描述 |
|---|---|
| BeginBatchDraw | 开始批量绘图。 |
| EndBatchDraw | 结束批量绘制,并执行未完成的绘制任务。 |
| FlushBatchDraw | 执行未完成的绘制任务。 |
| GetEasyXVer | 获取当前 EasyX 库的版本信息。 |
| GetHWnd | 获取绘图窗口句柄。 |
| InputBox | 以对话框形式获取用户输入。 |
9、graphics.h 暂留函数
| 函数或数据类型 | 描述 |
|---|---|
| bar | 画无边框填充矩形。 |
| bar3d | 画有边框三维填充矩形。 |
| drawpoly | 画无填充的多边形。 |
| fillpoly | 画有边框的填充多边形。 |
| getcolor | 获取当前绘图前景色。 |
| getmaxx | 获取绘图窗口的物理坐标中的最大 x 坐标。 |
| getmaxy | 获取绘图窗口的物理坐标中的最大 y 坐标。 |
| getx | 获取当前 x 坐标。 |
| gety | 获取当前 y 坐标。 |
| linerel | 画直线。 |
| lineto | 画直线。 |
| moverel | 移动当前点。 |
| moveto | 移动当前点。 |
| outtext | 在当前位置输出字符串。 |
| setcolor | 设置当前绘图前景色。 |
| setwritemode | 设置前景的二元光栅操作模式。 |
更多推荐


所有评论(0)