客户端GUI程序开发漫谈
这篇文章包含了这个领域的很多开源项目的介绍,还有我多年来的心血和汗水
后来还用QT做了流程设计器
说实在的,QT确实挺强大的,
如果你有一个项目,需要跨平台GUI开发,你又有一个C++团队的话,
那么做技术选型的时候,可以负责任的说,QT是不二之选
这时可能有人会提到GTK+,
我想说的是GTK+对windows平台的支撑力度实在是少的可怜
linux的版本已经到了3.16了,windows的版本才到3.6,整整差10个版本(我这里说的是GTK3)
而且大部分常见的控件在windows上都没有
来看看我在一个开源项目上踩的坑吧。
当然还有人可能提到wxWidgets,这玩意儿我没有深入研究过
只知道它是在原生图形API上再做的包装,想想windows API搞出来的窗口有多古板,还是算了。
类似的还有iup,跟wxWidgets的原理是一样的。
还有人直接用游戏库做GUI程序的,比如nimx和nanovg
nimx是基于SDL2图形引擎搞出来的GUI框架
我在nimx上踩到两个坑,其中一个提交pull request给作者,作者也认了
第二个坑就直接把我坑死了。
nanovg是基于OpenGL图形引擎搞出来的GUI框架。
这个项目还是in progress状态。
总之,这两个项目都不能用于生产。
(我本想说,国内轮子兄...,但貌似他也已经肉身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完成(这是最大的优势,你可以用所有与之相关的库)
所有与界面渲染相关的事情交给浏览器内核完成,
所有与系统相关的事情你自己完成
这项技术在移动端用的挺好的,
如果你要做一个移动端的项目,又打算走混合开发这条路的话,
我强烈推荐dcloud的mui,真的很不错,
appcan很早之前了解过一点,貌似是收费的
PC端的混合开发就不那么火了,
但有很多大厂偷偷也在用这个技术,比如:鹅厂
如果你要做PC端的混合开发,
你有三条路可以走,
封装IE浏览器的内核、
封装谷歌浏览器的内核、
封装Webkit浏览器的内核、
如果你要选用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的话,
那么你可以考虑使用cefglue、cefsharp、chromiumfx
这三个项目我都用过,目前的状况来看,我推荐最后一个
你如果是一个JS开发人员的话,
有我nodejs的庇佑,你完全不用care CEF这种东西
你可以直接选用nw.js
这个东西,我也用过,
除了nodejs带来的那些缺点,
他几乎是完美的,非常不错,推荐使用
还想再多说一些,但忽然发现,篇幅已经太长了,借曹雪芹的一首诗止笔:
满纸荒唐言!一把辛酸泪!一把辛酸泪!一把辛酸泪!.......
客户端GUI程序开发漫谈的更多相关文章
- GUI程序开发的流程(随时删除的源码)
1.继承JFrame 2.定义需要的组件 3.创建组件 4.设置布局管理器 5.添加组件 6.显示窗体 --------------------------------------------- 小代 ...
- linux GUI程序开发
1,C++ OOP中 class与C 面向过程开发中struct非常相似
- 第2课 GUI程序实例分析
1. GUI程序开发概述 (1)现代操作系统提供原生SDK支持GUI程序开发 (2)GUI程序开发是现代操作系统上的主流技术 (3)不同操作系统上的GUI开发原理相同 (4)不同操作系统上的GUI S ...
- GUI程序分析实例
GUI程序开发概述 GUI程序开发原理 GetMessage(&msg)将消息队列中的消息取出来,在循环中进行处理. GUI程序开发的本质
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)
本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(1:概述)
本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- QT +go 开发 GUI程序
,转载 https://blog.csdn.net/lanbery/article/details/81745611 如果你是一个墨守成规的coding,请移步其他内容,这部分内容可能不适合你.如 ...
- 笔记: c开发gui程序 (WM_CREATE, WS_CLIPCHILDREN , SetWindowPos)
过去两年,用c写的gui程序我一般使用的套路是: 在 winMain()中, 先创建一个主窗口, 紧接着就是在下面创建子窗口(子控件). 可能是因为写这方面的程序较少,所以也没遇到什么大问题,之前就是 ...
- 嵌入式系统WinCE下应用程序GUI界面开发【转】
嵌入式系统WinCE下应用程序GUI界面开发 ByToradex 秦海 本文旨在介绍嵌入式系统在Wince下进行GUI应用程序开发可以选择的不同GUI开发框架(Framework),目前最常用的几种方 ...
随机推荐
- 证书过期-->app审核提示90034证书错误
1.证书过期问题,去钥匙串中删除过期证书,然后新下载一个证书,重新添加,注:一定要把所有过期证书全部删除,如果不显示则点击钥匙串-->显示过期证书 然后下载新证书:https://develop ...
- AC算法 及python实现
零 导言 软件安全课上,老师讲了AC算法,写个博客,记一下吧. 那么AC算法是干啥的呢? ——是为了解决多模式匹配问题.换句话说,就是在大字符串S中,看看小字符串s1, s2,...有没有出现. AC ...
- Entity Framework 6, database-first with Oracle
Entity Framework 6, database-first with Oracle 转载自http://csharp.today/entity-framework-6-database-fi ...
- git 命令大全
git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...
- Codeforces Round #347 (Div. 2) (练习)
A: 题意:找到[a, b]的最大公约数: 思路:相同时为本身,不同时为1. 套路:碰到水题别想太多: 猜想:两个相邻数,必有一奇一偶,如果偶数有因子3或者其他,奇数可不可能有相同的呢? 枚举一些数后 ...
- Block循环引用问题研究
自从苹果在objc中添加Block功能支持以后已经过了很久.目前网上对于Block的使用有很多介绍.不过对于Block的内存管理问题,则是众说纷纭.再加上objc开始使用ARC以后,对于Block的内 ...
- springboot使用之三:springboot使用logback日志
springboot 默认使用的日志就是logback,所以使用logback不需要添加日志相关依赖了,执行 添加logback.xml配置文件,springboot这个聪明的框架便能识处理你的配置. ...
- 通过json数据进行传递调用
最近在弄andriod的程序,需要调用web服务器上的数据,服务采用C#写的,并部署在iis服务器上.我们可以像.NET那样调用服务那,利用andriod库自带的HttpPost和HttpGet类来调 ...
- CSS3使用AnimationEnd为同一个元素添加多个动画效果
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name ...
- jboss hello world
http://developers.redhat.com/products/devstudio/get-started/ 1. 下载 Red Hat JBoss Developer studio 2. ...