FEATURED · 精选文章

EGE图形库入门:C/C++绘图基础与交互实战

发布时间 / 2026/9/15 14:00:31
来源 / 创域科博编辑部
栏目 / 资讯中心
EGE图形库入门:C/C++绘图基础与交互实战 如果你正儿八经学过 C/C大概率有过这种经历学了大半个学期的语法最终能在黑黢黢的控制台里打印几个菱形、算个水仙花数然后就没了。想画个图、做个动画却不知道从哪下手。EGE 就是为这件事准备的。EGE 的全称是 Easy Graphics Engine一个基于 Windows GDI 的 C/C 二维图形库它把绘图、动画、键盘鼠标交互这些底层细节封装成了一套非常简单的 API特别适合作为图形编程的“第一口奶”。这篇入门篇我会把绘图基础知识一次讲透从环境配置到坐标系、颜色、基本图元再到刷新机制和交互事件全是新手阶段绕不开的东西。1. EGE 是什么先搞懂库的定位再开始写代码1.1 从 graphics.h 到 EGE为什么需要它如果你翻过老一点的教材可能会看到#include graphics.h这种写法那是 Turbo C 时代的产物。那套图形库接口确实简单但它是 16 位时代的古董放到现在的 64 位 Windows 上根本跑不起来光是安装一个兼容环境就够劝退一批人了。EGE 做的事情就是把那套“古老但好用”的绘图接口在 Windows 上重新实现了一遍。它用我们熟悉的 C/C 函数名比如line、circle、rectangle底层却调的是 Windows GDI 的绘图机制。你不用关心设备上下文怎么获取、画笔画刷怎么创建只需要会写initgraph和line就能画出东西来。这带来的最直接好处是门槛低。你只需要掌握函数名、参数顺序、坐标系规则就能在很短时间内做出一个看得见摸得着的图形程序。这也是很多高校在 C 语言课之后、数据结构课之前喜欢用 EGE 做课程设计的原因。做一个贪吃蛇、做一个五子棋、做一个排序过程的可视化演示EGE 完全能扛得住。1.2 EGE 的能力边界和适合人群有些朋友一上来就问EGE 能不能做 3D能不能做大型游戏答案是明确的不适合。它是 2D 图形库不负责 3D 渲染也不提供物理引擎、音效引擎。你要是想做商业级游戏应该去学 Unity、Godot图形 API 也该学 DirectX 或 OpenGL。EGE 的定位恰恰是“教学”和“快速原型”。它适合下面这几类场景刚学完 C/C 基础想写一个带窗口、带交互的图形程序来巩固语法做课程设计需要一个画图库来完成某个算法可视化想理解双缓冲、消息循环、坐标变换这些图形编程基础概念但不想一开始就陷入 Windows 编程的复杂细节做一个小工具或小游戏原型验证想法是否可行。如果你属于上面任何一种EGE 都是很合适的选择。等你通过它理解了图形程序的基本骨架再去看 DirectX 或 OpenGL会发现很多概念是相通的只是后者底层细节更多、更复杂。所以我一直认为EGE 不是“玩具”而是图形编程的“入门阶梯”。1.3 绘图基础知识的核心脉络这篇文章虽然叫入门篇但我不打算只给你罗列函数列表。绘图程序看似千变万化底层无非四件事坐标系怎么定位、颜色怎么表示、图元怎么画、画面怎么刷新。这四件事串起来再加上键盘鼠标事件你就能拼出绝大多数 2D 程序。把这四件事想明白后面学任何图形库都会轻松很多。因为很多概念是跨库通用的比如坐标系原点在哪、颜色用 RGB 还是 RGBA、双缓冲解决什么问题这些不是 EGE 独有的知识而是图形编程的公共基础。2. VS 集成 EGE头文件、库文件与字符集的三个坑2.1 下载解压之后的文件到底怎么放EGE 是一个开源库通常下载下来是一个压缩包里面包含 include 目录和 lib 目录有的版本还会有 lib64 目录。include 里有graphics.hlib 里有若干个.lib文件。我见过太多新手卡在这一步直接把graphics.h扔到 C 盘某个目录然后在代码里#include graphics.h结果编译报错找不到头文件。原因很简单编译器默认不会去那个目录找头文件你得把目录告诉它。在 Visual Studio 里有两条路径可以配置在项目属性 - VC 目录 - 包含目录里填上 include 文件夹的路径在项目属性 - 链接器 - 常规 - 附加库目录里填上 lib 文件夹的路径在项目属性 - 链接器 - 输入 - 附加依赖项里填上你要用的.lib文件名。很多教程会让你去“工具 - 选项 - 项目和解决方案 - VC 目录”里做全局配置。我不太建议这么干因为那个位置在新版本 VS 里默认不开放而且全局配置会影响其他项目。更干净的做法是直接在项目属性里配虽然每次新建项目要重配一次但不会污染环境出了问题也好排查。2.2 库文件选哪个Debug/Release、x86/x64 的对应关系这一步是环境配置里最容易出问题的地方。你下载的 lib 目录里很可能有EGE20.lib、EGE20d.lib、EGE64.lib、EGE64d.lib这类文件名字里的 d 表示 Debug 版本没有 d 表示 Release 版本64 表示 64 位库没有 64 字样的通常是 32 位库。选库的规则其实很死板你的解决方案配置是 Debug就选带 d 的库是 Release就选不带 d 的库你的项目平台是 x64就选 64 位库是 Win32就选 32 位库。两边只要错配一个链接阶段就会报“无法解析的外部符号 _initgraph”之类的错误。注意这个错误发生在链接期不是编译期所以你的代码看起来没问题但就是生成不了 exe。新手很容易在这种地方卡很久。我个人的习惯是新建项目时直接把平台选成 x64解决方案配置保持 Debug然后附加依赖项填EGE64d.lib。这样 Debug 阶段调试方便等要发布时再切成 Release把库换成EGE64.lib重新编译一遍。2.3 字符集为什么你的项目一编译报一堆“无法转换”错误EGE 的头文件里大量使用多字节字符集相关的内容而 Visual Studio 新建项目时默认字符集是 Unicode。这会导致你在调用某些函数或者处理字符串时编译报错“无法从 const wchar_t[] 转换为 const char[]”。解决办法很简单项目属性 - 配置属性 - 常规 - 字符集把“使用 Unicode 字符集”改成“使用多字节字符集”。这个改动之后大部分字符串相关的问题就消失了。你可能会问为什么 EGE 不直接支持 Unicode答案是为了兼容性。EGF 的历史包袱比较重接口设计沿用了早期 BGI 的风格字符串参数用 char* 而不是 wchar_t*。虽然新版本也在改善但作为初学者你只需要把字符集改过去不必深究里面的历史原因。这里还有一个小建议改完字符集之后顺手检查一下项目属性里的“C 语言标准”尽量保持默认或者选 C14 以上避免因为标准太低导致某些语法用不了。EGE 本身不挑标准但你以后写代码可能会用到新特性。配置完环境我建议先写一个最小程序验证一下能通过编译再继续往下学。3. 初始化一个窗口initgraph 参数与窗口生命周期3.1 最小可用代码先让窗口跑起来看一个最精简的 EGE 程序#include graphics.h using namespace ege; int main() { initgraph(640, 480); setbkcolor(EGERGB(255, 255, 255)); cleardevice(); setcolor(EGERGB(255, 0, 0)); line(100, 100, 300, 300); getch(); closegraph(); return 0; }这段代码做了四件事初始化一个 640x480 的图形窗口把背景色设为白色清屏用红色在 (100,100) 到 (300,300) 之间画一条线。getch()的作用是让程序在这里暂停等用户按任意键后再结束。没有这行的话窗口会一闪而过。注意using namespace ege;这一行很重要。EGE 的函数都在ege命名空间里不写这行你每个函数前都要加ege::前缀代码会变得很啰嗦。3.2 initgraph 的第三个参数窗口标志位怎么选initgraph函数有三个参数第一个是窗口宽度第二个是窗口高度单位是像素。第三个参数是窗口标志位用来控制窗口的显示方式可以省略。最常用的标志位有这么几个EG_DEFAULT默认值显示一个图形窗口同时隐藏控制台窗口EG_SHOWCONSOLE保留控制台窗口方便用printf输出调试信息EG_NOCLOSE禁用窗口右上角的关闭按钮防止用户随手关掉窗口导致程序异常EG_NOMINIMIZE禁用最小化按钮。这些标志位可以用按位或|组合使用比如initgraph(800, 600, EG_SHOWCONSOLE | EG_NOCLOSE);这个写法画窗口的时候会同时显示控制台并且用户无法通过点击关闭按钮退出。调试阶段我喜欢加上EG_SHOWCONSOLE因为可以在控制台里打印坐标、颜色值这些中间信息非常有用。3.3 窗口生命周期closegraph 和 is_run有初始化就有销毁。closegraph()负责关闭图形窗口、释放资源。程序结束前忘了调用它可能导致窗口残留在屏幕上甚至在某些情况下程序无法正常退出。如果你的程序是普通顺序执行画完图、getch()暂停、closegraph()、return 0这就够了。但如果你的程序里有一个循环希望根据窗口是否被关闭来决定是否退出那就需要用到is_run()。这个函数返回一个布尔值窗口存在时返回 true窗口被关闭后返回 false。动画程序的基本骨架通常是这样的while (is_run()) { // 绘图逻辑 } closegraph();不用纠结循环里具体画什么关键是这个骨架可以保证窗口关闭后循环退出程序正常清理资源。这也是后面做交互和动画的基础。4. 坐标系和颜色绘图基础知识的两个基石4.1 左上角原点为什么和数学坐标相反很多初学 EGE 的人第一次画图就懵了。明明是画一条从左上到右下的斜线用数学里的笛卡尔坐标系去理解总觉得方向不对。因为屏幕坐标系的 y 轴方向是朝下的。原点在窗口左上角x 坐标往右递增y 坐标往下递增。窗口右下角的坐标是 (width-1, height-1)。这套规则不是 EGE 独有的你在 Windows GDI、Direct2D、多数图形库里都会遇到它是图形设备从上到下扫描行的产物。想用 y 向上的“数学坐标”怎么办两种常见方案自己做个换算设窗口高度为 H那么数学坐标 (x, y) 对应屏幕坐标 (x, H - y)。这个换算在写函数图像时很常用。调用setviewport改变坐标系原点。EGE 支持设置视口但你得注意它只改变原点位置不会翻转 y 轴方向。想翻转还得自己做换算。我建议新手先接受屏幕坐标的“反直觉”把换算写清楚而不是一开始就依赖各种坐标系变换。因为很多算法可视化、游戏逻辑最后还是要跟屏幕坐标打交道。4.2 像素坐标的常见偏移错误坐标系搞明白了还有一个很隐蔽的坑像素坐标是离散的你写的circle(100, 100, 20)圆心就在 (100, 100) 这个像素上半径 20 意味着圆会覆盖从 x80 到 x120 的区域。有些场景下这个边界会让人困惑。比如你想让一个半径 20 的小球在宽 640 的窗口里碰到右边界后回弹判断条件如果用x 640小球会在右半边半个身子探出边界后才回弹。正确的反弹边界应该是x 640 - 20或x 640 - 20。这类问题在绘制和碰撞检测中经常出现。我的经验是把坐标、半径这些值先用纸笔画一遍确认边界再写代码。看似简单的坐标判断错一个像素视觉效果就不对。4.3 颜色表示EGERGB 和预定义颜色常量EGE 里最常用的颜色构造方式是EGERGB(r, g, b)三个参数分别代表红、绿、蓝分量取值范围 0~255。这其实就是西方颜色学里的 RGB 加色模型——三色光叠加值越大越亮三个都是 255 是白色三个都是 0 是黑色。比如EGERGB(255, 0, 0) // 纯红 EGERGB(0, 255, 0) // 纯绿 EGERGB(255, 165, 0) // 橙色 EGERGB(128, 128, 128) // 灰色EGE 也内置了一些颜色常量比如WHITE、BLACK、RED、GREEN、BLUE、YELLOW写起来更短。但在实际项目里我倾向于用EGERGB显式表达颜色值因为可读性更高而且可以随意构造任意颜色。颜色这块有一个新手容易忽略的点setcolor和setfillcolor是两回事。setcolor设置的是“画笔颜色”也就是画线条、矩形边框、圆形边框用的颜色setfillcolor设置的是“画刷颜色”也就是填充图形内部用的颜色。你画一个fillcircle边框和内部都用的是它们两个共同作用的结果。4.4 背景色与清屏setbkcolor 和 cleardevice 是一对搭档还有一个经常被搞混的地方setbkcolor只是设置了“逻辑背景色”并不会立刻改变屏幕上的颜色。你必须调用cleardevice()屏幕才会被真正清成背景色。正确的顺序是setbkcolor(EGERGB(255, 255, 255)); cleardevice();如果你只调用setbkcolor然后继续画图可能会发现背景色没变或者画面残留。原因是之前屏幕上的内容还在。特别是做动画时如果不清屏上一帧的图形会残留在原地形成拖影。顺便说一句EGE 的cleardevice()是用当前背景色填充整个窗口而不是简单地“变空白”。所以如果你不想让背景是黑色记得在清屏之前先设置背景色。这个顺序问题我在教学里强调过很多次但每次还是有人踩进去。5. 绘图 API 逐个拆解点、线、矩形、圆的正确打开方式5.1 点、直线、矩形最基础的三个函数EGE 的绘图 API 风格很统一基本都是以“图元类型 参数坐标”的形式存在。最底层的是putpixel在指定位置画一个颜色点putpixel(10, 10, EGERGB(255, 0, 0));这个函数效率不高一帧画几万个点就可能慢下来但它适合做一些像素级操作比如画噪点、做图像滤波演示。直线是line参数是起点和终点的四个坐标值line(100, 100, 300, 300);矩形有两个版本rectangle只画边框fillrectangle会填充内部。参数都是左上角和右下角的坐标rectangle(100, 100, 300, 250); fillrectangle(100, 100, 300, 250);这里要注意几个容易搞混的地方参数是“左上”和“右下”不是“左上”和“宽高”。你要画一个从 (x0,y0) 开始、宽 w、高 h 的矩形右下角坐标应该是(x0 w, y0 h)这个换算很常用。rectangle用的是 setcolor 设置的颜色fillrectangle用的是 setfillcolor 设置的颜色。如果你想给矩形又描边又填充就得同时设置两个颜色或者画完填充矩形后再画一个边框矩形。5.2 圆形、椭圆与圆弧注意参数形式的差异圆形是circle参数是圆心坐标和半径circle(320, 240, 100); // 只画边框 fillcircle(320, 240, 100); // 填充内部椭圆是ellipse参数是最小外接矩形的左上角和右下角ellipse(100, 100, 300, 200);注意圆形给的是圆心半径椭圆给的是外接矩形。很多新手第一次用椭圆时会疑惑“圆心在哪”其实就是外接矩形中心((leftright)/2, (topbottom)/2)。这也是为什么画正圆时两种思路得到的代码形式完全不同。线段样式方面setlinestyle可以改变线的样式和粗细setlinestyle(0, 4); // 实线粗细为4像素这个函数第一个参数是线型第二个是线宽。想要虚线、点划线可以查一下文档基础篇里先记住实线和线宽就够了。5.3 一个完整示例画一个有数学味道的靶盘光一个函数一个函数认识不如连起来画一个完整的图形。我建议新手先去画一个靶盘因为这里面涉及循环、坐标计算、颜色循环很能锻炼对坐标和颜色模型的理解。#include graphics.h using namespace ege; int main() { initgraph(400, 400); setbkcolor(EGERGB(255, 255, 255)); cleardevice(); for (int i 0; i 8; i) { int r 200 - i * 25; if (i % 2 0) { setfillcolor(EGERGB(255, 0, 0)); setcolor(EGERGB(255, 0, 0)); } else { setfillcolor(EGERGB(255, 255, 255)); setcolor(EGERGB(255, 255, 255)); } fillcircle(200, 200, r); } getch(); closegraph(); return 0; }这个例子的思路是从外到内交替填充红白圆环。每一次fillcircle都会覆盖掉前一个圆的边缘形成环带效果。你可以顺手改一下半径间距、交替颜色体会坐标和颜色的配合。画这类图形时我建议先在纸上画一个坐标系草图标出圆心、半径、矩形区域再动手敲代码。看似多了一步实际上能帮你避免大量“试坐标”的时间。写代码时脑子里要有一个大概的画面而不是一个值一个值去蒙。6. 画面刷新与双缓冲为什么画了东西屏幕没反应6.1 双缓冲的基本原理第一次遇到“画了但屏幕上没显示”的人不在少数。这背后的机制叫双缓冲。想象一下显示屏上的内容是一块“前台画布”程序绘制的目标是另一块“后台画布”。你调用的line、circle其实都是画在了后台画布上。等一批绘图操作结束后EGE 会把后台画布一次性拷贝到前台显示。这样做的好处是不会闪烁如果直接在前台画布上逐条画线屏幕会反复刷新看起来就是画面剧烈闪动。EGE 默认就开启了双缓冲这对新手来说是好事。但它也带来一个副作用你在调用绘图函数之后并不一定立刻能在屏幕上看到。什么时候能看到取决于 EGE 的刷新策略。6.2 自动刷新 vs 手动刷新EGE 默认情况下是自动刷新的。意思是你在代码里调用绘图函数EGE 会在合适的时机自动把后台缓冲推到前台。这个“合适的时机”对新手来说有点模糊所以有些时候你觉得“画了没反应”其实是因为还没来得及刷新程序就结束或暂停了。如果你想要精确控制刷新时机可以调用setrendermode(RENDER_MANUAL);这行代码把 EGE 切换成手动刷新模式。此后你每画完一帧要显式调用flush()cleardevice(); // 画各种图形 flush();flush()的作用就是把后台缓冲提交到前台让用户看到完整的一帧。这个模式的优点是可以避免在绘制过程中出现屏幕更新适合动画、游戏这类帧循环程序。很多做动画的朋友会问到底用哪种模式好我的建议是如果你只是画静态图保持默认自动刷新就好如果你做动画强烈建议手动模式配合delay_fps控制帧率这样代码逻辑清晰也不会出现画面撕裂感。6.3 用 delay_fps 控制帧率EGE 提供了一个很方便的函数delay_fps(int fps)它做的事情很简单让当前帧保持一个稳定的节奏。传入 60就尽量让程序每秒执行约 60 帧。动画循环的经典骨架长这样initgraph(640, 480); int x 0; while (is_run()) { cleardevice(); // 清屏 setfillcolor(EGERGB(255, 0, 0)); fillcircle(x, 240, 20); // 画一个小球 x (x 2) % 640; // 更新坐标 flush(); // 提交画面 delay_fps(60); // 控制帧率 } closegraph();这个循环里cleardevice负责清空上一帧的内容绘图函数画当前帧flush提交画面delay_fps让节奏稳定。顺序看起来很简单但顺序一旦错了比如先flush再画图就会出现一帧内容缺失或者画面混乱。之所以推荐delay_fps而不是自己用Sleep是因为delay_fps会考虑上一帧实际消耗的时间尽量保证帧间隔均匀。你手动写Sleep(16)一旦绘图本身消耗了较长时间实际帧率就会低于预期。7. 键盘鼠标交互用 ExMessage 让画面动起来7.1 ExMessage 是什么图形程序如果只能看不能操作那充其量是个幻灯片。交互是图形程序的核心体验之一而 EGE 里处理交互的入口是ExMessage结构体。你可以把ExMessage理解成一条“事件记录”。每当用户按下一个键、移动鼠标、点击按钮EGE 都会生成一条对应的消息记录在ExMessage里。你的程序拿着这条消息根据消息类型和附带的数据决定接下来要做什么。ExMessage里常用的字段有message消息类型比如WM_KEYDOWN按键按下、WM_LBUTTONDOWN鼠标左键按下、WM_MOUSEMOVE鼠标移动vkcode键盘消息中按键的虚拟键码比如VK_UP表示上方向键VK_ESCAPE表示 Escx、y鼠标位置坐标wheel鼠标滚轮滚动量flags一些附加状态比如是否同时按下了 Ctrl 或 Shift。7.2 peekmessage 与 getmessageEGE 提供了两个函数用来获取消息getmessage阻塞式程序会停在这里等待一条消息到达。适合简单程序但用户体验差因为等待期间无法处理其他逻辑。peekmessage非阻塞式如果当前没有消息就立即返回。适合动画循环每一帧都检查一次有没有新消息。典型的消息处理循环是ExMessage msg; while (is_run()) { while (peekmessage(msg, EX_KEY | EX_MOUSE)) { if (msg.message WM_KEYDOWN) { // 处理按键 } else if (msg.message WM_LBUTTONDOWN) { // 处理鼠标左键点击 } } // 绘制逻辑 delay_fps(60); }第二个参数是消息过滤器。EX_KEY表示只关心键盘消息EX_MOUSE表示只关心鼠标消息两个用|合起来就表示都关心。这里要注意如果你不传第二个参数默认会接收所有消息包括一些窗口消息新手可能会因为消息类型判断不对而摸不着头脑所以建议明确传过滤器。7.3 一个综合示例按键改变颜色鼠标画点把消息处理和绘图结合起来做一个简单的小程序按空格键切换图形颜色鼠标左键点击的位置画一个实心圆。#include graphics.h using namespace ege; int main() { initgraph(640, 480); setbkcolor(EGERGB(255, 255, 255)); cleardevice(); int colorIndex 0; ExMessage msg; while (is_run()) { while (peekmessage(msg, EX_KEY | EX_MOUSE)) { if (msg.message WM_KEYDOWN msg.vkcode VK_SPACE) { colorIndex (colorIndex 1) % 3; } else if (msg.message WM_LBUTTONDOWN) { COLORREF colors[] { EGERGB(255, 0, 0), EGERGB(0, 255, 0), EGERGB(0, 0, 255) }; setfillcolor(colors[colorIndex]); fillcircle(msg.x, msg.y, 15); flush(); } } delay_fps(60); } closegraph(); return 0; }按空格键colorIndex变化但当前画面上已有的圆颜色不会变因为保存的是颜色值只有新点的圆才用新颜色。如果你想同时看到多个不同颜色的圆可以把圆的数据存进数组每次重绘整个画面。这里涉及到的“重绘整个场景”的思路是做绘图软件、小游戏的基本功你不仅要处理当前帧的输入还要有能力把之前所有元素重新画出来。鼠标消息里的msg.x和msg.y就是窗口客户区内的坐标直接传给绘图函数即可。不需要额外的偏移计算这点挺方便。8. 新手最常见的问题清单照着这六条排查8.1 坑一编译报错“无法打开包括文件 graphics.h”这不是 EGE 的问题而是头文件路径没配好。检查项目属性 - VC 目录 - 包含目录确认是否指向了 EGE 解压后的 include 文件夹。注意Visual Studio 的属性配置有“调试”和“发布”两个配置还有“Win32”和“x64”两个平台你改了 Debug 下的路径不代表 Release 下也有了。最省事的做法是左上角配置切到“所有配置”、“所有平台”一次性改完。8.2 坑二窗口一闪而过根本看不到绘图结果看代码里有没有getch()。没有的话程序创建窗口、画图、关闭窗口三步一气呵成你肉眼根本来不及看。加上getch()之后程序会停在那一行等你按键再继续。如果你已经加了getch()还是闪退那就要看编译输出窗口里的错误信息大概率是前面提到的链接库没有配置。8.3 坑三画出来的圆是椭圆或者矩形比例不对正常情况下EGE 的坐标单位是像素而像素本身是正方形的在常规 DPI 下所以 100x100 的矩形看起来就是正方形。如果你的画面整体被拉宽或拉扁最常见的原因是系统的 DPI 缩放设置。Windows 在高分屏上默认做了缩放而 EGE 的窗口不一定能正确适配导致绘图坐标和物理像素不一致。解决办法是在程序入口调用SetProcessDPIAware();这个函数来自windows.h作用是告诉系统“这个程序自己处理 DPI 缩放”避免系统强制拉伸画面。如果你的窗口确实变形这个函数基本能解决。某些高分屏环境下还需要在项目属性的清单文件里声明 DPI 感知但那是更复杂的话题入门阶段知道SetProcessDPIAware就够用了。8.4 坑四fillcircle 没有填充色只有边框这是setcolor和setfillcolor没分清的表现。fillcircle的边框颜色来自setcolor内部填充色来自setfillcolor。如果你只调用了setcolor填充色会保留上一次的状态可能和背景色相同看起来就是“没填充”。排查方法很简单画填充图形之前把两行代码一起写上setcolor(EGERGB(...)); setfillcolor(EGERGB(...));不要只写一个。这个习惯能让你少踩很多坑。8.5 坑五RGB 宏和 windows.h 冲突EGE 自己提供了颜色宏但如果你同时包含了windows.h某些情况下RGB宏会和 EGE 的环境产生冲突造成编译错误。解决办法是尽量使用EGERGB而不是RGB或者在包含windows.h之前先包含graphics.h。如果你必须用 Windows API写代码时注意颜色相关的部分统一用EGERGB。8.6 坑六Debug/Release、x86/x64 库不匹配这个前面已经提过但值得再强调一次。链接库选错是“无法解析的外部符号”错误的最常见原因。检查你的项目平台是 x64 还是 Win32检查解决方案配置是 Debug 还是 Release然后去库目录里找对应的文件填到附加依赖项里。如果还是不行在 VS 的“输出”窗口里看链接错误的具体符号对照 EGE 头文件里声明的函数名基本都能定位到是库的问题。说实话EGE 这套 API 学会不难难的是把坐标系、颜色、刷新、交互这几条线串起来形成“看到一个需求能在脑子里把它拆成绘图指令”的能力。我见过很多同学照着教程抄代码抄得飞起但一旦让他自己从零画一个对称图形就卡住了。原因是少了在纸上演算坐标这一步。所以我给你的建议很简单每次动手写绘图代码之前先画一张草图把关键点的坐标标出来把颜色逻辑理清楚再开始写。这个过程看起来慢实际是走得最快的路。下一篇我会讲文字输出与图片加载等这些基础都打好你就可以去挑战贪吃蛇、飞机大战这类小游戏了。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻