有些学校直接拿 VC 来讲 C 语言,因为 VC 的编辑和调试环境都很优秀,并且 VC 有适合教学的免费版本。可惜在 VC 里面只能做一些文字性的练习题,想画条直线或一个圆都很难,例如需要注册窗口类、建消息循环等等,初学者会受严重打击的。初学编程想要绘图就得用 TC,很是无奈。有些学校以 Turbo C 为环境学习 C 语言,只是 Turbo C 实在太老了,复制粘贴都很不方便。
EasyX
EasyX Graphics Library 是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022,简单易用,学习成本极低,应用领域广泛。目前已有许多大学将 EasyX 应用在教学当中。
官网下载
https://easyx.cn/
安装
1.双击下载的 EasyX 安装包,在“Windows 已保护你的电脑”提示窗中,点“更多信息”,再点“仍要运行”,这时,可以看到 EasyX 的安装程序。
2.EasyX 安装程序会检测到当前操作系统中安装的 Visual Studio 版本。在对应的 VS 版本右侧点击“安装”即可。
安装程序为 7z 自解压缩包,不会在系统注册表中留下任何信息,请放心使用。
卸载时,同样需要执行安装程序,并点击对应的 VS 版本右侧的“卸载”即可。
超轻的发布过程
EasyX 采用静态编译,不依赖任何 dll,同传统程序的发布方式没有区别,程序不会因为引入 EasyX 而增添任何发布负担。
静态链接的 EasyX,会使编译后的 exe 体积增加 70KB 左右。对于绝大多数应用而言,增加的体积是可以忽略的。
若将 Visual C++ 的运行时库改为静态链接模式,编译后的 exe 可以单文件运行。
函数说明
EasyX 函数分为以下几类:
绘图设备相关函数
颜色模型
颜色及样式设置相关函数
绘制图形相关函数
文字输出相关函数
图像处理相关函数
消息处理相关函数
其它函数
graphics.h 暂留函数
示例程序
字符阵
// 编译环境:Visual C++ 6.0~2022,EasyX_2023大暑版
// https://easyx.cn
//
#include <graphics.h>
#include <time.h>
#include <conio.h>int main()
{// 设置随机种子srand((unsigned) time(NULL));// 初始化图形模式initgraph(640, 480);int x, y;char c;settextstyle(16, 8, _T("Courier")); // 设置字体// 设置颜色settextcolor(GREEN);setlinecolor(BLACK);for (int i = 0; i <= 479; i++){// 在随机位置显示三个随机字母for (int j = 0; j < 3; j++){x = (rand() % 80) * 8;y = (rand() % 20) * 24;c = (rand() % 26) + 65;outtextxy(x, y, c);}// 画线擦掉一个像素行line(0, i, 639, i);Sleep(10); // 延时if (i >= 479) i = -1;if (_kbhit()) break; // 按任意键退出}// 关闭图形模式closegraph();return 0;
}
星空
// 编译环境:Visual C++ 6.0~2022,EasyX_2023大暑版
// https://easyx.cn
//
#include <graphics.h>
#include <time.h>
#include <conio.h>#define MAXSTAR 200 // 星星总数struct STAR
{double x;int y;double step;int color;
};STAR star[MAXSTAR];// 初始化星星
void InitStar(int i)
{star[i].x = 0;star[i].y = rand() % 480;star[i].step = (rand() % 5000) / 1000.0 + 1;star[i].color = (int)(star[i].step * 255 / 6.0 + 0.5); // 速度越快,颜色越亮star[i].color = RGB(star[i].color, star[i].color, star[i].color);
}// 移动星星
void MoveStar(int i)
{// 擦掉原来的星星putpixel((int)star[i].x, star[i].y, 0);// 计算新位置star[i].x += star[i].step;if (star[i].x > 640) InitStar(i);// 画新星星putpixel((int)star[i].x, star[i].y, star[i].color);
}// 主函数
int main()
{srand((unsigned)time(NULL)); // 随机种子initgraph(640, 480); // 创建绘图窗口// 初始化所有星星for(int i = 0; i < MAXSTAR; i++){InitStar(i);star[i].x = rand() % 640;}// 绘制星空,按任意键退出while(!_kbhit()){for(int i = 0; i < MAXSTAR; i++)MoveStar(i);Sleep(20);}closegraph(); // 关闭绘图窗口return 0;
}
鼠标操作
// 编译环境:Visual C++ 6.0~2022,EasyX_2023大暑版
// https://easyx.cn
//
#include <graphics.h>int main()
{// 初始化图形窗口initgraph(640, 480);ExMessage m; // 定义消息变量while(true){// 获取一条鼠标或按键消息m = getmessage(EX_MOUSE | EX_KEY);switch(m.message){case WM_MOUSEMOVE:// 鼠标移动的时候画红色的小点putpixel(m.x, m.y, RED);break;case WM_LBUTTONDOWN:// 如果点左键的同时按下了 Ctrl 键if (m.ctrl)// 画一个大方块rectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10);else// 画一个小方块rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5);break;case WM_KEYDOWN:if (m.vkcode == VK_ESCAPE)return 0; // 按 ESC 键退出程序}}// 关闭图形窗口closegraph();return 0;
}
彩虹
// 编译环境:Visual C++ 6.0~2022,EasyX_2023大暑版
// https://easyx.cn
//
#include <graphics.h>
#include <conio.h>int main()
{// 创建绘图窗口initgraph(640, 480);// 画渐变的天空(通过亮度逐渐增加)float H = 190; // 色相float S = 1; // 饱和度float L = 0.7f; // 亮度for(int y = 0; y < 480; y++){L += 0.0005f;setlinecolor( HSLtoRGB(H, S, L) );line(0, y, 639, y);}// 画彩虹(通过色相逐渐增加)H = 0;S = 1;L = 0.5f;setlinestyle(PS_SOLID, 2); // 设置线宽为 2for(int r = 400; r > 344; r--){H += 5;setlinecolor( HSLtoRGB(H, S, L) );circle(500, 480, r);}// 按任意键退出_getch();closegraph();return 0;
}
Easy Graphics Engine
EGE(Easy Graphics Engine),是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C++语言新手的图形库,它的目标也是为了替代TC的BGI库而存在。
它的使用方法与TC中的graphics.h相当接近,对新手来说,简单,友好,容易上手,免费开源,而且接口意义直观,即使是完全没有接触过图形编程的,也能迅速学会基本的绘图。
目前,EGE图形库已经完美支持VC6, VC2008, VC2010, VC2012, VC2013, VC2015, VC2017, VC2019, C-Free, DevCpp, Code::Blocks, wxDev, Eclipse for C/C++等IDE,即支持使用MSVC和MinGW为编译环境的IDE。如果你需要在VC下使用graphics.h,那么ege将会是很好的替代品。
官网
https://xege.org/
安装
①指定编译器的头文件搜索路径(或放置头文件到软件安装目录的include文件夹内)
②指定编译器的库文件搜索路径(或放置库文件到到软件安装目录的lib文件夹内)
③在开发环境中配置链接参数,链接相关的库(Visual Studio不需要)
示例代码
测试程序
#include <graphics.h> //包含EGE的头文件int main()
{initgraph(640, 480); //初始化图形界面setcolor(EGERGB(0xFF, 0x0, 0x0)); //设置绘画颜色为红色setbkcolor(WHITE); //设置背景颜色为白色circle(320, 240, 100); //画圆getch(); //暂停,等待键盘按键closegraph(); //关闭图形界面return 0;
}
使用鼠标绘制直线
#define SHOW_CONSOLE //显示控制台窗口#include <graphics.h>
#include <cstdio>int main()
{initgraph(640, 480);bool isDown = false;int startX, startY;int lastX, lastY;mouse_msg msg;int colorIndex = 0;for(; is_run(); ){msg = getmouse();switch (msg.msg){case mouse_msg_down:startX = msg.x;startY = msg.y;lastX = msg.x;lastY = msg.y;printf("mouse down: %d, %d\n", msg.x, msg.y);isDown = true;break;case mouse_msg_up://这里并没有什么卵用printf("mouse up: %d, %d\n", msg.x, msg.y);isDown = false;break;case mouse_msg_move:if(isDown){do{color_t color = hsv2rgb(colorIndex++ % 360, 1, 1); //使用hsv颜色轮换setcolor(color);line(startX, startY, msg.x, msg.y); //绘制当前点和按下的点line(lastX, lastY, msg.x, msg.y); //绘制当前点和上一个点lastX = msg.x;lastY = msg.y;printf("mouse moved to: %d, %d\n", msg.x, msg.y);msg = getmouse();}while(mousemsg() && msg.is_move());if(msg.is_up())isDown = false;}break;case mouse_msg_wheel:printf("mousewheel: %d\n", msg.wheel);break;default:printf("呵呵\n");break;}}closegraph();return 0;
}