其实可以使用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的限制了。
所以其实有很多的方法,并且也没有那么的困难的,主要还是要看你自己的需求到底是怎样的吧,这样可以根据你自己的需求开调节你的 *** 作手法的。
WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI
Framework也只能算是一次行为艺术,这个思路下继续发展就会变得没法用了,比如 代码过于复杂,编译太慢,出错不好调试等问题难以解决。
而且封装得也不完全,还是随处可见 HWND HDC之类的东西。
用途主要是写一些很小的程序,或者作为其他UI框架的后端实现部分,比如我写过一个小框架用来做安装卸载程序,非常小,其中创建管理窗口部分是用WTL的。
MFC
是更高级点的Win API封装,比WTL封装彻底,很难见到HWND
HDC了,也提供了不少实用工具类,比如高级控件,泛型容器,IO访问,网络协议等。除此之外,还提供了一些基本框架,比如
Document/View,这就是个MVC的简化版本,只有MV,但是对于数据的管理,消息的传递等又没有什么约束,导致Doc/View被用得乱七八
糟。尤其是对事件处理的模型,消息映射是功能简陋,而且容易出错的方式,唯一优点是性能好。 从VC++
1X就有MFC了,那时整个UI界的设计思想都比较落后(除了Apple),MFC又背负了沉重的兼容性包袱,比如vc++
152的MFC程序到了vc2003稍加修改都可以编译,导致MFC后期没有什么发展,就是沿着老的思路完善了些细节,添加了些组件,但是根本性的设计
问题没有改进。
GTK,这个吃了语言的亏,用C写面向对象实在是痛苦,虽然在思想上比MFC要先进了些,但是写出来的代码比MFC要罗嗦很多了。相比MFC,多了Layout的概念,事件处理上有了Signal/slot,虽然用起来很麻烦。
wxWidgets,
这个基本就是个跨平台的MFC,对各个平台的差异做了抽象,实际上后端大多还是用平台原生的API实现,好多控件都是直接用系统原生的。有
wxWidgets for
GTK+的版本,后端就是GTK+,wxWidgets就是一层壳。这也是wxWidgets的优点,它编译出来的程序发行包比较小,性能也不错。
以上这些就是上世纪90年代的UI Framework技术水平了,至今它们也依然没有太多进步。
下面来谈谈21世纪的技术。
Qt,
虽然它也是上世纪90年代出现的,但是它在21世纪有了长足的进步。应该说它的起点就比较高,一开始就定位跨平台,而且不满足于简单封装系统API,而是
要自己创造出一套完整的API和框架,甚至要代替系统API,所以不仅仅是做UI,而是涉及到了APP开发所用到的所有东西,包括网络,数据库,多媒体,
脚本引擎等。signal/slot是Qt发明的,这是事件通知模型里C++语言的最佳实现了,甚至我都觉得这该写进C++标准,估计C++委员会的老顽
固们是从不写GUI的。
早期的QT也是没有DirectUI的概念的,每一个QWidget都对应一个原生窗口,从Qt44开始,只有顶层
QWidget才是原生窗口,而Child Widget是Alien
Widget,只是个抽象的图层不对应原生窗口,这就实现了DirectUI的概念,很多图形效果也就变得可能了,比如窗口层叠透明效果。
在48后实现了QPA(Qt Platform Abstraction),这就使移植Qt变得很容易,目前Qt是支持平台最多的框架没有之一。
由于早期授权的问题,Qt对于开源社区不是很友好,导致推广不太顺利,直到它改成了LGPL方式,如果Qt能早点想开了,恐怕就没有wxWidgets的生存空间了。
Qt的缺点也是有的,就是太大,不过可以自己剪裁,我可以把QT库剪裁到发行包压缩后25MB。
WPF,
微软在Win
Form的思路上走到死胡同后,终于痛下决心用正确的方法开发UI库了。21世纪的UI一定是定义出来的,绝对不能是代码写出来的,所以有了XAML这个
强大的定义工具,不但可以定义UI布局,还包括图形动画效果,消息响应方式等。配合C#这种优秀的语言,更是如虎添翼。但是问题也很明显,就是过于庞大,
不仅开发时要用到庞大的IDE和设计工具,发行的安装包也十分巨大,所以目前还是很少有人拿他写通用软件客户端的,大多是做企业项目时写专用客户端。
大概4-5年前吧疼讯曾经用WPF写了个,但是只实现了基本功能就已经比C++客户端大好多了,而且运行缓慢,主要是太吃内存,而且那时WPF的优化还不充分。
最后我想补充下真正的UI库之王,cocoa。
Apple的成功有很多原因,其中之一就是cocoa,cocoa理念十分先进,而且出来得早,我都怀疑Qt和WPF有不少思想都是借鉴cocoa的。
定义式的UI,用xib就可以定义UI的绝大部分细节,而且提供所见即所得的可视化设计工具。
严格的MVC,而且定义非常清晰,分工明确。
signal/slot,虽然不叫这个名字,但思想就是,而且真的是拖动鼠标就能connect。
提供了ARC,闭包和反射,给UI开发带来巨大的便利性,当然这得益于Objective-C这个语言。
再补充下 Borland的OWL和VCL。
我是从Borland C++30和Delphi 10开始用的,那时的Borland看来很有前途的,可惜后来一系列决策失误导致现在这个公司几乎消失了,同学们不要再往这个坑里跳了。
OWL曾经和MFC是竞争对手,设计思想也差不多,个人感觉OWL的API设计更优雅一点,但是在市场上OWL被MFC彻底击败。
Delphi
是神作,它在RAD(快速应用开发)领域长时间没有对手,直到BS架构取代CS架构。Delphi的特点就是简单、开发快,单纯就写个基本可用的应用来
说,可能至今都没有比他更快的,但是缺点就是丑,基本大多数Delphi应用都是一大堆控件堆积在一起,很不美观,另外由于Pascal语言的限制无法和
现有大量的C/C++代码融合。虽然后来有C++
Builder,但是Builder里简单和快的优点也消失了。Borland的C++编译器越做越差,导致后来开源项目都不太愿意兼容这个编译器了。
VCL准确地说不是UI库,而是一套组件接口规范,类似COM ActiveX。delphi和C++builder都是基于这个规范构建了基础库。
UI库是个很大的话题,够写好几本书来探讨的,我这里就是随便写点自己的感受。
单纯讨论每个库的优劣是没有意义的,而是要放到具体的应用场景里来看,每个库都有自己擅长的场景。
如果仅在Windows下,追求程序小巧,用WTL,不足的地方自己实现去吧,但是视觉效果就呵呵了。
如果可以大一点,还要好看点,那就Qt。
如果完全不在乎大小,只要视觉效果华丽,就用WPF,如果把开发工具价格也考虑进来,那么土豪才会选WPF呢。
MFC就是个鸡肋了,除非你现有的工程师不会用别的,或者有历史遗留代码要保持兼容。
如果要求跨平台,那么就用Qt,wxWidgets和GTK+跟现在的Qt比起来没有什么优势了。
如果是iOS Android,那么最好用原生UI库,除非你写游戏。
不知不觉,C++迎来了自己20岁的生日。20年来,C++从一个实验室语言成长为软件产业一流主导语言,在实际应用中取得了巨大的成功,同时也催生了大量为技术人员耳熟能详的经典技术著作,比如Bjarne Stroustrup的《TC++PL》和《D&E》,Stan Lippman的《C++ Primer》,Scott Meyers的《Effective C++》,GoF的《Design Patterns》,Andy Koenig的《Ruminations on C++》,Herb Sutter的《Exceptional C++》,Andrei Alexandrescu的《Modern C++ Design》,Addison Wesley的“C++ in Depth”系列等。C++领域的一些经典图书不但对于C++语言的发展起到了巨大的推动作用,而且对于其他相关技术领域也起到了指导和促进作用。例如Scott Meyers的“Effective系列”,开辟了技术图书写作的新风格,而“Design Patterns”的影响,更是远远超出C++的范畴。这些经典的好书,已经成为C++辉煌历史的一部分而被人们铭记。
20年后的今天,软件产业的规模和环境已经发生了深刻的变化。如今企业级应用整合与开发的任务主要由Java、C#、Visual Basic以及各种新型动态语言来承担,而C++的应用场合也有所收缩,不再是像1990年代中期那样从上到下包打天下,而是呈现出鲜明的应用领域特色。相应的,近期的C++技术图书也更加注重在特色领域的发挥。下面我们分别从几个角度来了解近期C++图书的热点,并且展望未来一年中C++技术图书中值得注意的选题。
经典著作全面翻新
这一两年,一大批经典技术图书都经历了一次更新换代,C++经典图书自然也不例外。第一个要说的就是Scott Meyers的《Effective C++》。这本书在1991年推出第一版,1998年推出第二版,在C++技术的传播与教育方面居功至伟。包括我在内的很多C++开发者都是通过阅读这本书而寻得升堂入室的门径。今年,《Effective C++》推出了第三版。这一版决不是第二版的简单修订,而是根据八年来C++所发生的巨大变化而进行的一次全面改写,几乎是一本全新的书。其内容涵盖了旧版的精髓,也体现了诸如Boost库、TR1标准等C++领域最新成果。如果说这本书的内容发生了重大的变化,那么可以说不变的是这本书的地位——它仍然是每个严肃的C++开发者都应当反复阅读领悟的重要作品。
另一本翻新的著作是Stan Lippman的《C++ Primer》第四版。这本书的历史地位无需赘言,迄今为止仍然是对C++介绍最全面的一本著作。第四版进行了大幅度的删修,篇幅减少近300页,而内容也大幅修改,以反映C++近年来的变化。对于希望系统学习C++的新手,或者希望拥有一本手册以备查的老手来说,这本书的地位是不可取代的。
有传言说GoF打算翻新“Design Patterns”。该书第一版于1995年初版,此后十年,设计模式领域的理论探讨和实践基本上仍然围绕这本书中的观点和内容进行,少有突破。已经有不少开发者对于这种情况表示了不满,认为初版中的一些观点已经过时,甚至对现在的一些技术应用构成思想上的羁绊。但是此书实在声名太盛,真正的突破恐怕只能由GoF自己完成,因此本书新版如果推出,必将是技术界内的一桩大事。不过传言亦称,GoF对于新版“Design Patterns”是否继续使用C++作为示范语言存在分歧。不管怎样,相信广大读者会对这本书抱有高度的关注。
新锐佳作剑走偏锋
近年来,一批C++技术新锐崛起,给我们带来了一批令人耳目一新的C++好书。在技术上,这批图书偏重于C++模板风格的巧妙运用,富于智趣而对实践的关注略显不足。这类图书以2001年Andrei Alexandrescu的《Modern C++ Design》为开端,之后又有《Boost Graphic Library》,《C++ Template Metap- rogramming》等。这些书一度以其新颖的思想和奇妙的技巧吸引了大家的目光,但由于缺乏实践的支撑,逐渐褪去光环。这两年,这类题材逐渐缩减。即使像Andrei Alexandrescu那样的模板技术奇才,最近与Herb Sutter合作的《C++ Coding Standard》也并没有过多地炫耀模板技巧,而是中规中矩地对C++编码的经验做了贴近实践的总结。这本书与Steve McConnell的经典著作《Code Complete II》相配合,应成为每一位C++开发者必读的基本著作,将帮助读者奠定坚实的编码和微观设计技术基础。
Boost是C++社群尽人皆知的“准标准库”,其中大量的组件已经基本成熟并可供应用。最近Bjorn Karlsson撰写的《Beyond C++ Standard Library: An Introduction to Boost》是市面上第一本全面介绍Boost的著作。对于那些勇于吃螃蟹的C++先锋开发者来说,这本书无疑是值得一读的。不过在C++社群,对Boost库还存在争议。大部分C++实践者比较保守,这本书对他们的吸引力恐怕将打折扣。
Stephen Dewhurst是近年来比较活跃的新锐作家,他的两本书《C++ Gotchas》和《C++ Common Knowledge》,单独来看都是值得一读的好书,可惜现在不是1995年,而是2005年,Scott Meyers、Herb Sutter煌煌巨著已然危急九五,Dewhurst只好自叹施手略慢。不过我们希望他能够再接再厉,找到创新点,突破前人。
相比之下,中文版即将问世的《Imperfect C++》就比较有新意,很值得一读,以至于Bjarne Stroustrup都相当赞赏。这位C++之父表示,如果不是因为该书太厚,他一定会将其纳入著名的“C++ in Depth”系列。这在事实上肯定了本书的高质量。我个人认为,这本书是一年来出版的最值得精读的C++著作,其中对于不少实践中经常遇到的难题进行了深入的分析,给出了实实在在的解决方案。作者Matt Wilson凭借此书以及其系列模板程序库崛起为C++社群中引人注目的新星,实在可喜可贺。
关键领域期待佳作
未来C++将主要在系统级复杂应用程序、高性能、实时中间件及嵌入式领域施展,同时,随着多核CPU的的普及和网络安全重要性的空前提升,在并发程序设计和安全程序设计方面,C++也将获得新的应用空间。因此,在这些具体领域的C++著作更值得关注。
1996年,John Lakos出版了《Large Scale C++》一书,该书与 “C++ In Depth”系列中的《Applied C++》一样,是C++著作中极少数实战派佳作,其中字字句句都来自于作者丰富的实际项目经验,对于一线的C++开发者来说是特别值得咀嚼体味的好书。可惜这本书在国内一直没有得到应有的重视,这可能跟本书中译本出版时间过晚,且翻译质量不佳有关。好消息是,John Lakos即将在2006年推出其新作《Scalable C++》。我本人将此书视为未来一年中C++领域最令人期待的作品。这一方面是出于我对于作者的高度信任,另一方面是由于该书题材的极端重要性。该书副标题为“基于组件的软件开发”,而“组件化”这一主题,是C++十几年来的一块心病。在未来,无论C++应用在何种场合,“组件化”是必不可少的基本要求。而COM技术虽然在组件化方面比较成熟,但是不具有可移植性,而且对于无须跨语言的C++开发项目来说过于复杂。因此,C++社群需要自己探讨经济适用的组件化实用方案。John Lakos本人从事大型复杂应用软件开发多年,在这方面的经验无人能敌,由他来对这个主题进行深入剖析,并且给出实际解决方案,毫无疑问是再合适不过的了。虽然这本书还在写作过程中,但是我们有理由对其抱有充分信心。在此我也呼吁本书中文版未来的出版者认真对待此书的翻译制作,不要重蹈《Large Scale C++》的覆辙。
说到COM,自从NET推出,COM的书几乎一夜之间绝了种,几乎无人再勇于炒这碗冷饭。但这次出版界的茶实在凉得快了些,事实上直到今天,COM开发仍然是Windows平台上应用开发的一个重要方向。特别是在前两年微软Windows核心向NET全面转型的左倾冒险主义的尝试以失败告终后,在可见的未来,Windows *** 作系统将继续构建在C/C++和COM的基础之上——这就确保了COM在Windows平台上的重要地位将至少延续到2011年之后。因此,COM、ATL和WTL开发技术在未来几年都还是颇具意义的出版题材。特别是近年来ATL/WTL的发展之快,相比之下,技术出版在这方面出现了一个空白点。此外,开源的Mozilla项目提供了一个可移植到所有主流平台的COM实现,这对于C++开发者来说是很具有吸引力的,却一直没有出版资源的关注,令人遗憾。
C++近年来的一个应用热点是复杂网络应用的开发,ACE在这方面已经成为越来越流行的选择,而ICE作为目前可用的最先进的高性能中间件产品,崛起的势头很猛。这两方面目前都有一些好书,特别是最近出版的《ACE Programmer’s Guide》,对于ACE编程入门很有好处。而ICE 13版的手册早已由马维达先生译成中文,可在网上自由获得。不过坦率地说,这方面的图书还远远不够,ACE原作者Doug Schmidt所著的两卷本《C++ Network Programming》可读性和实用性不足,而ICE手册深度和广度都显不够,我们期望这方面能有更好的著作出现。
随着多核CPU的普及,并发程序设计将成为C++技术上的一个新热点。这方面目前的好书几乎没有,不知道这个巨大的空白将由何方神圣来填补。
同样,网络安全重要性的空前提升对C++开发提出了很多新的具体要求,很多C++老手面临一个“再教育”的问题。这方面Microsoft Press的《Writing Safe Code》,O’Reilly的《Secure Programming Cookbook for C and C++》,以及最近Pearson出版的《Secure Coding in C and C++》都是不错的参考。不过我发现目前C++开发者并未普遍重视这个问题。也许管理层还需要更加“血淋淋的教训”来刺激一下,才会有革新的动力。
在嵌入式方面,由于应用复杂度的逐渐提升和Symbian OS/Windows CE等面向消费的高级嵌入式 *** 作系统的广泛应用,给C++提供了一个广阔的发挥空间。可惜在这方面,真正堪称经典的好书还是凤毛麟角,看来还需要时间和经验的积淀。不过有一本书特别值得一提,北航出版社去年引进的《嵌入式系统的微模块化设计》被国际嵌入式开发领域公推为数年来年度最重要的嵌入式软件开发技术著作,其中含有一些意义深远的创新思想,非嵌入式开发者也有必要了解此书的大致思想。
总结
程序设计语言数以千计,能够广为流传的不过几十种,而能够风光20年的更是屈指可数。Fortran已经问世50年,仍然是科学计算首选,C语言辉煌30年,至今老当益壮。C++顺利地度过了自己的20岁生日,相信属于它的日子还很长很长。作为C++开发者,我们也希望看到优秀的C++技术图书不断涌现。历史证明,C++领域内的技术创新,不但对于C++开发具有重大意义,而且对于整个软件开发技术都具有重大意义。我们有理由相信,在下一个十年里,以高水平C++技术专家和作家为代表的C++技术社群能够继续为软件技术做出突出的贡献。
使用QT,这个是最常用的C++编写GUI。
之后,QT的惯用教材是 “C++ QT 编程”,英文名是 “C++ GUI programming with Qt 4”,应该可以到网上下载电子版。那里有非常详细的讲解,从入门输出一个框,到用layer编写复杂的图形界面都有。即使是新手,只要知道一点C++的知识,都没有问题。
最后,QT需要单独下载软件,之后可以把图形界面程序以及是用的C代码放到他的编译器里面来跑,很方便。
以上就是关于如何用 C++ 从零编写 GUI全部的内容,包括:如何用 C++ 从零编写 GUI、MFC,WTL,WPF,wxWidgets,Qt,GTK 各有什么特点、大家给推荐基本好书吧,C和C++的,入门和深入都说以下吧,谢谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)