原文:http://my.oschina.net/isixth/blog/385092
SC设计的目标:
SC是一个简单的基于DirectUI的界面库。设计SC,主要是基于个人爱好与学习的目的。在本人学习C++的这几个月来,将一点点收获与理解。想通过设计SC来进行提升与巩固。是一个重复造轮子的过程,也是一个个人学习提高的过程。
在学习C++的同时,也感到用C++做开发,界面设计,是一个基础且必须要做的事。优秀、成熟且系统性的有QT等,开源的更是不少,但学习与了解别人的代码,看是一个基础,自己写,能更深刻地掌握基础。所以想通过自己的学习和积累,逐步地,累积性地开发设计一个基于DirectUI的一个SC库。并希望SC完成后,通过开源等方式,发布在网络上,让其他C++爱好者一起来交流DirectUI方面的经验。使自己的C++知识及SC库相对慢慢提高与完善,并让SC达到实用的目标。
因此,设计SC的目标可以总结为以下几点:
1. 学习与提升;
作为一个C++语言的初学者。现在从头开始学习C++,在学习了最基本的C++知识后,希望通过在动手开发SC的过程中,能更多地理解掌握好C++语言和一些系统相关的基础知识。
开发SC,是个人爱好和个人学习的目的,是基于本人有足够精力和时间的基础上进行的。有重复造轮子的嫌疑,是个人的选择。也是提高自己的一种方法之一,我选择这种方法,是基于自己的爱好与精力而为之。
在开发语言更方便,更智能,集成度更高的今天,如果简单地将开发语言作为一个工具,久而久之,就会失去学习与提高的动力。语言过多地工具化时,也会使工作变得枯燥,无趣。甚至会慢慢变得吃力。因此,自己动手写些相对更基础的东西,有另外一份乐趣和挑战性。
2. 分享与交流;
网上有很多基于DirectUI的开源代码。我也大概了解和学习了一下。在吸取别人经验的基础上,自己再动手开发一个,虽然是多此一举,但对提高和消化知识,很有帮助。如果SC在别人的基础上更进一步,对DirectUI开源来说,也是好事。SC会基于开源与共享的目标,可以提供给别人参考了解的一个机会,也能让自己在别人的指点下,进一步的提高。虽然到目前为此,我仍还不知道如何进行开源发布,但这也是慢慢学习的第一步。
3. 实用与推广;
有些开源项目,由于无利可图,开发者经常是半途而止。这是正常现象。SC将来也会这样。但这不重要。开发SC的目标,是交流、学习与提高。在此基础上,通过一段时间的积累与完善,让SC能达到实用的目标。也算实现了个人最初想法。如果将SC作为一个基础,让它能应用到自己将来要开发的项目上,并持之以恒地不断完善。甚至在此基础上开发一个PRO版甚至商业版,通过推广能获取收益。也是再好不过了的。总之,有希望将SC做更好,但也顺其自然。个人目标是半年的开发学习,半年的完善提高。之后将会如何,再看时间与精力。也看SC的水平与程度。有计划,也看实际情况,再说再说。
4. 基于个人爱好;
学习一门开发语言,是一个枯燥的开始,找个目标让自己起步,会增加动力。有人学习为更好地工作,有人学习是因为爱好,我是基于兴趣爱好,也是为了打发时间。定个SC的计划与目标,是让事情能看起来有点希望,实现起来有个步骤。每个人都应该有点梦想,万一实现了呢。再说,SC不是个什么梦想,只是个简单的想法,能走到哪一步,根本是不知道的。基于最初最好的想法开始,才会有更多更新的动力去实现。首先,他不是一个坏事,其次,他是一个学习的过程,有学习才有进步。
SC名称的解释:
SC: “S”可以是Sub
或 Simple的意思。”C”可以是Compact的意思,也可以是 Component的意思。”C”也可以理解为C语言。”SC”大意是简单紧凑的C++语言界面组件库。
SCW: “W”意指Windows。SCW或
SC(W)是指支持Windows平台的SC库。不同的平台使用不同的后缀字母,如
SCM: 指 SC MacOSX平台下的SC库。SCA:指Android平台下的SC库。SCU:指
Ubuntu平台下的SC库。等等。以后有能力再针对这些平台开发对应的SC支持库。当然这种可能性不大,个人精力与时间不够,知识更也不够。所以可能性不大,但先这么设定了,谁知道呢,万一有可能呢,也不一定。
SC的任务:
SC是个基本于DirectUI的界面库。他无法去跟商业化,企业化的产品作比较。这方面,QT, WPF,国内UIPower的DirectUI等会是你最好的选择。SC像其他的开源作品一样,更多的是立足学习与交流。他不会同于已有的开源DirectUI,也不会局限于DirectUI。SC会集合更多的经验,参考与学习更多的别人的长处,并结合个人的理念与设计,成为一套不一样的DirectUI界面库。
首先,得知道基于C++的DirectUI界面库,应用会越来越少。更多的开发,都转向了Web。如果PC不死,仍是有人会用得到的,这就是开发SC的基本动力。至于是多是少,暂且不去考虑。
现在做开发,都想跨平台!SC也想实现多平台,但,能力有限,有想法,但无法实现。所以,SC,先从我们最熟悉的Windows开始。在能完成Windows下的实现为基础,再说别的。所以设计时,会基于可实现多平台的构造着手。至于能否真正实现多平台,先不作过多的计划。
由于本人只学会了VC,所以SC的基础,是从基于VC的Windows平台下实现的DirectUI界面库开始的。起步的局限性是难免的,但走出第一步也是很重要的。
做任何事,都得有目标,更得有计划。这个规划,就是计划实现的第一步。规划中的前几部分,我在学习C++时,已基本掌握,也逐步实现。中间几部分,也在慢慢努力,不久之后也会实现。后几部分,是将来的规划,可能实现,也可能不会实现。SC虽然是我的学习与爱好。但我会把他用到我个人的其他小软件与项目的开发中。所以,实现SC的实用性,也是我的目标之一。
SC的规划:
1. 基础框架
作为SC的基础库,这部分代码尽量实现平台无关性。SC中的基础类,常用通用函数等,兼顾将来所谓的跨平台,尽量使用STL库,学习参考已有的成熟代码,结合自己的想法来实现。在Windows平台下,为提高自己的开发效率,部分内容会先使用VC库已有的一些代码来达到目标。
基础框架包括:一些宏的定义;数据类型的通用性定义;CObject类及反射机制的实现。通用型常用函数库集合,一些其他模块(如绘图,窗体,组件等)的基础类……等。将SC组件共用的属性与行为进行基类的封装。
包括:CPointer, CPointF, CRectF, CPathF, CComponent, CControl, CForm等。
2. 系统平台支持
主要以IApplication应用程序接口类,实现主程序的启动、退出、窗口创建、消息处理等,构建一个能实现跨平台的基础框架。
使用服务继承的方式,产生抽象的IApplication应用程序接口类,规划IApplication的通用事件等。
通过继承IApplication先实现CWinApp类。完成基于Windows实现主程序的消息处理,窗体创建,鼠标与键盘服务接管等。
3. 绘图引擎
作为界面显示输出与代码实现的中间层,绘图引擎采用纯虚的图像设备上下文来封装应用程序的绘图动作。包括点、线、面、区域、图像等绘制,以及一些常用的特效、变形等。提供通用的入口,对具体的绘图实现进行封装。再根据平台不同,采用不同的绘图引擎来进行模块实现。
通过CCanvas类,提供绘图纯虚函数,再派生出CGDICanvas, CDirect2DCanvas等实现类。来完成 GDI+与Direct2D的绘图引擎,达到界面输出的目的。
支持 bmp、png、jpg、gif、tga等图片格式;支持多图层Alpha混合特效。
4. UI逻辑
基于DirectUI理念,以窗体为主体,实现无句柄的组件。将图片、字体、图像、样式、光标等资源进行统一的管理,并共享与优化资源,以最小的内存占用,最高的绘图效率实现窗体组件的状态变化,区域的刷新、界面的初始化绘制、窗体的重绘等。
通过在内存中完成绘制,再一次性输出到显示终端的方式,来实现更快速的界面绘制与重绘。
包括实现鼠标移动,点击,按键等输入变化引起的界面变化的一些基本逻辑操作。
通过CControl类负责处理所有控件共用的各种UI逻辑。
5. 事件处理
实现消息接管,分发消息等。封装窗体、容器、组件之间的鼠标移动、点击、用户按键等操作处理。实现组件的位置移动、大小变化、拖曳响应等操作的封装。
6. 界面布局
窗体内、容器内子组件之间的位置、对齐、停靠等,可以通过 Control的Layout属性,方便实现组件在容器或窗体间的布局。再通过引用层的概念,方便高效地实现组件在窗体中的顶层底层的显示、组件覆盖的透明化、组件背景的毛玻璃化等特效。
7. 主题(换肤)引擎
支持窗体及所有控件的换肤;提供资源方式、文件方式、设计时方式等多种模式的主题及换肤。可实时实现全局或部分组件的换肤。使界面更具个性化和美观性。
8. 多语种实现
提供所有组件的标准文本输出与资源的多国语种的管理,并提供动态切换语种与更新文本显示的功能。
9. 特效
通过绘图引擎与渲染技术,实现显示与切换特效。
组件与文本显示特效:透明、阴影、模糊、变形、倒影等。
基本的切换特效:淡入淡出,左右上下滑入滑出等。
图片显示的各种特效:如百叶窗、翻页、水滴、波纹等
10. 标准组件
完成一些基于DirectUI实现的最常的基本组件。如文本,按钮,图像显示,输入框,勾选单选框,容器,列表框等。
包括:
Label/GlyphLabel, Button, RadioBox, CheckBox, Menu, PopupMenu, TrayIcon, Timer, Panel, Bevel, Line, ProgressBar, TrackBar, ImageView, ListBox, TreeBox, Edit, ComboBox……
组件具有可扩展性。可以基于基本组件,设计出具有更丰富功能的派生组件。
11. 扩展、定制组件**
一些有特定功能,或具有更丰富功能的强大组件。
类似 ExcelGrid, RichEdit, HTMLView富文本显示等组件。
12. 打印输出
实现文本与图像的打印输出功能。提供样式设置,纸张选择,打印机设置等基本选项的实现。
**在后继支持数据库的情况下,提供更丰富、更强大的数据库报表格式设置。
13. 可视化界面设计工具 SDK**
提供界面设计工具 SDK,支持拖拽式界面设计,让界面开发所见即所得;
14. 文档**
文档包括:设计文档、开发日志、BUG修复日志、升级日志、帮助文档、使用说明等,博客文档。
15. 数据库部件、组件**
提供基于数据库的纯虚抽象类。CDBConnect, CDataset, CDataSource等。派生出基于MySQL, SQLServer, Orecle…等数据库的连接与管理的基本操作类,如数据的显示、新增、插入、删除、查询、筛选等。并将数据操作响应与基本组件进行连接。
提供更丰富的数据库打印与报表生成模块。
16. PRO(商业)版**
让基础版SC库达到能开发一般性小工具类与应用类软件的目标。在此基础上,如有可能与必要的前提下,设计基于基础SC库的加强版或商业版。
SC的时间计划:
作为个人爱好与兴趣,SC的开发是自由散漫的,没有详细的时间日程,但会有一个大概的实现计划。鉴于一个人的能力与精力有限,规划中目标实现的预期效果也是无法保证的。2015年从现在开始的一整年时间内,已计划在保证其他正常生活不受影响的情况下,尽可能多地投入时间来实现SC库的完成。SC作为一个懒散的个人年计划,在学习与兴趣中慢慢实现。
要求在设计与学习过程中,尽可能地多写好日志。并定期对阶段性的任务作总结及文档整理。对关键性的东西,可以写成文档或手记作为备案。良好的文字记录,强于好记性。在学习中打发时间,这样想想,一年也就很快过了。
大体时间安排如下:
3月份:
整理前几个月的学习资料及已完成的代码。规范设计文档,完成规划中1-3项的工作。
4月份:
完成规划中4-8项的工作。并学习了解如何进行开源发布。将已完成的代码提交到开源网站。并与兴趣爱好相投的朋友进行交流与学习。以便进一步完善规划与代码。
5月份:
完成规划中9-10项的工作。主要完成10项“标准组件”中最常用组件的实现与测试。
并在此基础上完成一个或多个基于标准组件的简单示范小程序。
6月份:
通过开源与其他爱好者进行更多地学习与交流。整理与完善已完成的代码,丰富其他未完成的功能。
继续完成“标准组件”中未完成的部分。整理相关文档。并着手开发一至二个特定组件。
7月份:
利用SC库,开发一个基于SC库的小工具,暂定为日历、事件提醒、桌面背景等功能的小软件。以此着力检验SC在UI美观设计与基本功能实现效率上的表现。
8月份:
基于SC库,开发一个图片浏览器软件。以此学习了解更多关于图片格式处理、图片显示特效等相关的知识。
9月份:
九月本人计划旅游与休息的月份。暂不作过多的安排~~。如在旅游中产生什么灵感,或时间还有充裕,再安排一年中余下几个月的计划。休闲的一个月,也是存储能量的一个月。
10月-12月:
完善或开发SC规划中12项以后的部分。
本人不太了解如何开源与发布源码。欢迎有了解的朋友留言提供帮助。
有兴趣的朋友也可以加Q或群进行交流:
QQ群:177312461 个人QQ:48018276