研究界面的三个阶段

界面方面的研究,经过了三个阶段:传统Win32窗口、Win32窗口的子类化自绘、无窗口界面开发(directui)。这三个阶段有交集,大致还是按照时间推移不断提高的。

第一阶段:04-05年当时处于研究生实习时期,在导师公司做gis平台开发,对于界面要求不高,但也有一些定制性开发,那个时期基本上就是上codeproject,学习常规窗口编程技巧,那些api能做那些事,会引起什么效果,有那些附带作用,久而久之就知道做一个效果最直接的办法是组合那些api。当时自绘的工作不多,但是长时间的反复调用控件会让人厌烦,当时看了arcgis的平台里面开始使用网页做一些界面,限于当时的知识,无法获取研究的途径。后来我知道了一个叫BCG的界面开发库,从它开始进入了自绘阶段。

第二阶段:06-07年一开始是对BCG界面库的研究,说起这件事,觉得泄露的代码对我国软件开发水平的提高有很大帮助。BCG界面库在当时模拟的是office2003界面风格,模拟的很像但它的代码自身并不是非常清晰,模块的划分不一目了然。他在当时是把开源的CJLib打垮了,不过随后又被CJLib的商业公司Codejoke干翻,直至最后跟VC8的mfc弱弱联合,仓促间形成一个mfcx,就现在来看使用的公司很少。Codejoke的xtp也是以泄漏的方式才能有机会学到,他的界面组件划分比较合理,代码很清晰,尤其是其中的skinframework框架,单独拿出来编译一个dll即可实现常规窗口的换肤,皮肤格式可以和xp的兼容。也是他,让我彻底放弃常规窗口的子类化自绘的工作,转而是研究他的实现,因为他已经做到极致。后来我08年的毕业设计也是以他为基础,题目是软件构造方面的,各种形式的界面插件构造软件框架。在这个时候qq已经向无窗口发展了,这时候我得到了directui的概念,开始了无窗口界面方面的研究。

第三阶段:07-现在。最开始是研究http://www.viksoe.dk/code/windowless1.htm这个开源,相信很多人都知道也研究过。他抽象了一些无窗口的界面元素,翻译常规窗口消息解释并重新派发给无窗口元素,引入了一些ddraw特效,当时能接触到这样的代码很兴奋,界面初看起来很震撼,尤其是主界面的动画效果。他也有很明显的缺点:不支持unicode,pretytext的计算有问题,本地窗口跟无窗口的布局混合会遮盖。基于他,我做出了自己的第一个界面框架,并应用在公司商业化产品中,可以从这里欣赏:http://www.cppblog.com/wlwlxj/archive/2007/08/28/31014.html。由于他对Windows的封装和无窗口元素的抽象并不是很强大,所以想要真正的用它做很强大的界面框架有困难,后来看qq、迅雷的界面,感觉到之前的界面元素并不通用,且缺少动态的能力,有一些想法在这个帖中提及:http://hi.baidu.com/wlwel/blog/item/ad08bfc8108ff78dc9176808.html。我后来想自己可能需要的是网页那种动态能力的界面,对图形图像的处理,以及界面的动态布局拖拽,我想起手里的Win2000泄漏代码,于是乎开始了一件疯狂的事情:移植其中的ie部分代码,只要其中的界面引擎,带上css和滤镜,支持各种交互事件,这就是我当时的想法。历时8个月,出来的成果:http://www.cppblog.com/wlwlxj/archive/2009/06/28/88695.html。这一次失败了,没法商业化应用,有很多问题,按钮的焦点有1像素偏差,css由于那个ie版本比较低,非常有限且不规范,滤镜由于一个组件创建不成功且无代码没法使用。整理的代码有30多兆,代码本身结构不清晰,砍掉的地方也非常多且很乱,最终我也没有能力去继续修改。中间有很多次的放弃,又不服气继续,最终走了下来。这一次研究对我最大的帮助就是在一个巨大的软件代码中,如何找到自己想要的东西,如何大刀阔斧的砍代码。里面就像大观园,技术很全,学到的东西太多太多。后来我意识到网页有网页布局的特点,桌面软件有桌面软件的特点,需要的地方互操作即可。接下来,我又研究了几个月comctl32部分,最后发现研究edit button需要走到ntuser部分,甚至想要朝显卡驱动调用方面走,就打住了,当然也有一些成果:http://www.cnblogs.com/wlwel/archive/2010/05/10/1732160.html,是一个失败的研究,但是学到了很多东西。有段时间我甚至刻意的躲避界面开发,直到后来接触到Chrome浏览器,看了他的开源。

针对Chrome开源所做的工作

Chrome开源,主要是抽取其中的view部分代码,依赖的有他的base、gfx、skia、app部分,我把base分成了base、message_framework、rfc_algorithm,skia用gdiplus替换合并到gfx,app划分到animation和view_framework,去掉linux以及mac平台的支持部分,去掉了一些不需要的功能比如网页拖拽相关,形成了一个最小的开发框架,并修改了标题栏自绘的一个bug。Base部分起初想用boost替换,后来发现工作量很大,还是没敢做。截图如下:

所有整理代码下载

后续工作

继续增加控件、功能、修改现有代码中的一些注释的问题。接受所有的批评和建议,但不要人身攻击。希望能看到更多其他人的作品,现在的开源世界太丰富,很多东西不是接触不到,而是肯不肯静下心来研究。

注:工程是2005的,额外需要的头文件<vsstyle.h> <vssym32.h>可以从vc2008的sdk中拷贝或者任意其他地方下载。2008直接转换即可编译。

from:http://www.cppblog.com/wlwlxj/archive/2011/03/20/142246.aspx

http://www.cnblogs.com/lidabo/p/3644475.html

时间: 2024-10-16 14:28:49

研究界面的三个阶段的相关文章

王立铭、饶毅、张向南三人谈:“大学的意义”

撰文 | 王立铭(浙江大学生命科学研究院教授) 责编 | 李晓明 其实从感情角度说,我支持几位教授的忧虑和呼吁. 我是一个晚辈科学家和大学教授,我热爱我的工作,我也觉得探索未知世界真的是这世界上最美好的事业.平心而论,如果我的学生有一天告诉我,他或者她对自己的研究心生厌倦,或是在锱铢必较地比较两份工作合同的薪水高低,我应该也会觉得有点沮丧和失望.我也同样相信,我们这个古老国家的复兴历程里,离不开科学精神的再次启蒙,离不开基础研究的兴盛发达. 但是就像罗素说过的,须知参差多态,乃是幸福的本源. 我

物联网,后会无期?

懵懂男孩一见钟情“物联网” 就在四年前的这个夏天,一个懵懂的男孩在翻阅着报考指南上的相关专业,突然他的手指停留在一个叫做物联网工程的专业上,接着他马上搜索了关于物联网的百科,虽然他还不完全懂那上面所有的描述,但他内心隐隐觉得这个专业将是主宰未来的力量. 于是他就进入了本省一所二本学校的物联网工程专业,大学的日子里是轻松的,同时大学的日子是迷茫的,在大学的开始他曾试图进入学校的一个期刊单位做网络维护,但是学长的几个面试问题他都诚实而且毫不犹豫的回答了“没有”,那几个问题回忆起来也是很清晰,“你有过

2017年最新 web前端开发学习路线

第一阶段--HTML的学习HTML的中文全称为超文本标记语言,它是一个网页的框架,不论是动态网页还是静态网页最终返回到浏览器端的都是HTML代码.浏览器将HTML代码解释渲染后呈现给用户,因此我们必须掌握HTML的基本结构和常用标记及属性. 其实学习HTML本身就是一个一个记忆和理解的过程,我们在学习的过程中可以借助Dreamweaver的"拆分"视图来辅助学习,然后在"设计"视图中看效果,最后,在"代码"视图中学本质,将各种视图 的优势发挥到极

Java内存管理-程序运行过程(一)

勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine(Java虚拟机)!本系列会开启对JVM相关的知识的探索和总结,让我们一起踏入JVM的学习之旅中,去了解和发现更加精彩的Java世界! 正如奥古斯特·罗丹 说过:世界上不是缺少美,而是缺少发现美的眼睛.Java的世界也是如此! 本文地图: 1.什么是程序 在计算机领域当中,程序就是为了能够让计算机执行

酷派之路:三个阶段重构手机市场

   今年1月8日,酷派发布大神F1手机. 这款手机拥有国内首款真八核.1300万/500万的后/前置摄像头,以及康宁大猩猩OGS全 贴合技术的屏幕.2GB容量的RAM等等配件参数.不过,这些纯硬件的技术和配置都不是 这款手机的最大优势,其888元的官方售价才是这款手机的最大亮点,因为这款手机的 官方售价只有888元. 可能连酷派官方都没预料到,这款手机会在未来半年多的时间里给中国智能手机市场带 来前所未有的影响力. 因为888元的定价,以及一流配置的机身参数,这款手机使得2014年中国智能手机

关于dom 事件冒泡、捕获 dom事件三个阶段

本文主要解决两个问题: 什么是事件流 DOM事件流的三个阶段 起因 温故了一下我的<JavaScript高级程序设计>的时候,翻到DOM事件那一章,(说实话,现在无论是什么框架你都离不开操作DOM啊,毕竟这是你展示的最基本元素,就像人的细胞).想起了dom事件流原理,好多人不明白,只知道click mouseout等实用场景,真要理解和更进一步的前端是要必须:理论+实践 并行的. 当然,DOM事件所囊括的知识较为庞杂,所以本文专注与自己学习时所碰到的难点,DOM事件流. 流 流的概念,在现今的

js的事件的三个阶段,事件委托的原理

DOM2级事件规定的事件流的三个阶段:捕获,目标,冒泡(IE8以及更早版本不支持DOM事件流); 事件流: IE:IE事件流是事件冒泡流  Netscape事件流是事件捕获流 IE事件流 叫做事件冒泡,即事件开始时由最具体的元素(文档中嵌套最深的那个节点)接收,然后逐级向上(一直到文档).事件捕获与事件冒泡事件流正好相反的顺序,事件捕获的事件流是最外层逐级向内传播. 使用DOM0级方法指定的事件处理程序被认为是元素的方法,处理程序是在元素的作用域进行的,程序中this是引用的是当前元素 btn

从黑格尔的正反合理论看人生的三个阶段

著名哲学大师黑格尔在总结事物运动的规律时曾提出过一个正反合的理论,其实也就是说事物在生命的进程中的不同阶段会反映出三种不同的思维方式. 那么,什么是正,反,合呢?我们先来解释一下. 正就是一种正面的思维方式就是那种,健康的,渐进的,向上的,光明的,理想化的符合常规逻辑的;反就是一种逆向的思维方式,叛逆的,丑恶的,负面的等;合呢?就是一种综合的,全面的,中庸的.其实,简单的说就是两个极端思维和一个中间思维. 那么,人生的正反合是怎么表现的呢?三个阶段是如何划分的呢? 正的阶段:就是我们20岁以前的

JS引擎线程的执行过程的三个阶段(一)

浏览器首先按顺序加载由<script>标签分割的js代码块,加载js代码块完毕后,立刻进入以下三个阶段,然后再按顺序查找下一个代码块,再继续执行以下三个阶段,无论是外部脚本文件(不异步加载)还是内部脚本代码块,都是一样的原理,并且都在同一个全局作用域中. JS引擎线程的执行过程的三个阶段: 语法分析 预编译阶段 执行阶段 一. 语法分析 分析该js脚本代码块的语法是否正确,如果出现不正确,则向外抛出一个语法错误(SyntaxError),停止该js代码块的执行,然后继续查找并加载下一个代码块: