天天看点

VC++程序员如何做好界面

本屌丝在新春放假期间闲来无事,在各大编程论坛溜达了一圈。发现年前的帖子中,有VC++程序员在界面开发方面遇到了很多苦恼,有抱怨界面工作不好做的,有抱怨用错了界面库的,也有紧急求得技术问题帮助的。看到这些,想起了五年前的我。我那时正好在一家互联网公司担任技术总监一职,手下有三个人。那是一家刚创办的公司,老板是我初中同学,他在美国呆了几年拿到EMBA后到国内创业。在一次同学聚会上了解到彼此工作方向。后面凭借对未来的向往一起创业,他负责营销和资金,我负责技术研发。我们的目标是开发一款企业用的即时聊天软件(IM),那时还没有企业QQ和IMO。我们感觉市场是空白的,而企业需求则是非常刚性的。于是我们开始了美好的梦想之旅!

我之前一直是做服务器后台底层编码的,弄过阿里巴巴的阿里旺旺的后台,所以后台部分基本都是现成的技术和框架,不需要占用我太多的时间。老板让我招几个技术人员以辅助我的工作。我在老板的眼里是技术牛人一个(也许我在他面前把自己吹的太高了),他经常以“大师”称呼我。(虽然我表现的很谦虚,不过心理还是感觉良好,被别人认可的感觉真好!)。于是我就招了三个懂点MFC的程序员进来一起做IM的客户端部分。

说实在的,那时我对VC++开发界面真没有什么经验,这三位小弟好像与我挺投缘的,都一致认为做界面嘛MFC就足够了。当时,我关注过QT,虽然QT做出来的效果真不错,但有两个问题直接导致我放弃了它。

第一、发布出来的程序居然要带上十几兆的QT支持库(QTCore.dll,QTGUI.dll等);第二、QT的调用真是奇怪,和MFC完全不一样的,特别是事件响应,再加上三个小弟对QT也不太熟。所以最终大家都毫不犹豫地抛弃了它。

VC++程序员如何做好界面

MFC做界面很容易,在窗口资源上摆上一个一个控件是所见即所得的,很直观的。大概做了三个月,登录界面、主界面、聊天界面和设置界面都相继问世了。灰灰的窗口背景,虽然有点丑,但不影响功能的展示。我拿着这个版本向老板汇报了。老板看后感觉很满意,他很高兴地告诉我,再弄一个月,把体积搞小点,界面效果做到QQ的样子就可以上线了。我信心百倍地表示,一定按时完成任务。我们立即开始了体积的缩小工作。发现WTL在界面和体积上都比MFC要有优势的多。于是我们边学边改代码。花了一周时间,把WTL都换上了。体积确实如期所愿缩小了很多,依赖库也少了几个MFC*.dll。不过要把界面做成QQ那样子,我们几个不知道从何下手。从网络上查了查有很多,有破解的,有免费的,有收费的。说实在的,老板刚创业也没有钱,有免费的肯定不会选择收费的了(除非脑子“进水”了!!!)。看到网络上的评价BCGControlBar挺不错的,于是Down了一个9.0的版本,还带源代码,太令我激动了!

VC++程序员如何做好界面

研究了它的Demo和代码,发现与我们聊天软件不太一样,也找不到用它做IM界面的例子。有个手下提醒我了,他说BCGControlBar是做管理型软件比较适合,比如Office之类的软件。现在想来他说的还真是对的。继续Google上找,发现有一款SkinMagic的换肤软件,还带可视化的皮肤设计工具。

VC++程序员如何做好界面

不过小激动了几下后发现,这个设计工具只能编辑同一类型的控件外观,用这个工具换肤出来效果是:所有同类型的控件都长成一个样子。对聊天软件来说,有很多控件都需要长不同的样子。后来终于搞明白它是换肤类界面库,而我们需要的是开发界面的工具。换肤类界面库的意思是我们把界面用MFC先做好了,然后用它去换肤,相当于把软件换层皮,但对自定义的控件和控件的各种布局都无法支持。经过这么一段时间的摸索后,感觉网络上界面库初看上去还不错,但真正用起来会发现很多问题。一晃一个月过去了,老板来问我开发进度了,心中顿生很大的压力,开始感觉到界面没有我之前想象的那么简单!在界面上没有大的进展,我让老板再给我一个月时间。虽说我之前没有太多的界面开发经验,但我感觉自己的技术功底是比较扎实的,加上这几周对界面库的调研后发现,界面库的东西其实也蛮好理解的,而且也不存在什么特别高深的东西,不就是绘制图片嘛,我心中有一种莫名的冲动:我也开发个界面库出来,把这些网络上的无能之辈统统“打倒”!想当年我参加全国计算机编程竞赛还得过名次滴,我还不信搞不定它了!

在Windows上做界面,说白了就是做控件自绘。我安排手下三个人各做5个标准控件的自绘工作,我负责窗口标题栏、菜单栏和工具栏的自绘。刚接手做的时候,真的还挺麻烦的,看了不少的资料。

VC++程序员如何做好界面

幸好在CodeProject上面找到了很多控件的自绘的类,还找到了很多的文章,比如滚动条如何自绘等等。这些文章写的都是非常有技术含量,后面用在程序中发现还比较稳定的。我们4个人经过1个月的奋斗终于出了一个草稿版,窗口、控件都实现出了QQ的样子,不过在某些程序交互操作上还存在一些瑕疵,但我们4个人看看还说的过去。老板如期而至,用了一下我们的类QQ版IM。他体验完后给我的评价是如果不操作界面感觉还行,但一操作就感觉有很多问题:界面卡、闪烁厉害、控件很别扭、位置错乱…… 我向老板解释了其中的缘由,不过他好像并没有听进去。从一开始对我那么高的期望,现在一下子有点失落的感觉。说实在的有种对不住老板发的工资,还有种辜负他期望的感觉。回到家里连续几夜都没有睡踏实。之前的豪言壮语都已经烟消云散了。如果继续沿着我们自己开发的这个界面库,在短时间内解决掉这些问题是不太可能的,因为里面有很多的界面细节,而且Windows控件自绘方式的界面要做到完全不闪烁是很难的。知道前路艰险,所以向老板提出了离开的想法,老板在几次挽留后同意了我的请求。

之前的失败教训告诉我:第一、不做自己不擅长的,让专业的人做专业的事;第二、不搞个人英雄主义,成也“英雄”,败也“英雄”。

前两年又找了一家互联网公司,他们家之前就用了开源库Duilib,效果要比我之前做的界面要好很多。

VC++程序员如何做好界面

不过他们也是遇到了界面升级难的问题。公司想要做自动化测试这块,但是DUILib是DirectUI界面库的一种,窗口上没有控件的句柄,大家都不知道如何让自动化测试工具找到窗口上的控件和他们的函数。另外Duilib在多主题、多语种和多色调上面都不支持,我们团队没有时间去开发这样的新功能,我第一时间想到的就是找开源库作者来增加这样的功能。但是最后的结果是那个作者不愿意配合我们做这项工作,不过后来想想也是,他没有收我们的费用凭什么为我们服务。但是公司的计划不容拖延,我必须迎头赶上。团队有人提出我们自己修改Duilib的代码,我否定了这个方案,因为界面的复杂度很高,弄不好又要重蹈覆辙,对公司对团队都非常不好,而且我们自己的团队更应该关注自己业务的开发,不能分散精力,让专业的事情让专业的人来做才对。后面我又了解到迅雷有一款Bolt的界面库,效果真心地不错,也让我们迷恋了一段时间。

VC++程序员如何做好界面

最后放弃Bolt界面库的原因有四个:

第一、Bolt界面库没有现成的控件,如果我们要做一个自定义的Listview则需要好多天的代码编写;

第二、Bolt的学习时间长,成本太高,还需要学习Lua脚本;

第三、Bolt不提供源代码,对互联网公司来说,如果用在软件里的界面库没有源代码很容易被别人控制,虽然迅雷公司一再地声称信誉和商业道德。但对更多企业来说,这点没有真正的约束作用;

第四、免费的方案,我们之前已经吃到DUILib库的苦头了,免费的东西别人就可以坐视不管,而Bolt在迅雷内部只是一个部门工具而已,并不是一款独立运营的产品,如果我们以后发现哪里功能不满足如何找到负责的人修改和维护呢?这点仔细想想是很可怕的:如果我们的产品已经发布使用,突然有一天界面库发生崩溃了,找谁去?哭也没用了。这个风险太大!

VC++程序员如何做好界面

后面通过百度搜索找到了几家收费的界面库,UIEasy的DSkinLite,UIPower的DirectUI,Bodsoft DirectUI Library。初步的映像是UIPower的价格是最贵的。

其他两家的价格优势是很明显的。几千到一万之间。后来了解到UIEasy的DSkinLite与SkinMagic是差不多的,所以它被放弃了。

VC++程序员如何做好界面

UIEasy也有DirectUI,但试用下来感觉是个半成品,所以也不去考虑它了。和老板商量后,最后采购了Bodsoft的DirectUI,最终以9700元拿到了产品和所有的源代码。

VC++程序员如何做好界面

本以为找到了界面的娘家了,可惜后面的事情令我不堪回首。之前答应我的服务后面几乎没有怎么兑现。界面库中Bug非常多,每次找他们修改还找理由说是我们使用上的问题。我当初非常气愤,决心要诉诸法律,但我转念一想,如果这个事情闹大了,对我自己也不好,至少也有失察之责,弄不好我又得离职,所以我后面就忍了下来。真想不到搞个界面这么麻烦啊。我当时心里在琢磨,Bodsoft应该是个小公司,否则不会这么轻易地干出如此拙劣的服务。我想以后有机会要过去看看,会会这些不讲信用的人。这次的采购经历又让我知道了购买重要东西的时候必须上门视察一下,否则吃了苦头只能往自己肚子里咽。

选择Bodsoft有我对价格的考虑,现在发现不能因为价格而草率决定谁适合。作为用户来说,说实在的,要从网站上去对比真的很难比出谁好谁坏,只有来真格才行。能选择的也只有UIPower了,它当初因为价格太高第一个被我们排除出去的,现在又要重现拉回来重新评估,矛盾复杂的心情难以言说。

这次老板和我们开了一个会议,反省了几点:

第一、在界面开发上进度延误的太严重了,必须以最短的时间追上来,市场不等人;

第二、采购东西要讲究性价比,而不是一味地追求便宜;

第三、界面方面之前的预算重新弄,根据市场行情来,不再自己搞一套心理预期。有了老板这个底子,我心理有谱了。

正所谓吃一堑长一智,要让我相信网络上的谁现在都是不可能的了,必须通过技术和法律手段来确保合作的结果,我不想再失误一次,这次必须成功!我让手下把界面中遇到的问题和未来需要的功能都列了一张表,作为我们与UIPower沟通的主要内容了。我们自己制定了几个合作原则:

第一、UIPower必须针对我们关系的问题提供可以运行的Demo;

第二、涉及到定制这块的,必须有详细的报价单;

第三、把所有的要求列入合同并确定具体的惩罚措施;

第四、必须拿到DirectUI的所有源代码。

第五、必须到UIPower办公现场实地考察一下,耳听为虚,眼见为实。

以上的原则从技术和法律两个层面上进行了未来结果的保证;

我们根据以上几个原则与UIPower进行了接触,最后达成了合作。合作过程还算顺利,但也暴露出了一些问题,比如他们在客户分配时间上有些令人不太满意,但反过来想,人家客户数量多忙不过来也很正常。我们希望他们能第一时间处理我们的问题,但很多时候不能如我们所愿。不过他们承诺的三天时间解决问题,一般都能按时交付给我们。

现在回过头来总结一下:

如果你对界面真的非常感兴趣,并且有充足的时间,那么我建议你多看一些开源库,然后开发属于“自己”的界面库,这样做的好处是,你对自己的界面库了然于胸,最好不要拿免费的开源库直接使用,因为免费的东西一般不会有完善的后期维护和及时的代码更新,这样的话一旦出现Bug,你就不知道如何迅速修改它。自己开发的界面库毕竟是经过精心设计和思考的,所以每行代码都是非常清晰的。这种方式的前提是你得对界面开发很在行,技术功底也不错,有足够的时间和非常平静的内心,一般需要坚持1-2年。

如果你只是使用界面库的话,免费的东西首先我不建议你选择,主要原因就是你没有付费就得不到相应的技术服务,一旦出了问题(出问题的概率在90%以上)你会感受到孤立无助,彻底“崩溃”。至于收费的东西,也要擦亮眼睛仔细看看他们做过的成功客户,最好实地考察现场拜访,参观一下现场的办公环境。做界面库的“皮包公司”特多(其实不光是界面库方面,做软件工具的很多都是这样的,我之前接触一个报表工具公司的也是如此。),在网络上实在无法搞清楚公司实力如何。公司越大,售后服务相对会好些,公司太小或没有公司,售后服务如何保证?这是吃到苦头以后总结出来,希望能帮到与我差不多的屌丝们。

回复:weiym

呵呵, 支持下, 以前我个人也写过一套界面库 ,现在开源了:

http://www.cppblog.com/weiym/archive/2012/07/03/181307.aspx

写界面库要细心 + 耐心, 很多界面库看起来很炫, 但是真正用起来问题就都暴露了, 不是闪烁就是不支持键盘操作, 支持MSAA/UIA的就更少了.

回复: zs8861

楼主,我这两年一直在用VC,然后也找了很多很多的VC的界面库,各种不好用,后来一个项目用上C#后,我找到了一个C#的界面库DevCompenents.DotNetBar,国外的一套控件库,特别好用,网址是http://www.devcomponents.com/,CSDN的下载里面也有很多破解版,可以Down下来用用看,我现在的开发模式是,底层用C/C++,上层UI用C#,C#开发界面特别方便,给你看看他们的其中一个Sample吧。

这是DotNetBar的可用控件,我使用的是CSDN中下载的破解版,经过快一年的使用,感觉十分稳定。

不过也看了看他们的licence,貌似也不算贵。

回复:fryhunter

楼主,顶你。文章写得很好。我不是说你对界面库方面的经验。我现在要么flex绘制界面,要么C#绘制,这方面已经真的成为了无压力的问题了。

你文章中的经历,让人能深有感触。我们做软件的,总是会忍不住乐观,忍不住去英雄主义,最后坑的都是自己。你在下家公司对于问题的解决就很到位。我们要的是解决问题,不是证明谁技术牛逼,如果盲目地去推倒重来,只会坏事。

谢谢你分享

回复:LXZ_2008

别人都以为腾讯的UI很简单,就像别人怀疑微软的技术那样。

就算Jquery的源码摆在你面前你都不会去看那样。

跟这样的老板混,实在没意思。

回复:c10682

HTMLayout很不错,完全免费的界面组件,官方提供了很多VC++的范例,

而且成功的案例也很多,例如诺顿、Realplay等,使用的又是传统HTML + CSS + 部份CSS3, 原生支持jQuery兼容的CSS选择器语法。

仿iPad界面,点这里下载完整源码

VC++程序员如何做好界面

仿360界面, [url=http://www.aau.cn/thread-8519-1-1.html]点这里下载完整源码/url]

VC++程序员如何做好界面

回复:shendl

写界面为什么还要买第三方库?

自己用现成的控件改改不行吗? QT支持qss换肤。flex,swing也支持类css的语法换肤。

     自己用画布绘制定制控件也很容易。

如果类QQ的界面都喊难,那让写游戏的情何以堪???

    界面开发,就3个字:MVC模式!    很简单的。

html页面上的界面开发比VC受限更多。 jQuery不照样能够实现很多NB花哨的界面?   html5就不强了!

    都2013年,界面还是个事吗?

回复:c10682

适用的目的不同,一般的共享软件,1MB都是问题,更不要说10MB了,

这不象企业软件,做的体积越大可以卖的更贵。

游戏的界面与UI界面完全是不同的技术,

你看游戏他的画面做的很炫,可是做界面一样难,

所以很多游戏里都用了HTMLayout做UI.

至于HTML5啥的,软件界面与做网页完全是两回事。

除非软件准备带上20MB的webkit内核,不然至少XP上支持不了HTML5,

用JS来做传统控件,看看dojo做出来的界面有多卡,jquery ui做出的的有多丑就知道了。

bolt的免费是有保留的,其他各种UI库都是自家的专有语法,

本身就要投入相当的学习成本去别人特定的语法,而且还不能真正自由免费的使用。

做桌面软件的话比较推荐HTMLayout,这个库久经考验,而且是真正的完全免费的。

使用的又是传统的HTML,CSS语法,部份CSS3,写个漂亮的界面非常快,而且运行速度也快,非常好用。体积也很小(不到1MB,打包后也就几百KB)

官网的介绍:“HTMLayout被安装在超过6,700,000 台电脑上,使用在不同的公司不同的产品中。这也意味着每天有大约43,000个用户下载并安装以HTMLayout开发的产品”

回复:waterflier

久不上CSDN了,在Bolt的QQ群里看到了这个帖子的链接,作为Bolt的作者(目测本帖里出现的第一个当事人),我有必要解释和澄清一些楼主的疑问(其它库话题我就忍住不说了)

1.Bolt的设计目标是一个可以开发各种UI的核心,所以目前对Bolt使用者的假设是“UI开发者”,而不是最终的产品项目经理。很显然lz的团队在UI开发上并无经验,但有需要在短期内完成需求,所以肯定要倾向于选择界面外包开发服务。这个例子里,lz的界面外包服务开发商就是我们的目标用户,使用Bolt可以极大的提高他们的生产力。

2.Bolt的使用门槛是不太适合"完全的新手",只是想通过一个demo的学习,或者在已有的项目里添加几行代码就做出"漂亮"的界面,Bolt 对他们来说确实太难的。关于为什么Bolt会使用这样的思路,我们的官网上有一篇文章(http://xldoc.xl7.xunlei.com/0000000018/00000000180001000020.html ),仔细的讨论了Bolt与传统的提供一打控件的界面库的不同。

3.一旦理解了第二点,对于楼主的困惑"Bolt不提供源代码,对互联网公司来说,如果用在软件里的界面库没有源代码很容易被别人控制,虽然迅雷公司一再地声称信誉和商业道德。但对更多企业来说,这点没有真正的约束作用"就有了逻辑上的一个类比答案: 做网站的同学需要关心浏览器是否开源么?(当然迅雷也有开源的计划,只是会从一些更基础的项目开始)

4.lz担心的第四点我的回答是:Bolt是迅雷所有客户端产品依赖的核心,大可不必担心无人维护和质量问题(现在bolt的文档不能和msdn比,但也相当丰富了)。引擎的崩溃我们比你着急。。。 

最后很多人质疑Bolt的免费态度,我只能说打消这种念头最好的方法就是加入到Bolt的开发者社区来(bolt.xunlei.com/bbs),感受几天就自然明白了。而且现在Bolt的授权申请,几乎就是毫无限制的一个君子协定,只对使用者有利。

P.S 对于所有尝试过Bolt并在使用中提出过问题的人,我们都会及时回复,有意见和疑问请和我们联系:) 再次感谢楼主对Bolt的意见和关注。

回复:eyerr

https://code.google.com/p/duilib/

duilib BSD许可开源的,很不错的非常小巧,基于 viksoe 这个也是很不错的。

不怕体积大那就用CEF( Chromium Embedded Framework ), 20MB,用 chrome的webkit内核做界面,支持HTML5,完全的真正的免费哦,这个爽,仔细看看现在很多软件如QQ,有道都用到了这个库,里面能找到 libcef.dll

用HTML5,JS写界面,通用的技术多好。

回复:Kaile

用html css 做桌面产品的桌面,对于我真的不习惯,个人还是习惯拖拉控件的方式,在IDE里做。

html做界面,方便确实方便,不过,本人总担心某些功能不好实现,可能还需要依靠JS。

比如工具栏上带combobox,下拉菜单上带公司的LOGO图片,这些功能用BCG很容易,HTML容易吗?至少 我没看过

回复:c10682

UI其实分为很多种:

1. 传统UI、以及在此基础上延伸出来的标准库,例如BCG。

2. Direct UI 上面列出的已经很多了

3. Web UI 而这个里面又分为很多种,有HTMLayout这样使用了HTML,CSS的语法但本质还是Direct UI的引擎,也有使用IE内核等传统浏览器引擎的方法,如果使用CEF,或者IE10内核还可以支持HTML5。  

这几种界面库没有相互替代的关系,而是根据不同的界面需求,知道他们的优点、缺点选择不同的技术。

例如你做类似office的界面,那可能BCG非常适合. 而做QQ这样的界面可能就是 Direct UI 更合适。

至于你说的只是一个工具栏带上combbox,那我告诉你,小小的HTMLayout可比BCG做出的的效果漂亮太多,而且比BCG的用法要简单太多,即使是ribbon界面用HTMLayout也可以轻松搞出来,HTML排版的强悍是传统UI难以望其项背的。

至于说HTML,CSS容不容易,能学会其他编程语言,这种东西顶多就是一周可以玩的烂熟的东西。

而且未来是web的世界,学这些技术肯定是很好的投资。

回复:Kaile

LZ的贴子如果一定要写个中心思想的话那就是最后选择的DIRECTUI界面库最好,产自UIPOWER。

我特意去看了下UIPOWER的界面视频,优点因为我没有试用过,不清楚,缺点方面,感觉最大的缺陷是,开发必须要使用COM。 COM比较繁琐,大家都知道。 BOOL型 要用VARIANT_BOOL, 创建一个按钮还要带一个全球唯一UID,长达32个字符。 

这个缺点不知道其他公司能不能接受,本人是很难接受。

现在希望能找到这样的一个C++界面库,既提供一些复杂的控件,类似于BCG这样的,又能方便地添加一些特效,如半透明,透明,渐变, 反转,发光,旋转,简单的动画,滑动,淡入淡出,百叶窗等等。

最好还能跨平台。

这样的界面库不知道有没有?

回复:waterflier

在开发bolt之前,我也仔细考虑过用html5来构建界面,但最后得到的结论是“这样不行”(无意贬低htmllayout和CEF)

我的观点是,html5这种技术历史包袱太重,导致解析器难以小型化和高性能化;另外html本身的设计目标是为内容展现进行优化的排版,用来做UI有一点“用老虎钳子敲钉子”的感觉:能敲,但不太顺手。

回复:

楼主,觉得金山开源界面bkwin库如何呢?

回复:LiveALearn

看来楼主在这方面碰了不少的壁,花了很多心思,写得不错。

另外推荐一下dev的界面库不错,可以看看。

回复:fengsuiyingdong

刚用Codejock.Xtreme Toolkit开了了一个MFC的界面应用软件

此文章来自于【http://bbs.csdn.net/topics/390379682】

继续阅读