65.9K
CodeProject 正在变化。 阅读更多。
Home

具有各种 UI 组件的类似 DevStudio 的应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.68/5 (16投票s)

2010 年 6 月 24 日

CPOL

5分钟阅读

viewsIcon

34862

downloadIcon

7095

一个 MFC 应用程序,包含语法着色文本编辑器、类似 DevStudio 的工具栏、状态栏和输出窗口,以及多线程计算

引言

在本文中,我将介绍我最近开发的一款学术应用程序 WinCalcCT,它是我的研究成果。它接受极小-极大函数(min-max functions)的描述文件(我稍后会解释),然后根据请求计算这些极小-极大函数的周期时间向量。该应用程序利用了 MFC 的文档/视图架构。由于极小-极大函数的描述文件(*.mmf)是文本文件,因此视图类(CWCTView)主要实现了文本编辑器所需的功能。然而,与 *.cpp 文件类似,*.mmf 文件也有其语法,尽管简单得多,所以我们需要一个语法着色编辑器。此外,我们需要一个地方来显示计算结果,那就是输出窗口。更重要的是,为了避免在计算过程中冻结用户界面,需要使用多线程。所有这些功能现在都已在 WinCalcCT 中实现。

WinCalcCT 具备上述功能,非常类似于一个极度简化的 Microsoft Developer Studio,并且考虑到这一点,我已尽力使 WinCalcCT 中 UI 组件的外观尽可能地像 DevStudio。幸运的是,我无需从头开始,因为有许多其他作者设计的类可以重用。

我推测许多 MFC 开发人员会欢迎我的应用程序,因为他们经常会被分配类似的任务,而我的源代码可以提供一个很好的起点。

背景

此应用程序源于我之前的研究“关于极小-极大函数建模的离散事件系统”。一个二维极小-极大函数的例子是 F[x1,x2]=[min(x1+2,max(x2,x1+4)), max(x1-3,x2)]。这类系统(或函数)的一个关键性能指标是它们的周期时间向量,或简称为周期时间,它指示了它们的吞吐量。在数学上,给定一个极小-极大函数 F,其周期时间存在且唯一。一个高效的,可以说也是唯一实现的算法由作者本人设计并发表在学术期刊上(详情请参阅源代码包中的 readme.txt)。

语法着色编辑器

除了语法着色外,此版本的 WinCalcCT 文本编辑器还支持键盘编辑、文本滚动、光标显示、选区处理和显示、剪贴板剪切/复制/粘贴、文本查找等功能。我的下一个任务是添加文本替换以及编辑的撤销和重做功能。

值得一提的是,CWCTView 类是从 CView 派生的,而不是像许多人预期的那样从 CEditViewCRichEditView 派生。选择 CEditView 是因为不支持语法着色,尽管 CRichEditView 支持语法着色,但我发现 CRichEditView 中的文本相当难看。事实上,Microsoft Visual Studio 本身也采用了与我相同的做法,您可以使用 Spy++ 进行确认。

据信,我的语法着色实现非常独特。通常,在渲染文本之前会有一个分析(或解析,针对语法)阶段。在 WinCalcCT 中,没有独立的分析阶段,甚至没有表示已分析或已解析文本的数据结构。这并非意味着这是一种更好的方法,但至少我可以认为它简化了代码编写,并且对于基于行的语法(而不是基于块的语法),比如大多数汇编语言和许多脚本语言,这可能是一个可行的选择。

CWCTView 当前不支持将制表符显示为四个或八个空格,并将空格视为单个编辑单元。这是因为在我们的上下文中不需要此功能。添加此功能可能需要大量工作。

snap.png

输出窗口

一个真正的 Windows 输出窗口非常方便且有用,许多人都想要它。WinCalcCT 的输出窗口设计用于显示只读文本消息。新输出字符串会追加到旧内容之后。使用输出窗口与使用字符控制台的 printf() 一样简单。在主线程中,要显示字符串 str 到输出窗口,只需写入:

AfxGetMainWnd()->SendMessage(WM_USER_NEW_OUTPUT, 0, (LPARAM)(LPCSTR)str) 

WinCalcCT 中,输出字符串由工作线程发出,因此需要将应用程序主窗口对象的指针包含在线程参数中。

输出窗口的非客户端部分(或框架)基于 Cristi Posea 的 CSizingControlBar 类。但是,我对代码进行了一些修改,使框架更具 DevStudio 风格,外观更专业。输出窗口客户端部分的代码是我自己的工作。这花费了我不多时间,因为它几乎只需要 CWCTView 的一部分功能。

其他有用的 UI 组件

WinCalcCT 中类似 DevStudio 的工具栏是对 Joerg Koenig 编写的 CToolBarEx 类的微小修改。类似 DevStudio 的状态栏基本上是我基于 CStatusBar 的原创作品,尽管我从许多其他状态栏作者那里获得了灵感。我使用了 Chris Maunder 的进度条,未做任何修改。

多线程计算

工作线程创建以及主线程和工作线程之间同步的相关代码很大程度上基于 Jeff Prosise 的著作“Programming Windows with MFC”。我添加了代码来处理用户尝试在文档计算过程中关闭文档的情况。

Using the Code

CWCTView 类不用于派生,开发人员可以将其相关代码复制到自己的代码文件中。请注意,尽管 CWCTView 基于 CView,但即使它基于 CWnd,其几乎所有用户界面功能仍然适用。

要使用输出窗口,请确保在项目中包含 OutputFrm.cppOutputWnd.cppOutputWndCaret.cppOutputWndScroll.cpp 文件,并在主框架窗口的 OnCreate 方法中创建输出窗口。

CDevStatusBar 类也不用于派生。开发人员应具备对我的代码的相当程度的理解才能重用它。

© . All rights reserved.