转:vc与界面开发之间的文章
【很好的一篇文章,很喜欢看同行的心路历程:http://www.vckbase.com/index.php/nv/444.html】
本屌丝在新春放假期间闲来无事,在各大编程论坛溜达了一圈。发现年前的帖子中 ,有VC++程序员在界面开发方面遇到了很多苦恼,有抱怨界面工作不好做的,有抱怨用错了界面库的,也有紧急求得技术问题帮助的。看到这些,想起了五年前的我。我那时正好在一家互联网公司担任 技术总监一职,手下有三个人。那是一家刚创办的公司,老板是我初中同学,他在美国呆了几年拿到EMBA后到国内创业。在一次同学聚会上了解到彼此工作方向。后面凭借对未来的向往一起创业,他负 责营销和资金,我负责技术研发。我们的目标是开发一款企业用的即时聊天软件(IM),那时还没有企业QQ和IMO。我们感觉市场是空白的,而企业需求则是非常刚性的。于是我们开始了美好的梦想之旅 !
我之前一直是做服务器后台底层编码的,弄过阿里巴巴的阿里旺旺的后台,所以后台部分基本都是现成的技术和 框架,不需要占用我太多的时间。老板让我招几个技术人员以辅助我的工作。我在老板的眼里是技术牛人一个(也许我在他面前把自己吹的太高了),他经常以“大师”称呼我。(虽然我表现的很谦虚 ,不过心理还是感觉良好,被别人认可的感觉真好!)。于是我就招了三个懂点MFC的程序员进来一起做IM的客户端部分。
说实在的,那时我对VC++开发界面真没有什么 经验,这三位小弟好像与我挺投缘的,都一致认为做界面嘛MFC就足够了。当时,我关注过QT,虽然QT做出来的效果真不错,但有两个问题直接导致我放弃了它。
第一、发布出来的程序居然要带上十几兆的QT支持库(QTCore.dll,QTGUI.dll等);第二、QT的调 用真是奇怪,和MFC完全不一样的,特别是事件响应,再加上三个小弟对QT也不太熟。所以最终大家都毫不犹豫地抛弃了它。
MFC做界面很容易,在窗口资源上摆上一个一 个控件是所见即所得的,很直观的。大概做了三个月,登录界面、主界面、聊天界面和设置界面都相继问世了。灰灰的窗口背景,虽然有点丑,但不影响功能的展示。我拿着这个版本向老板汇报了。老 板看后感觉很满意,他很高兴地告诉我,再弄一个月,把体积搞小点,界面效果做到QQ的样子就可以上线了。我信心百倍地表示,一定按时完成任务。我们立即开始了体积的缩小工作。发现WTL在界面和 体积上都比MFC要有优势的多。于是我们边学边改代码。花了一周时间,把WTL都换上了。体积确实如期所愿缩小了很多,依赖库也少了几个MFC*.dll。不过要把界面做成QQ那样子,我们几个不知道从何 下手。从网络上查了查有很多,有破解的,有免费的,有收费的。说实在的,老板刚创业也没有钱,有免费的肯定不会选择收费的了(除非脑子“进水”了!!!)。看到网络上的评价BCGControlBar挺 不错的,于是Down了一个9.0的版本,还带源代码,太令我激动了!
研究了它的Demo和代码,发现与我们聊天软件不太一样,也找不到用它做IM界面的例子。有个手下 提醒我了,他说BCGControlBar是做管理型软件比较适合,比如Office之类的软件。现在想来他说的还真是对的。继续Google上找,发现有一款SkinMagic的换肤软件,还带可视化的皮肤设计工具。
不过小激动了几下后发现,这个设计工具只能编辑同一类型的控件外观,用这个工具换肤出来效果 是:所有同类型的控件都长成一个样子。对聊天软件来说,有很多控件都需要长不同的样子。后来终于搞明白它是换肤类界面库,而我们需要的是开发界面的工具。换肤类界面库的意思是我们把界面用 MFC先做好了,然后用它去换肤,相当于把软件换层皮,但对自定义的控件和控件的各种布局都无法支持。经过这么一段时间的摸索后,感觉网络上界面库初看上去还不错,但真正用起来会发现很多问题 。一晃一个月过去了,老板来问我开发进度了,心中顿生很大的压力,开始感觉到界面没有我之前想象的那么简单!在界面上没有大的进展,我让老板再给我一个月时间。虽说我之前没有太多的界面开 发经验,但我感觉自己的技术功底是比较扎实的,加上这几周对界面库的调研后发现,界面库的东西其实也蛮好理解的,而且也不存在什么特别高深的东西,不就是绘制图片嘛,我心中有一种莫名的冲 动:我也开发个界面库出来,把这些网络上的无能之辈统统“打倒”!想当年我参加全国计算机编程竞赛还得过名次滴,我还不信搞不定它了!
在Windows上做界面,说白了就是做控件自绘。我安排手下三个人各做5个标准控件的 自绘工作,我负责窗口标题栏、菜单栏和工具栏的自绘。刚接手做的时候,真的还挺麻烦的,看了不少的资料。
幸好在CodeProject上面找到了很多控件的自绘的类,还找到了很多的文章,比如滚动条如何自绘 等等。这些文章写的都是非常有技术含量,后面用在程序中发现还比 较稳定的。我们4个人经过1个月的奋斗终于出了一个草稿版,窗口、控件都实现出了QQ的样子,不过在某些程序交互操作上还存在一些瑕疵,但我们4个人看看还说的过去。老板如期而至,用了一下我们 的类QQ版IM。他体验完后给我的评价是如果不操作界面感觉还行,但一操作就感觉有很多问题:界面卡、闪烁厉害、控件很别扭、位置错乱…… 我向老板解释了其中的缘由,不过他好像并没有听 进去。从一开始对我那么高的期望,现在一下子有点失落的感觉。说实在的有种对不住老板发的工资,还有种辜负他期望的感觉。回到家里连续几夜都没有睡踏实。之前的豪言壮语都已经烟消云散了。 如果继续沿着我们自己开发的这个界面库,在短时间内解决掉这些问题是不太可能的,因为里面有很多的界面细节,而且Windows控件自绘方式的界面要做到完全不闪烁是很难的。知道前路艰险,所以向 老板提出了离开的想法,老板在几次挽留后同意了我的请求。
之前的失败教训告诉我:第一、不做自己不擅 长的,让专业的人做专业的事;第二、不搞个人英雄主义,成也“英雄”,败也“英雄”。
前两年又找了一家互联网公司,他们家之前就 用了开源库Duilib,效果要比我之前做的界面要好很多。
不过他们也是遇到了界面升级难的问题。公司 想要做自动化测试这块,但是DUILib是DirectUI界面库的一种,窗口上没有控件的句柄,大家都不知道如何让自动化测试工具找到窗口上的控件和他们的函数。另外Duilib在多主题、多语种和多色调上 面都不支持,我们团队没有时间去开发这样的新功能,我第一时间想到的就是找开源库作者来增加这样的功能。但是最后的结果是那个作者不愿意配合我们做这项工作,不过后来想想也是,他没有收我 们的费用凭什么为我们服务。但是公司的计划不容拖延,我必须迎头赶上。团队有人提出我们自己修改Duilib的代码,我否定了这个方案,因为界面的复杂度很高,弄不好又要重蹈覆辙,对公司对团队 都非常不好,而且我们自己的团队更应该关注自己业务的开发,不能分散精力,让专业的事情让专业的人来做才对。后面我又了解到迅雷有一款Bolt的界面库,效果真心地不错,也让我们迷恋了一段时 间。
最后放弃Bolt界面库的原因有四个:
第一、Bolt界面库没有现成的控件,如果我们 要做一个自定义的Listview则需要好多天的代码编写;
第二、Bolt的学习时间长,成本太高,还需要 学习Lua脚本;
第三、Bolt不提供源代码,对互联网公司来说 ,如果用在软件里的界面库没有源代码很容易被别人控制,虽然迅雷公司一再地声称信誉和商业道德。但对更多企业来说,这点没有真正的约束作用;
第四、免费的方案,我们之前已经吃到DUILib 库的苦头了,免费的东西别人就可以坐视不管,而Bolt在迅雷内部只是一个部门工具而已,并不是一款独立运营的产品,如果我们以后发现哪里功能不满足如何找到负责的人修改和维护呢?这点仔细想 想是很可怕的:如果我们的产品已经发布使用,突然有一天界面库发生崩溃了,找谁去?哭也没用了。这个风险太大!
后面通过百度搜索找到了几家收费的界面库, UIEasy的DSkinLite,UIPower的DirectUI,Bodsoft DirectUI Library。初步的映像是UIPower的价格是最贵的。
其他两家的价格优势是很明显的。几千到一万之间。后来了解到UIEasy的DSkinLite与SkinMagic是 差不多的,所以它被放弃了。
UIEasy也有DirectUI,但试用下来感觉是个半成品,所以也不去考虑它了。和老板商量后,最后采 购了Bodsoft的DirectUI,最终以9700元拿到了产品和所有的源代码。
本以为找到了界面的娘家了, 可惜后面的事情令我不堪回首。之前答应我的服务后面几乎没有怎么兑现。界面库中Bug非常多,每次找他们修改还找理由说是我们使用上的问题。我当初非常气愤,决心要诉诸法律,但我转念一想,如 果这个事情闹大了,对我自己也不好,至少也有失察之责,弄不好我又得离职,所以我后面就忍了下来。真想不到搞个界面这么麻烦啊。我当时心里在琢磨,Bodsoft应该是个小公司,否则不会这么轻易 地干出如此拙劣的服务。我想以后有机会要过去看看,会会这些不讲信用的人。这次的采购经历又让我知道了购买重要东西的时候必须上门视察一下,否则吃了苦头只能往自己肚子里咽。
选择Bodsoft有我对价格的考虑,现在发现不 能因为价格而草率决定谁适合。作为用户来说,说实在的,要从网站上去对比真的很难比出谁好谁坏,只有来真格才行。能选择的也只有UIPower了,它当初因为价格太高第一个被我们排除出去的,现在 又要重现拉回来重新评估,矛盾复杂的心情难以言说。
这次老板和我们开了一个会议,反省了几点:
第一、在界面开发上进度延误的太严重了,必 须以最短的时间追上来,市场不等人;
第二、采购东西要讲究性价比,而不是一味地 追求便宜;
第三、界面方面之前的预算重新弄,根据市场 行情来,不再自己搞一套心理预期。有了老板这个底子,我心理有谱了。
正所谓吃一堑长一智,要让我相信网络上的谁 现在都是不可能的了,必须通过技术和法律手段来确保合作的结果,我不想再失误一次,这次必须成功!我让手下把界面中遇到的问题和未来需要的功能都列了一张表,作为我们与UIPower沟通的主要内 容了。我们自己制定了几个合作原则:
第一、UIPower必须针对我们关系的问题提供 可以运行的Demo;
第二、涉及到定制这块的,必须有详细的报价 单;
第三、把所有的要求列入合同并确定具体的惩 罚措施;
第四、必须拿到DirectUI的所有源代码。
第五、必须到UIPower办公现场实地考察一下 ,耳听为虚,眼见为实。
以上的原则从技术和法律两个层面上进行了未 来结果的保证;
我们根据以上几个原则与UIPower进行了接触 ,最后达成了合作。合作过程还算顺利,但也暴露出了一些问题,比如他们在客户分配时间上有些令人不太满意,但反过来想,人家客户数量多忙不过来也很正常。我们希望他们能第一时间处理我们的 问题,但很多时候不能如我们所愿。不过他们承诺的三天时间解决问题,一般都能按时交付给我们。
现在回过头来总结一下:
如果你对界面真的非常感兴趣,并且有充足的 时间,那么我建议你多看一些开源库,然后开发属于“自己”的界面库,这样做的好处是,你对自己的界面库了然于胸,最好不要拿免费的开源库直接使用,因为免费的东西一般不会有完善的后期维护 和及时的代码更新,这样的话一旦出现Bug,你就不知道如何迅速修改它。自己开发的界面库毕竟是经过精心设计和思考的,所以每行代码都是非常清晰的。这种方式的前提是你得对界面开发很在行,技 术功底也不错,有足够的时间和非常平静的内心,一般需要坚持1-2年。
如果你只是使用界面库的话,免费的东西首先 我不建议你选择,主要原因就是你没有付费就得不到相应的技术服务,一旦出了问题(出问题的概率在90%以上)你会感受到孤立无助,彻底“崩溃”。至于收费的东西,也要擦亮眼睛仔细看看他们做过 的成功客户,最好实地考察现场拜访,参观一下现场的办公环境。做界面库的“皮包公司”特多(其实不光是界面库方面,做软件工具的很多都是这样的,我之前接触一个报表工具公司的也是如此。) ,在网络上实在无法搞清楚公司实力如何。公司越大,售后服务相对会好些,公司太小或没有公司,售后服务如何保证?这是吃到苦头以后总结出来,希望能帮到与我差不多的屌丝们。
转:vc与界面开发之间的文章的更多相关文章
- 基于VC的MFC界面开发
教你熟悉VC6.0创建一个可视化软件的过程 UpdateData(TRUE);//将输入数据赋给文本框变量. UpdateData(FALSE);//将内容显示在文本框中 AfxMessageBox( ...
- iOS界面开发
[转载] iOS界面开发 发布于:2014-07-29 11:49阅读数:13399 iOS 8 和 OS X 10.10 中一个被强调了多次的主题就是大一统,Apple 希望通过 Hand-off ...
- MVC 界面开发
1.什么是设计模式 mvc只是其中一种,对某一类具体问题,总结出来的一套最优的解决方案 1.MVC: 1.Model(模型) View(视图) Controller(控制器) 的缩写 M ...
- 嵌入式系统WinCE下应用程序GUI界面开发【转】
嵌入式系统WinCE下应用程序GUI界面开发 ByToradex 秦海 本文旨在介绍嵌入式系统在Wince下进行GUI应用程序开发可以选择的不同GUI开发框架(Framework),目前最常用的几种方 ...
- 多进程界面开发-Qt试玩儿
目录 一.概述 二.效果展示 三.使用方法 1.启动外部进程 2.创建Qt窗口 3.加入到主进程布局 四.嵌入NotePad 五.调用Ping命令 六.嵌入其他QWidget窗体 七.相关文章 一.概 ...
- 快速全面了解QT软件界面开发技术
快速全面了解QT软件界面开发技术 目录 前言 一. 学习QT可能的目的是什么? 只想体验一下QT? 当前的项目选择了用QT. 为将来做QT技术储备. 二. QT的核心技术优势是什么? QT在软 ...
- VC++/MFC(VC6)开发技术精品学习资料下载汇总
工欲善其事,必先利其器,VC开发MFC Windows程序,Visual C++或Visual Studio是必须的,恩,这里都给你总结好了,拿去吧:VC/MFC开发必备Visual C++.Visu ...
- DevExpress .NET界面开发示例大全
说到做.net界面开发,很多人应该都会想到DevExpress. 它的 .net界面开发系列一共有7个版本:WinForms.ASP.NET.MVC.WPF.Silverlight.Windows 8 ...
- [GUI]界面开发类库-Ribbon风格 [转]
[GUI]界面开发类库 如果我们不十分清楚需要什么样的界面风格及如何实现,请按以下两个步骤操作: (1) 搞清楚这种风格叫什么名字 (2) 查现有的比较著名的GUI库是否已有相 ...
随机推荐
- 常用的Homebrew命令
一些常用的Homebrew命令: 更新:brew update 安装包信息检索:brew info 安装包搜索:brew search foo 安装包列表:brew list 过时信息:brew ou ...
- 使用Qt生成第一个窗口程序
一.打开QtCreater,点击New Project 二.在Qt中,最常用的窗口程序为widgets控件程序,这里我们选择Qt Widgets Application 三.Qt生成的debug和re ...
- 更新浏览器,导致编写脚本报错Message: Unable to find a matching set of capabilities
卸载更新浏览器后,所编写的脚本无法运行,报如下的错误:selenium.common.exceptions.WebDriverException: Message: Unable to find a ...
- OpenGL glReadPixels 转成 CImage
本来是一件很简单的事情,就是将View上使用OpenGL画出来的数据生成图片让其实现打印的功能,我们知道MFC提供打印的接口是不支持OpenGL的(至少我不清楚),必须将它转成GDI再画在Print的 ...
- Aizu 2301 Sleeping Time(概率,剪枝)
根据概率公式dfs即可,判断和区间[T-E,T+E]是否有交,控制层数. #include<bits/stdc++.h> using namespace std; int K,R,L; d ...
- 手机上如何远程控制Linux服务器?
这里介绍3个手机软件,分别是JuiceSSH.Termius和Termux,这3个软件都可以实现远程控制Linux服务器(相当于手机SSH客户端),而且使用起来都非常方便,下面我简单介绍一下这3个软件 ...
- java设计模式——单例模式(二)
破坏单例模式 上一章节,介绍了单例模式的几种方式,这次来学习一波我们创建的单例模式是否安全,能不能破坏.换句话说,也就是在程序运行中,不止有一个实例. 一. 序列化,反序列化破坏 以饿汉式的单例模式 ...
- Jquery-EasyUI combobox下拉框使用
制作一个json文件: <input data-options="url:'${pageContext.request.contextPath }/json/combobox_data ...
- Jquery LigerUI
http://www.ligerui.com/index.aspx http://api.ligerui.com/ 分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下 ...
- 关于小程序 input 组件内容显示不全(显示的长度不满 input 宽度)问题
问题:小程序的input组件经常用到,但在使用input组件的时候会出现一种现象:明明设置了input的宽度,但是输入的内容显示的长度范围却怎么都不到一整个input组件的宽度,而且后面没显示的地方无 ...