C/C++ 图形化界面编程入门:EasyX 完全指南

引言

在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位整数 表示,格式为 ARGBRGB

预定义颜色常量:

常量 说明 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做更多有趣的事情:

  • 贪吃蛇、俄罗斯方块等小游戏

  • 数据可视化图表

  • 简单的绘图工具

  • 学生成绩管理系统(图形化版)

学习建议:

  1. 从简单的绘图开始,熟悉坐标系和颜色

  2. 尝试加载图片和播放音乐

  3. 加入鼠标键盘交互,制作可操作的程序

  4. 综合运用所学知识,完成一个小项目

相关推荐
Aurorar0rua2 小时前
CS50 x 2024 Notes C - 08
c语言·开发语言·学习方法
jimy12 小时前
记第一次运行codex
c语言·ai编程
会编程的土豆16 小时前
由c/c++速通go语言,新手必看
c语言·c++·golang
无限进步_17 小时前
C++ 多态机制完全解析:从虚函数重写到动态绑定原理
java·c语言·jvm·数据结构·c++·windows·后端
爱编码的小八嘎19 小时前
C语言完美演绎9-13
c语言
爱编码的小八嘎19 小时前
C语言完美演绎9-19
c语言
shada19 小时前
mini-dog-c编译器开发 - 04 递归下降解析器
c语言·编译器
无限进步_20 小时前
二叉搜索树完全解析:从概念到实现与应用场景
c语言·开发语言·数据结构·c++·算法·github·visual studio
顾鉴行思21 小时前
10 字符串常量到底存在哪里?
c语言·汇编·经验分享