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

yzjaicui 2013-03-01 04:42:33
加精
本屌丝在新春放假期间闲来无事,在各大编程论坛溜达了一圈。发现年前的帖子中,有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%以上)你会感受到孤立无助,彻底“崩溃”。至于收费的东西,也要擦亮眼睛仔细看看他们做过的成功客户,最好实地考察现场拜访,参观一下现场的办公环境。做界面库的“皮包公司”特多(其实不光是界面库方面,做软件工具的很多都是这样的,我之前接触一个报表工具公司的也是如此。),在网络上实在无法搞清楚公司实力如何。公司越大,售后服务相对会好些,公司太小或没有公司,售后服务如何保证?这是吃到苦头以后总结出来,希望能帮到与我差不多的屌丝们。
...全文
54576 316 打赏 收藏 转发到动态 举报
写回复
用AI写文章
316 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝色枫叶 2015-07-22
  • 打赏
  • 举报
回复
血泪的经验,学习了楼主
abcdhyn 2015-06-17
  • 打赏
  • 举报
回复
涨知识了,对于新手是一种指引
  • 打赏
  • 举报
回复
谢谢楼主经验,可惜小公司还是用免费的比较多啊。
bolthei 2015-03-03
  • 打赏
  • 举报
回复
只谈谈bolt, 当然这个没有深入研究, 没有发言权, 从官网看, bolt似乎是有很好很先进的思维, 也许它确实能够降低开发人员的负担. 但是我一个朋友的经历让我觉得有点感触 这个朋友我发过一个截图, 上面有一句话, "bolt从今天开始不再对xxxx(公司名)支持", 大概是这个意思, 好好体会吧…… 之后呢?之后我这朋友就没有饭碗了, 实实在在的就废了, 写了几年bolt, 玩的是很牛, 但是没有几个公司再用 你说一个hr看到简历上写着迅雷bolt界面引擎会有什么反应? 按照bolt官网的说法, bolt降低了开发成本, 官网上的几个例子似乎也是这么说的, 几个人就能维护, 那么试想迅雷自己需要那么多写界面的人么? 所以想想, 写bolt的同学们, 几年之后又将何去何从 bolt你何德何能一句话就能让人丢饭碗
rudy6 2015-03-03
  • 打赏
  • 举报
回复
duguangwen 2015-02-25
  • 打赏
  • 举报
回复
谢谢分享,虽然不懂,在写的不错
寒沙胜雪 2015-01-20
  • 打赏
  • 举报
回复
mark,新手能在这里面学到非常多的界面知识,现在了解到了c# flex htmlayout等界面库,之前没听过。
ray_mon 2014-12-29
  • 打赏
  • 举报
回复
明明就是个喜欢吹牛的骗子,搞不定就想离职的.... duilib哪家公司用没改过啊?
lgq60122 2014-12-29
  • 打赏
  • 举报
回复
学习了,谢谢分享。
u010155402 2014-11-06
  • 打赏
  • 举报
回复
用mfc开发界面做到美观太费劲
yuhaoloen 2014-10-16
  • 打赏
  • 举报
回复
做界面那可是相当复杂的 好多的软件公司又不重视做界面的 如果一开始采用QT那是正确的选择
wanxiaohong1350 2014-09-22
  • 打赏
  • 举报
回复
Mark一下
冷若寒霜 2014-09-16
  • 打赏
  • 举报
回复
写得真好,能让很多人少走弯路......
刹那神伤 2014-05-21
  • 打赏
  • 举报
回复
對於界面的自繪我是深惡痛絕啊 因為現在用的就是別人用VC寫的界面,我就負責弄DLL加載,想修改主程序真的是痛心疾首~ 看不懂
zhanber 2014-05-14
  • 打赏
  • 举报
回复
引用 308 楼 zhanber 的回复:
作者开头被奉为“大师”,文章结尾自比“屌丝”。
本屌丝读完结尾,忘记开头。惭愧
zhanber 2014-05-14
  • 打赏
  • 举报
回复
作者开头被奉为“大师”,文章结尾自比“屌丝”。
ANvDbg-Capital 2014-04-26
  • 打赏
  • 举报
回复
Mark,都是教训啊。。。
gzstyxb 2014-04-25
  • 打赏
  • 举报
回复
引用 156 楼 Kaile 的回复:
LZ的贴子如果一定要写个中心思想的话那就是最后选择的DIRECTUI界面库最好,产自UIPOWER。 我特意去看了下UIPOWER的界面视频,优点因为我没有试用过,不清楚,缺点方面,感觉最大的缺陷是,开发必须要使用COM。 COM比较繁琐,大家都知道。 BOOL型 要用VARIANT_BOOL, 创建一个按钮还要带一个全球唯一UID,长达32个字符。 这个缺点不知道其他公司能不能接受,本人是很难接受。 现在希望能找到这样的一个C++界面库,既提供一些复杂的控件,类似于BCG这样的,又能方便地添加一些特效,如半透明,透明,渐变, 反转,发光,旋转,简单的动画,滑动,淡入淡出,百叶窗等等。 最好还能跨平台。 这样的界面库不知道有没有?
我熟悉的朋友用过这个界面库。据说也遇到问题,界面某个部位不突然变成空洞(看见窗口背景,空洞区域鼠标事件直接穿透),界面上再次放置别的控件就不能用阴影啦,弹出菜单事件处理明显和微软不一致(导致窗口重复接受按键事件),表格控件无法支持大数据(卡死你没商量),多实例冲突卡死(一个进程使用另外一个进程COM接口),稳定性难说可靠(偶发故障,不可重现),
u014574203 2014-04-12
  • 打赏
  • 举报
回复
alexmayer 2014-03-10
  • 打赏
  • 举报
回复
支持一下楼主,写得很好!
加载更多回复(296)
如果您在此处下载压缩包,还要请您联系作者邮箱:cnaulee@gmail.com =========================== 综述: VC++通用GIS功能开发解决方案》源代码是基于VC++6.0 MFC 类库,在Win2000平台上开发的。界面部分用到了较低版本的 CJ60Lib 开放源码库,用户可自行替换高版本或其他界面库,它不作为本方案的商业部分。 《VC++通用GIS功能开发解决方案》源代码是迄今为止公开提供的最全面、最完善的开发GIS产品的一套基础解决方案。它的界面十分友好和具人性化,它传承了“VC++界面一揽子解决方案”(http://summerplq.51.net)最具经典的界面个性,并融合了该产品自身特有的亮点。它的功能部分解决了GIS开发的诸多普遍问题和关键技术(如数据结构,地图显示,基于DEM的地形分析等),可适用于城市规划、地质勘探、土地丈量、水利枢纽、农田建设,乃至其他构建于城市图和地形图之上的GIS类软件开发。可以说,它的基本功能方面已相当成熟。 《VC++通用GIS功能开发解决方案》是一套内容十分丰富的“教科书”,相对应于各个编程段的程序员来说都有合适的学习内容。源程序条理清晰,模块化设计,普遍采用注释,对于入门和初级程序员来说,可以拆分支解开来学习;对于开发级程序员来说,它提供了丰富的功能实现,省却了您金钱和时间的浪费;作为专业级的程序员来说,或许你可以从中找到另一条安全、快捷的编程思路,从而解决你在诸如方案设计,数据构建,分析实现上的困惑。 目前1.0版本:不带数据库,不带查询功能,不带投影变换功能。 方案内容: ============================================ 一、用户界面和控制 ------------------------------------ 1、实现全彩启动画面,令你程序增色不少; 2、实现软件启动口令设置。积作者多年经验完善而成,口令加密技术先进; 3、实现全屏功能,通过TAB键方便地互相切换; 4、实现人性菜单按钮,有工具栏纹理、文字、菜单图标,以及右键菜单功能; 5、实现视图窗口位图背景; 6、实现状态栏信息功能,显示坐标和高程; 7、实现对话框按钮个性化,平面加图标,自己琢磨还有更多效果; 8、实现发送邮件和访问主页功能; 9、实现真彩位图,图标,光标大应用,你可以在软件中发现大量真彩技术的应用; 10、实现树目录复选图标,彻底解放图层控制。 ! 更多细节请参考“VC++界面一揽子解决方案”3.0v(http://summerplq.51.net) 二、功能实现部分 -------------------------------- 1、数据格式公开透明,这在源代码中是显而易见的。数据源还可以通过Mapinfo中间格式转换过来!一旦你有了源代码,自己就可以编写出该转换软件,当然也可以购买我们提供的该软件。 2、地图显示(显示、漫游、放大、缩小)。 # 地图显示方式采用了图层控制技术,让你点击树目录中的“小眼睛”就可以方便地实现图层的开关显示。操作时图形不闪烁,结合“存档”功能,你还能保存你的设置! # 漫游采用无边际方式,任意漫游!同时结合“存档”功能,保存地图显示位置! # “放大”和“缩小”都同时采用两种方式:定点缩放和拉框缩放!拉框缩放采用了光栅绘图模式,效果自然漂亮! 3、九大GIS分析功能(基于DEM) #量算多点距离#计算线段最大坡度#计算区域面积#计算区域高程#两点通视#中心通视# #区域坡度图#断面图#区域通行分析 全部分析采用实时数据显示(操作同时显示结果)技术,配以最后结果显示。 几点说明: ============================================= 1、考虑到数据量大小问题,本方案只带了一幅示例数据,但已经足够用!又由于该样图来自于原来四幅图中,而本方案所用到的引擎文件也没有作相应改变,所以点程序中的“全图”功能后,该幅图只占了客户区的一角,而不是将该幅图放满客户区。这不影响其它任何操作,不是程序有问题。 2、本程序不提供更多数据!但我们提供将Mapinfo中间格式数据(即.mif格式)转换到本程序数据格式的软件。所以说,您做的城市图也可以放进来用。 3、本程序所用符号库(所谓符号库,即指地图中的点、线、面符号;如高程点,道路,植被等。)采用了封装的动态链接库DLL_study4R.dll,主要是因为该符号库是商业符号库(欲知其详细内容,请留意本人主页日后将刊登的介绍,大体上它包括了所有地形图符号以及城市图符号(如教育机构符号等))。 4、本程序由于CJ60Lib库版本问题而不适合.NET平台,但不是本程序自身问题!用户可以替换掉CJ60Lib库改用支持.NET的版本或其他界面库,或者索性弃用!这不影响程序其他实质部分。 5、补充:今后将推出基于DEM数据生成三维图功能(将作为单独模块提供)。

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧