[源代码]WIN32 SDK界面研究<1>:模仿Windows命令行或telnet客户端的窗口

来源:互联网 发布:手机视频剪辑软件中文 编辑:程序博客网 时间:2024/06/15 21:28

前言:

MFC丰富的控件对于一般程序员来说可以快速构建自己的程序,把开发的重心放在应用的功能实现上。但是程序界面问题一直是MFC程序的软肋,相信用过MFC的人相信都没有少受MFC自绘界面的痛苦。自从转行做了售前,不写程序已经有8年多了,最近难得闲了下来,于是装了VS2010,不为别的,就为重拾一下多年的编程兴趣。

 

立项:

纯粹兴趣编程的感觉真好,前一阵子研究了一下Google V8引擎,确实是个好东西。于是想弄个JS的动态执行环境,需要一个类似Window命令行的窗口,实时输入,实时执行。

 

分析:

实现这样窗口,最坏的方案就是定制EditRich Edit控件,如果这样做,程序很难实现自己想要的界面风格,而且在输入控制上将会遇到非常大的麻烦,你会发现不管怎么努力都很难完全截取所有的输入事件消息。在网上搜了一下,发现一个非常NB的开源文本编辑控件Scintilla,支持语法高亮,丰富的文本风格,几乎全面支持UltraEditVisual Studio编辑器的所有功能,但研究了一段时间后发现,Scintilla唯一的问题是不支持输入事件拦截,无法实现将光标限定在最后一行,而且Scintilla的代码实在是太庞大了...百般无奈之下,只好借鉴Scintilla的思想,基于WIN32 SDK自制一个文本控制控件!

 

设计:

1) win_base

WIN32 SDK编程最大的困难就是创建每一个窗口都是靠一行一行代码写出来的,根据我这个阴谋论者的分析,估计是微软想要把很多程序员绑定到MFC上,这样就离不开Visual Studio,离不开Windows了。win_base类目的就是模仿MFC,把创建窗口和处理窗口消息封装到一个基类中。

 

2) text_container

顾名思义,这个类就是文本容器核心类,主要封装了以下功能:

    修改和获取:Insert, Remove, Get等基本的文本编辑处理

    选取和标记(Select,Mark)Select是选择一段连续的文本;Mark是标记屏幕上一个矩形区域的文本

    内存画板(Canvas):设置好显示风格之后,类会自动构造一个内存DC并完成文本的绘制工作,应用直接将内存DC复制到窗口的DC上即可实现文本在窗口中的显示

    视图管理(View):和实际的窗口视图对应,并提供对滚动条的支持

    光标显示(Caret)move_caret, show_caret

 

3) win_cmd

win_basetext_container派生出来的命令行窗口类,负责获取用户的所有输入事件,限制光标固定在最后一行,解析用户输入的命令,完成相应的处理后将结果显示到窗口视图中。

 

4) 特殊特性

I. 自动换行。可以通过text_container.set_max_canvas_width(width)来设置内存画板的最大宽度,超过这个宽度的文本将会动态自动换行显示。

  

II. 最后一行输入。最后一行为命令输入行,光标限定在最后一行移动,只有最后一行文本才可以进行编辑。

 

III. 文本选取。可以通过鼠标左键拖拽标记(Mark,不可编辑)屏幕上的一个矩形区域文字,按shift键可以选取多个矩形区域。假如命令行中的文本被标记,则其他已标记文本会被清空,命令行中已标记文本会变成selected状态(可编辑)

 

 

改进:

这个代码只是个半成品,因为在选取屏幕内容的时候发现了严重的性能问题,参考Scintella的代码时发现居然是用DirectDraw来绘制图像的。

 

代码链接:http://download.csdn.net/detail/cooljjyy/4502104


------------------------------------------------------------------------------

做快乐程序员,请远离MFC

微软把MFC封装得太死,以至于很多灵活的功能难以实现 :)

原创粉丝点击