【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
easyx其实很早的时候就知道,但是应用的不多。这里的应用,是指用于项目的机会不多。最多也就是学一些demo,编译练习一下。这一次因为项目的缘故,第一次系统学习和应用了easyx图形库,感觉还是完全不一样的。就是一个lib,从demo到产品原型,至少说,它是可行的,开发是高效的,有自己特定的应用场景。当然,不仅仅是easyx,其他的图形库和gui库也值得我们看看、了解了解。
1、gdi和gdi plus
本身windows自带的图形库,称之为gdi,或者甚至有gdi plus。这些gdi的代码就是大家在创建win32程序的时候,看到的那些代码。所以,即使不用easyx,也可以用gdi这样的库进行2d图形绘制的。之所以不用,或者直接用的少,主要还是用起来比较麻烦。因为为了学习、用上gdi和gdi plus,可能得被逼学一些无关紧要的东西。这方面,easyx容易得不是一星半点,并且easyx也是基于gdi/gdi plus开发的,也只做windows平台,接口还是老式Borland BGI接口。
https://easyx.cn/
2、ege库
本身easyx和ege都是模拟了graphics.h里面的接口。所以,两者从功能上是差不多。但是easyx目前是闭源的,ege是开源的。从这一点上来说,可能作者有自己的考虑吧。
https://xege.org/
3、sdl2库
sdl本身也是非常优秀的一款跨平台开源库。大家如果了解ffmpeg,就知道很多人用它和sdl来做音视频开发,不然用纯命令行来进行操作音视频还是太单调了。sdl本身除了支持图形库,还支持键盘、鼠标、音频输出、多线程处理,如果不是特别重的人机交互要求,sdl开发还是非常合适的。
https://www.libsdl.org/
4、opengl+glfw
opengl本身是用来开发3d程序的接口,但是用opengl来开发2d程序也是可以的。不过光opengl不行,一般还需要一个第三方库负责窗口绘制、键盘和鼠标响应的工作。之前这个工作是glut完成的比较多,大家搜到的一些opengl demo也是glut接口的,现在叫glfw。所以现在如果用opengl开发图形界面程序,需要glfw+opengl一起组合,才能跑起来。当然除了图形之外的其他内容就别想了,比如音频、网络等等,就要自己想办法了。opengl一般os默认安装,下载glfw即可。
https://www.glfw.org/
5、c# wpf
在工控领域,c# wpf用的比较多。主要是wpf比较直观,比较方便,招人容易,不需要很多时间来学习,就可以掌握wpf的开发。而且wpf本身就是完整的gui开发平台,所以用c# wpf当成图形库开发也是手到擒来。c# wpf集成在vs里面,安装的时候选上即可。
6、qt平台
最著名的gui平台肯定是qt。qt不仅是功能丰富,而且跨平台,所以windows可以用,linux可以用。电脑可以用,嵌入式设备也可以用。既然功能丰富,那么缺点就是整体略显臃肿,不太适合快速开发的demo。当然如果是开发专业的界面,还是非常合适的。
https://www.qt.io/
7、总结
图形库本来就是想开发简单一点,有一个图形、图像的绘制,有一个鼠标、键盘的消息处理,把流程、仿真思路、算法、游戏原型短时间做出来,这就可以了。这就是图形库的由来。而且最早的pc,尤其是没有鼠标之前,基本就是基于各种图形库的开发,尤其是我们今天看到的graphics.h这种开发。只是后来随着gui的流行,图形库不仅仅可以画图,还有各种形式的gui控件,大家的注意力全部迁移到控件上面去了,忘记了图形库开发的实质是什么。当然随之而来的,就是学习曲线的提升。
所以,如果有一些简单的客户需求,只需要某种特定的功能,直接利用graphics.h的图形库开发也是非常合适的。本身第三方库已经帮我们把后面的gui细节给屏蔽了,所见即所得,效率非常高。至此,所有图形库的讨论告一段落,大家多提宝贵意见。
注:
知识就像浩瀚的宇宙,懂得越多,越觉得自己的渺小。最后给出一个小easyx demo,模仿一下流星,供大家一乐,
// 编译环境:Visual C++ 6.0~2022,EasyX_25.9.10
// 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;
}