客户端GUI程序开发漫谈

时间:2022-05-18 22:22:31

这篇文章包含了这个领域的很多开源项目的介绍,还有我多年来的心血和汗水

 去年夏天的时候,我用QT做了一个小工具

后来还用QT做了流程设计器

我把程序分享给飞扬青云之后,他甚至搞出来一套QT的皮肤

说实在的,QT确实挺强大的,

如果你有一个项目,需要跨平台GUI开发,你又有一个C++团队的话,

那么做技术选型的时候,可以负责任的说,QT是不二之选

 

这时可能有人会提到GTK+

我想说的是GTK+对windows平台的支撑力度实在是少的可怜

linux的版本已经到了3.16了,windows的版本才到3.6,整整差10个版本(我这里说的是GTK3)

而且大部分常见的控件在windows上都没有

来看看我在一个开源项目上踩的坑吧。

 

当然还有人可能提到wxWidgets,这玩意儿我没有深入研究过

只知道它是在原生图形API上再做的包装,想想windows API搞出来的窗口有多古板,还是算了。

类似的还有iup,跟wxWidgets的原理是一样的。

 

还有人直接用游戏库做GUI程序的,比如nimxnanovg

nimx是基于SDL2图形引擎搞出来的GUI框架

我在nimx上踩到两个坑,其中一个提交pull request给作者,作者也认了

第二个坑就直接把我坑死了。

nanovg是基于OpenGL图形引擎搞出来的GUI框架。

这个项目还是in progress状态。

总之,这两个项目都不能用于生产。

 

说到这里不得不说*兄搞的gacui

(我本想说,国内*兄...,但貌似他也已经肉身FQ了,再提国内也不对了)

这个项目我了解的不多,只在14年春天的时候,搭过环境,写过hello world

前段时间学习nim语言,兴致勃勃跑到github问作者要dll,打算用nim做个包装

后来才知道,作者是不会提供了,好遗憾。

gacui的原理我不太清楚,只知道有GPU加速。

 

当然还有基于Direcut UI发展而来的duilib

这个库也是国内一位朋友搞出来的

据说很多大厂的客户端都在用这个开源库

duilib应该是受这个项目的启发才建成的

国内很著名的一个收费UI库UI Power也是基于这个思路搞出来的

 

在国内开发GUI应用程序,更多的还是给windows平台下的用户用

如果你想最大*度的定制你的界面,又不想让你的程序的发型版看起来太大

那么duilib是个不错的选择,但duilib文档太少(作者自己也这么说),你要做足这方面的准备

好在是开源的,你C++够牛的话,也不用担心

 

当然如果你希望有完善的文档来给你提供帮助的话,

那么你可以选择Qt,毕竟是国外大厂商,源码、IDE、文档、社区都很齐全

这里不得不提一下国内的qtcn社区,挺不错的,里面有不少这个领域的专家,而且都挺热情的

 

但是Qt的依赖库库实在太多,你开发好的程序怎么着也得有个十几兆,才能分发给别人。

而且我相信你肯定会用到process explorer或者dependencywalker之类的工具来查找你的程序到底依赖了哪些dll

好吧,如果你足够厉害、有一台性能超赞的电脑、有一两个小时的时间,你可以尝试静态编译QT

 

如果你开发的GUI程序只给windows平台下的用户用

那么最最基本的三个选择:windows api、MFC、WTL

用windows api做GUI程序,比较辛苦,因为它就是一系列的API,所有的事情都得你自己来做

MFC是一套非常庞大的类库,他里面包含了一系列的C++的机制,用起来非常繁琐

WTL比MFC简单,比windows api易用,但资料很少

你如果要走WTL这条路,那么你一定会看《深入解析ATL》这本书(友情提醒,这本书最新版翻译的实在太烂了)

 

好,再来说用混合开发技术做GUI程序

这种技术方式的主要原理就是:

你写代码包住浏览器内核,

界面代码用HTML/CSS/JS完成(这是最大的优势,你可以用所有与之相关的库)

所有与界面渲染相关的事情交给浏览器内核完成,

所有与系统相关的事情你自己完成

 

这项技术在移动端用的挺好的,

比如说国外的:phonegapcordova

还有国内的:muiappcan

如果你要做一个移动端的项目,又打算走混合开发这条路的话,

我强烈推荐dcloud的mui,真的很不错,

appcan很早之前了解过一点,貌似是收费的

 

PC端的混合开发就不那么火了,

但有很多大厂偷偷也在用这个技术,比如:鹅厂

如果你要做PC端的混合开发,

你有三条路可以走,

封装IE浏览器的内核、

封装谷歌浏览器的内核

封装Webkit浏览器的内核

封装firefox浏览器的内核

 

如果你要选用IE浏览器的内核,

那么你就不可能考虑跨平台的事情了,

而且,因为你的用户可能使用了不同的windows操作系统

所以你要做好客户端IE浏览器版本不一致的准备

IE6\7\8\9\10\11...

到IE9才可以称得上现代化的浏览器,市面上很多前端库,也只兼容到IE9

用IE内核来做这个事情的好处是:

你不用把浏览器的一堆DLL,分发给你的客户,这是其他三个方案所不能比的。

 

webkit和firefox真是挺尴尬的

性能表现没有谷歌浏览器好

平台支撑没有IE浏览器好

我对firefox浏览器的Gecko内核几乎没有什么研究

(之前做浏览器插件的时候看过他的API,现在几乎都忘记了)

Qt在去年之前还只有对webkit的封装

我曾经在前年,把webkit和extjs整合起来,做了一个库

大家可以研究一下,但请不要用于生产,我已经不再维护这个库了

国外也有人用.net封装过webkit,但作者在10年左右,就不再维护这个项目了

 

终于说到谷歌浏览器的内核:chromium

我实在是不建议直接研究它

你可以看看CEF这个项目

这个项目是用C++对chromium做的包装

之前不支持中文输入法的光标跟随,现在也已经被fix掉了

如果你是C#开发人员,也想用CEF的话,

那么你可以考虑使用cefgluecefsharpchromiumfx

这三个项目我都用过,目前的状况来看,我推荐最后一个

我曾经写过一系列的文章来介绍这个东西

你如果是一个JS开发人员的话,

有我nodejs的庇佑,你完全不用care   CEF这种东西

你可以直接选用nw.js

这个东西,我也用过,

除了nodejs带来的那些缺点,

他几乎是完美的,非常不错,推荐使用

 

还想再多说一些,但忽然发现,篇幅已经太长了,借曹雪芹的一首诗止笔:

满纸荒唐言!一把辛酸泪!一把辛酸泪!一把辛酸泪!.......