文章目录

一、窗口创建

   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 设置前景的二元光栅操作模式。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐