missdeer之程序的野望

哪怕出没于深沉的夜里,也要在自己的黑眸上映上无数朵美丽的桃花,如此方能不自伤,不自悲……

Entries for the ‘GUI Framework’ Category

自定义快捷键

  昨天完成了自定义快捷键的特性。该特性在配置对话框中实现与用户交互。
  首先,在程序启动时,装载所有菜单项时,把所有菜单项的ID、标题、快捷键信息记录下来,作为缺省的配置。将缺省配置保存到文件中,然后查看是否存在保存了修改后配置的文件,如果存在该文件,则装载该文件的配置,应用到程序中。应用过程分两步,刷新菜单显示和设置快捷键表。
  接着,处理在配置对话框中的用户交互响应。在对话框初始化时,加载当前正在使用的快捷键配置。用户可以修改其中任意一项的配置,当用户选择应用修改后的配置时,就将当前配置保存到文件中,以便下次程序启动时可以装载这个修改后的配置。
  基本处理流程就是这样。用wxWidgets实现时,也是比较容易的。wxWidgets提供了快捷键相关的几个类和方法,相当方便,包括wxAcceleratorEntry、wxAcceleratorTable、SetAcceleratorTable等等。
  这里不得不抱怨一下,wxWidgets对于一些明明日常需要使用的类和方法,竟然没有文档进行说明。另外还发现个问题,wxAcceleratorEntry有个ToString方法,当其中的Key Code是除了字母、数字外的其他的可打印字符时,会断言失败,太Orz了,只好自己写代码转换了。

实现关系视图,使用gcc编译

  Relation视图可以算是完成了,至少是处于可用的状态了。基本原理就是调用cscope这个程序,本来这个程序是开源的,而且是用BSD许可的,比较干净的做法是把代码拿来编译进自己的工程里。不过我懒得研究那个代码怎么编译了,直接调用现成的可执行程序,通过管道获取其输出,然后自己解析一遍输出内容,显示在relation视图上。这样看来这该是个很容易实现的功能,但是实际上我却花了不少时间。原因是我一开始考虑得过于简单,把所有工作都放在一个singleton中完成。既要生成新进程,又要获取管道输出,同时还要兼顾老进程没有结果又有新进程的请求到来。于是总是在同时有多个进程时崩溃。后来把新老进程调试和获取管道输出分别放在两个类中实现,就都好了。
  另外还有个问题是用gcc编译。现在这个版本基本上也到了收尾的阶段,我也买了个Mac Mini,希望能把它移植到Mac OS X上。Mac OS X上可以用gcc,于是我就先尝试在Windows XP上用gcc编译这个工程。这些天一直在折腾这事,总是由于这样那样的原因失败。到今天为止,终于可算是正常通过了,有几点需要记一下。我一直用boost svn trunk中的代码,绝大多数时候,用VC编译链接都是没问题的,可是这次用MinGW中的gcc 4.4.0把boost.thread链接到工程中时,仍然会报有几个符号找不到,如果是用正式发布的1.43.0版本的Boost,是可以正常链接通过的。gcc不支持在函数体内定义结构体(类),VC9是可以的。gcc在用boost.lambda时有些情况会编译不通过,就是几个结构体内的成员被lambda bind后再进行比较的情况,但是VC9是能编译通过的,而且也不是所有这种bind并比较都不能编译过,具体的还得继续研究一下。总的说来,gcc对类型检测比较严格,呃,说难听点,是比较死板,不如VC那么智能。还有种情况是gcc编译wxString::Format时,如果第二个参数开始传入的是wxString,运行时会出错,但它又报不上来,基本上就是直接崩溃,VC在这方面又做得好得多,不过这点我估计是受不同编译器对对象内存布局不同引起的,所以也许gcc真是无能为力,VC那样可以用算是歪打正着吧。
  好吧,总之最头痛的两件事算是解决了。

发现QT Animation Framework

  昨天在看QT的examples和demos的时候,猛然发现一组animation framework的示例,看了一下居然就是我一直在纠结在寻找的如何用QT做出那些酷炫界面的方法。话说其实之前也不时地翻一下QT的这些demo的,怎么就没发现呢!
  看了一下程序的运行效果和代码,并配置着读了一篇animation framework的使用介绍,对如何使用QT做出那些动画效果有了一个简单的认识。今天跟@zhangh109讨论时了解到,苹果的系统使用Cocoa core animation functions来达到这种目的,而Android好像没有现成的,要开发人员自己实现。
  到此为止,基本上解决了绝大部分的技术问题,剩下的主要是设计决策了。

想写个twitter客户端

  昨天下午和晚上都在看代码,对QT的使用有了更多的了解,不过还缺少一本能跟上最近QT变化的比较系统的教材。QT在这几年变化比较大,而最近最流行的一本讲QT使用的书,是2006出的《C++.GUI.Programming.with.Qt4》,都整整过去4年了,QT都快出4.7了,这几年新加入QT的内容才是真正令人激动的。
  一直有种想写个twitter客户端的冲动,不过一直没动手,因为手头正经事情还很多,还要留下不少时间去堕落。不过我想待现在手头这个东西完成后,就试着写写吧。昨天去折腾了一下QOAuth,结果它依赖QCA,而QCA又依赖OpenSSL,真是折磨人。
  再花点时间研究一下用QT怎么做一些比较酷的界面效果,就可以动手啦!

重复发明了个不咋样的轮子

  今天看到推友@liancheng说Mozilla/WPF/QT/GNOME3都同质化了,大体的意思是指这几种方案都把表现层和逻辑层分离得很独立,复杂的,高度重用的,平台相关的部分,用C/C++之类的语言实现成组件,表现层用XML描述界面,用CSS之类的样式描述skin,再用如JS之类的脚本语言描述运算逻辑粘合组件和界面。
  我最早了解到这种架构是几年前Firefox开始大肆流行,网上这类技术文章也大量涌现。当时也是很惊叹于Firefox的扩展机制如此灵活,却对它的开发环境很是鄙视,而且用于表述逻辑的脚本语言是用JS这个我完全没了解过的东西,所以看过介绍后,就丢到一边了。后来也偶尔听说WPF、XAML之类的东西,但对.NET一直没啥好感,于是也没研究。最近几个月跟个网友讨论,提到QT的界面方案,大体上也是知道QT也采用这种架构了,而且也确实一直计划着做完眼前的这组东西后,以后全面转向QT了,但仍一直没抽出时间来研究。
  今天看到@liancheng的讨论后,让我有点儿沮丧。我现在用C++/wxWidgets做主框架,好不容易设计并实现了一个并不精巧的插件机制,用Lua来编写逻辑,还总是有这样那样的限制,这不就是典型的重新发明轮子么,而且发明的是个不咋样的轮子。唉!

Get Adobe Flash playerPlugin by wpburn.com wordpress themes