引言
在C/C++编程学习中,我们通常接触的是控制台程序------黑底白字的命令行界面。虽然控制台程序功能强大,但界面单调、用户体验较差。那么,能否用C/C++编写带有图形界面的程序呢?
答案是肯定的!我们可以使用图形库 来实现图形化界面。对于Windows平台,EasyX 是一个非常适合初学者的图形库。它封装了Windows底层绘图API,提供了简单易用的接口。
今天,我将通过一个完整的项目案例,全面讲解EasyX图形库的使用方法。
第一部分:EasyX 简介与环境配置
一、什么是EasyX?
EasyX是一个轻量级的C++图形库,专门为Windows平台设计,常用于:
-
教学演示
-
小型游戏开发
-
图形化小程序
特点:
-
语法简单,易于上手
-
封装了Windows GDI,无需深入理解底层
-
支持图片、音乐、鼠标键盘交互
二、环境配置
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 搜索"EasyX"官网 | 访问 easyx.cn |
| 2 | 下载安装包 | 选择对应VS版本 |
| 3 | 运行安装程序 | 自动配置头文件和库文件 |
注意事项:
-
EasyX仅支持Windows平台
-
需要Visual Studio开发环境
-
安装后会自动添加
#include <easyx.h>路径
cpp
#include <easyx.h> // 新版推荐
// #include <graphics.h> // 旧版,部分函数名称不同
#pragma comment(lib, "winmm.lib") // 多媒体库(用于播放音乐)
第二部分:窗口创建与基本绘图
一、创建窗口
cpp
#include <easyx.h>
#include <stdio.h>
int main() {
// 创建窗口:宽度680,高度906,样式标志位
initgraph(680, 906);
// 程序运行期间保持窗口
while (1); // 或使用 getchar() / system("pause")
// 关闭图形窗口
closegraph();
return 0;
}
initgraph 参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| 第1个 | int | 窗口宽度(像素) |
| 第2个 | int | 窗口高度(像素) |
| 第3个 | int | 样式标志位(200表示无边框等,通常可省略) |
二、坐标系与坐标
EasyX的坐标系原点在窗口左上角:

示例:
- 点(100, 50):距离左边100像素,距离顶部50像素
三、颜色系统
EasyX中的颜色使用32位整数 表示,格式为 ARGB 或 RGB。

预定义颜色常量:
| 常量 | 说明 | RGB值 |
|---|---|---|
RED |
红色 | RGB(255,0,0) |
GREEN |
绿色 | RGB(0,255,0) |
BLUE |
蓝色 | RGB(0,0,255) |
YELLOW |
黄色 | RGB(255,255,0) |
WHITE |
白色 | RGB(255,255,255) |
BLACK |
黑色 | RGB(0,0,0) |
自定义颜色:
cpp
// RGB方式
COLORREF myColor = RGB(0, 238, 60); // 自定义绿色
// 设置画笔颜色
setcolor(myColor);
第三部分:图形绘制
一、基本图形绘制函数
| 函数 | 功能 | 示例 |
|---|---|---|
circle(x, y, r) |
画圆 | circle(100, 100, 50) |
rectangle(x1, y1, x2, y2) |
画矩形 | rectangle(50, 50, 200, 100) |
line(x1, y1, x2, y2) |
画直线 | line(0, 0, 100, 100) |
fillcircle(x, y, r) |
填充圆 | fillcircle(100, 100, 50) |
fillrectangle(x1, y1, x2, y2) |
填充矩形 | fillrectangle(50, 50, 200, 100) |
二、填充颜色设置
cpp
// 设置填充颜色
setfillcolor(GREEN);
fillcircle(100, 100, 50);
// 设置无填充
setfillcolor(0);
三、完整绘图示例
cpp
#include <easyx.h>
int main() {
// 创建窗口
initgraph(800, 600);
// 设置背景颜色
setbkcolor(WHITE);
cleardevice(); // 用背景色清屏
// 画红色填充圆
setfillcolor(RED);
fillcircle(200, 200, 80);
// 画蓝色矩形
setfillcolor(BLUE);
fillrectangle(400, 150, 550, 250);
// 画绿色线条
setcolor(GREEN);
line(0, 0, 800, 600);
// 等待用户按键
system("pause");
closegraph();
return 0;
}
第四部分:文字输出
一、设置文字样式
cpp
#include <easyx.h>
int main() {
initgraph(800, 600);
// 设置文字颜色
settextcolor(RGB(51, 211, 216));
// 设置文字样式
// 参数:字号, 字体宽度(0为自适应), 字体名称
settextstyle(72, 0, "华文彩云");
// 输出文字:参数(x, y, 字符串)
outtextxy(200, 150, "你好,EasyX!");
// 也可以使用标准输出
settextstyle(36, 0, "微软雅黑");
char str[100] = "Hello World!";
outtextxy(200, 250, str);
system("pause");
closegraph();
return 0;
}
二、字体支持
EasyX支持Windows系统中安装的任何字体:
-
中文:
"华文彩云"、"微软雅黑"、"宋体" -
英文:
"Arial"、"Consolas"、"Times New Roman"
第五部分:图片处理
一、图片加载与显示
EasyX使用IMAGE对象来存储图片。
cpp
#include <easyx.h>
int main() {
initgraph(800, 600);
// 1. 定义IMAGE对象
IMAGE img;
// 2. 从文件加载图片
loadimage(&img, "background.jpg");
// 3. 在指定位置显示图片
putimage(0, 0, &img);
system("pause");
closegraph();
return 0;
}
二、图片格式支持
EasyX支持以下图片格式:
-
.jpg/.jpeg -
.png(支持透明通道) -
.bmp -
.gif(仅第一帧)
三、图片透明绘制技巧
cpp
// 方法1:使用png图片(自带透明通道)
loadimage(&img, "character.png"); // 透明背景
putimage(100, 100, &img);
// 方法2:使用掩码图技术(复杂,需要两张图片配合)
// 此处不再展开
四、图片资源管理
注意事项:
-
图片文件放在工程目录下(.exe同级目录)
-
文件名不要包含空格
-
中文文件名可能有编码问题
第六部分:音乐播放
一、音乐播放基础
EasyX本身不支持音乐播放,需要使用Windows多媒体库winmm.lib。
cpp
#include <easyx.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
int main() {
// 1. 打开音乐文件
mciSendString("open bgm.mp3", NULL, 0, NULL);
// 2. 播放音乐
mciSendString("play bgm.mp3", NULL, 0, NULL);
// 3. 可选:循环播放
// mciSendString("play bgm.mp3 repeat", NULL, 0, NULL);
// 4. 暂停
// mciSendString("pause bgm.mp3", NULL, 0, NULL);
// 5. 继续播放
// mciSendString("resume bgm.mp3", NULL, 0, NULL);
// 6. 关闭文件
// mciSendString("close bgm.mp3", NULL, 0, NULL);
// 保持程序运行
getchar();
return 0;
}
二、mciSendString函数详解
cpp
// 函数原型
MCIERROR mciSendString(
LPCTSTR lpszCommand, // 命令字符串
LPTSTR lpszReturn, // 返回值缓冲区
UINT cchReturn, // 缓冲区大小
HANDLE hwndCallback // 回调窗口句柄
);
常用命令:
| 命令 | 格式 | 说明 |
|---|---|---|
| open | "open 文件名" |
打开文件 |
| play | "play 文件名" |
播放 |
| pause | "pause 文件名" |
暂停 |
| resume | "resume 文件名" |
继续播放 |
| stop | "stop 文件名" |
停止 |
| close | "close 文件名" |
关闭 |
三、音乐播放注意事项
| 问题 | 解决方案 |
|---|---|
| 全平台音乐加密 | 使用本地未加密的mp3文件 |
| 文件名有空格 | 用双引号包裹:"open \"my music.mp3\"" |
| 中文路径 | 使用英文字符串,或设置多字节字符集 |
| 播放器关联 | 将默认打开方式设为Windows Media Player |
第七部分:综合案例------简单的音乐播放器
cpp
#include <easyx.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
// 播放音乐
void playMusic(const char* filename) {
char cmd[256];
sprintf(cmd, "open %s", filename);
mciSendString(cmd, NULL, 0, NULL);
sprintf(cmd, "play %s", filename);
mciSendString(cmd, NULL, 0, NULL);
}
// 停止音乐
void stopMusic(const char* filename) {
char cmd[256];
sprintf(cmd, "stop %s", filename);
mciSendString(cmd, NULL, 0, NULL);
sprintf(cmd, "close %s", filename);
mciSendString(cmd, NULL, 0, NULL);
}
int main() {
// 创建窗口
initgraph(400, 300);
setbkcolor(WHITE);
cleardevice();
// 绘制界面
settextstyle(24, 0, "微软雅黑");
outtextxy(50, 50, "音乐播放器");
settextstyle(16, 0, "微软雅黑");
outtextxy(50, 120, "按 P 播放音乐");
outtextxy(50, 150, "按 S 停止音乐");
outtextxy(50, 180, "按 ESC 退出");
const char* musicFile = "bgm.mp3";
while (1) {
// 检测键盘输入
if (GetAsyncKeyState('P') & 0x8000) {
playMusic(musicFile);
outtextxy(200, 250, "播放中...");
}
if (GetAsyncKeyState('S') & 0x8000) {
stopMusic(musicFile);
outtextxy(200, 250, "已停止 ");
}
if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) {
break;
}
Sleep(100);
}
stopMusic(musicFile);
closegraph();
return 0;
}
第八部分:鼠标与键盘交互
一、键盘交互
| 函数 | 说明 |
|---|---|
GetAsyncKeyState(key) |
检测按键状态 |
_kbhit() |
检测是否有按键 |
cpp
// 检测按键
if (GetAsyncKeyState('A') & 0x8000) {
// 按下了 A 键
}
// 常用虚拟键码
VK_ESCAPE // ESC键
VK_SPACE // 空格键
VK_UP // 上箭头
VK_DOWN // 下箭头
VK_LEFT // 左箭头
VK_RIGHT // 右箭头
二、鼠标交互
| 函数 | 说明 |
|---|---|
GetMouseMsg() |
获取鼠标消息 |
MOUSEMSG |
鼠标消息结构体 |
cpp
#include <easyx.h>
int main() {
initgraph(800, 600);
while (1) {
MOUSEMSG msg = GetMouseMsg();
switch (msg.uMsg) {
case WM_LBUTTONDOWN:
printf("左键点击: (%d, %d)\n", msg.x, msg.y);
break;
case WM_RBUTTONDOWN:
printf("右键点击: (%d, %d)\n", msg.x, msg.y);
break;
case WM_MOUSEMOVE:
// 鼠标移动事件
break;
}
}
closegraph();
return 0;
}
第九部分:完整项目------猜数字游戏
cpp
#include <easyx.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
initgraph(500, 400);
setbkcolor(WHITE);
cleardevice();
// 设置字体
settextstyle(24, 0, "微软雅黑");
settextcolor(BLACK);
// 游戏初始化
srand(time(NULL));
int target = rand() % 100 + 1;
int guess = 0;
int attempts = 0;
char input[10] = "";
outtextxy(150, 50, "猜数字游戏");
outtextxy(100, 100, "我已经想好了一个1-100之间的数字");
outtextxy(100, 140, "请在下方输入你的猜测");
// 输入框
setfillcolor(RGB(240, 240, 240));
fillrectangle(100, 180, 400, 220);
setcolor(BLACK);
rectangle(100, 180, 400, 220);
InputBox(input, 10, "猜数字", "请输入你的猜测(1-100):", "50");
guess = atoi(input);
while (guess != target) {
attempts++;
// 清空提示区域
setfillcolor(WHITE);
setcolor(WHITE);
fillrectangle(100, 250, 450, 300);
setcolor(BLACK);
if (guess < target) {
outtextxy(100, 260, "太小了!再试试看:");
} else if (guess > target) {
outtextxy(100, 260, "太大了!再试试看:");
}
InputBox(input, 10, "猜数字", "请输入你的猜测(1-100):", "");
guess = atoi(input);
}
attempts++;
// 显示胜利信息
setfillcolor(WHITE);
fillrectangle(100, 250, 450, 350);
char result[100];
sprintf(result, "恭喜!你猜了 %d 次猜中了数字 %d!", attempts, target);
settextcolor(RGB(0, 150, 0));
outtextxy(50, 260, result);
outtextxy(150, 310, "按任意键退出...");
system("pause > nul");
closegraph();
return 0;
}
总结
一、EasyX 核心函数速查表
| 类别 | 函数 | 功能 |
|---|---|---|
| 窗口 | initgraph() |
创建图形窗口 |
closegraph() |
关闭图形窗口 | |
cleardevice() |
清屏 | |
| 绘图 | circle() / fillcircle() |
画圆/填充圆 |
rectangle() / fillrectangle() |
画矩形/填充矩形 | |
line() |
画直线 | |
| 颜色 | setcolor() |
设置画笔颜色 |
setfillcolor() |
设置填充颜色 | |
setbkcolor() |
设置背景颜色 | |
| 文字 | settextstyle() |
设置文字样式 |
settextcolor() |
设置文字颜色 | |
outtextxy() |
输出文字 | |
| 图片 | loadimage() |
加载图片 |
putimage() |
显示图片 | |
| 输入 | GetAsyncKeyState() |
检测按键 |
GetMouseMsg() |
获取鼠标消息 | |
| 音乐 | mciSendString() |
播放音乐 |
二、注意事项
| 项目 | 注意事项 |
|---|---|
| 窗口 | 使用while(1)保持窗口,否则程序立即退出 |
| 音乐 | 文件名不要有空格,路径不要有中文 |
| 图片 | 放到工程目录下 |
| 字体 | 使用系统已安装的字体名称 |
EasyX是一个非常适合C/C++初学者的图形库,它让我们能够快速创建图形化程序,而不必深入Windows API的复杂细节。
我们还可以用EasyX做更多有趣的事情:
-
贪吃蛇、俄罗斯方块等小游戏
-
数据可视化图表
-
简单的绘图工具
-
学生成绩管理系统(图形化版)
学习建议:
-
从简单的绘图开始,熟悉坐标系和颜色
-
尝试加载图片和播放音乐
-
加入鼠标键盘交互,制作可操作的程序
-
综合运用所学知识,完成一个小项目