如何用 C++ 从零编写 GUI?
其实可以使用QT,可以说是最常用的C++来编写GUI的。
QT
其实我觉得QT的惯用的教材是“C++ QT 编程”,基本上可以从网上下载一些电子版的来看,这样你可以自己学习,如果搜不到可以试试英文名。英文名是 “C++ GUI programming with Qt 4”,其实里面是有非常详细的讲解,让你可以从入门开始输出一个框,然后慢慢的到可以用layer来编写一个复杂的图形界面。我个人觉得哪怕你是一个新手,只要知道C++的知识,都是可以做到的。
实现GUI
其实如果你要是想实现GUI来说,只要是可以解决Windows问题就好了,基本上可以是小一点的,实用一些的程序就可以了,根本不需要去最求过高的追求。
比如说图形系统,因为是GUI库,所以不能用GDI函数往HDC上绘制,所以说可以用Update Layered Window来更新到窗口上,这样就可以有那种半透明异形窗口图形效果。
总结
其实我个人觉得自己写还是很麻烦的,用第三方的话,2D的图形库就没有小的了,那么光图形库就会突破500KB的限制了。
所以其实有很多的方法,并且也没有那么的困难的,主要还是要看你自己的需求到底是怎样的吧,这样可以根据你自己的需求开调节你的操作手法的。
GUI库可以很大,大的可以QT WPF,数千万行代码,小的可以WTL这仅有的几个头文件。
对于一般人来说,不要期望能够制作一个大型GUI库,编写一个较小的GUI库,满足您的需求,并对某种应用程序有好处。
我曾经遇到过一个需要一个小GUI库来编写安装程序的需求。
安装程序非常特别。对于下载并安装在因特网上的软件,应满足以下要求。
1。不能带dll,必须是静态链接,对系统的依赖性越低。
2。可执行代码必须足够小,一般最好是约500kbp。
三.有良好的图形效果,如通过动画的安装过程中,窗口应该有一个半透明的影子环。
显然,用qt写是不合适的。虽然我知道很多次,Qt库不是很大,但它仍然是一个小大的写作和安装程序,和QT的静态链接exe是2MB。
MFC是不适合的,MFC静态链接了400KB左右,安装程序本身代码和资源必将突破主机。
用vc++ 6 MFC写的要小得多,但它不适合我的口味。
用WTL,这必须非常小,程序静态链接只创建一个只有约35kb的窗口,但是什么功能都没有啊,只能使用标准的诚信基础创建,透明窗口,他和其他的API。
或者写一个,有点实用,它是用来做安装程序的,不追求高的能力。
跨平台不追求,只解决windows问题。
为了实现gui库,有几个基本子系统:
1。窗口管理系统,代码API包,但这个工作很无聊,很麻烦,我只是意识到自己的窗口类WTL,WTL CWindow聚合,用WTL做帮助我创建窗口管理,对外不见WTL,因为我没有使用派生的不想让我的WTL污染接口设计。
2。事件系统,WTL消息映射是如此的丑陋,我爱QT的信号和槽,但QT像信号/槽的实现是不容易的,一个C++的扩展语法等效,而且自己实现一个MOC预处理,工作量太大。使用Boost:信号也太麻烦了。Boost将引入一个大型依赖库。我也希望GUI库可以用默认的vc++编译,不想依赖太多的库,Boost函数会带来编译困难。
我需要一个小的GUI库来编写安装程序。
GUI库可以是小的,大的可以是有数百万行代码的Qt WPF,小的可以是WTL,只有几个头文件。
对于一般人来说,不要期望创建一个大型的GUI库,编写一个较小的库,满足自己的需要,并应用于某种应用程序。
安装过程很特别。对于安装在互联网上的软件,请满足以下要求:
1.没有dll可以被带来。必须使用静态链接,系统的依赖关系会更好。
2.可执行代码必须足够小,一般可以达到500KB。
3.有更好的图形效果,例如安装过程的超运行动画,窗口应该有一个半透明的阴影圈或其他东西。
用Qt来写是不合适的,虽然我已经说过很多次Qt库不是很好,但是对于安装程序来说确实有点大,Qt的静态链接大约是2MB。
4.MFC是不合适的,MFC静态链接大约是400KB,安装程序自己的代码和资源必须超过500KB。
用vc++ 6.0 MFC写,可以小得多,但使用这种古董与我的品味不一致。
在WTL中编写,这当然是非常小的,只创建一个程序静态链接的窗口只有50kb左右,但我不知道什么功能,只能用标准的孔片来创建,一个透明的窗口都想自己使用其他api。
让我写一点,更实用一点,只是为了安装程序,而不是为了高的能力。
跨平台没有追求,只是解决了Windows的问题。
实现一个GUI库有几个基本的子系统:
窗口管理系统,代码封装Windows API,但是这个工作很无聊,而且很麻烦,我只是使用WTL实现,自己的窗口类CWindow聚合WTL,WTL端帮我创建窗口管理和外国WTL是看不见的,我没有使用派生的,因为我不希望WTL污染的界面设计。
所以开发大工程还是推荐用Qt。