CodePlotter 重构 1.6 - 独立版本,适用于 VC6、.NET、Delphi、C++ Builder 和 VB 开发者






4.86/5 (66投票s)
2003年7月18日
8分钟阅读

169005

2468
一个“Visio 类”的工具,
前言
为了避免那些可能(出于任何原因)抱怨这不是新项目的人,我有以下三点要说明:
- 我承认这并非一个全新的项目(请参阅原始文章)。
- 但是,如果我不将其重新发布到“工具”部分,那么那些请求它的人(.NET、Delphi、C++ Builder 等用户)将找不到它。
- 如果您花时间阅读本文,您会发现其中有一些方面与原始文章中的方面完全不同。
引言
当我最初将 CodePlotter 编写为 VC6 插件时,我非常清楚 .NET 用户可能也对类似的工具有兴趣。
但当时我没有看到解决此问题的简单方法,除非编写一个 .NET 特定的插件。
因此,秉持鸵鸟精神,我忽略了这个问题,直到被迫处理为止。
后来,一两个 .NET 用户发表评论,表达了对 VC7/.NET 的 CodePlotter 插件的兴趣,我便知道我必须处理这个问题,尤其是因为有这么多人为它投票。
现在,我曾短暂涉足 VC7 插件的开发,当时我试图将 ProjectZip 移植到 .NET,那真是一次可怕的经历!
我不知道微软在重新设计 VC7 的插件架构时是怎么想的,但它肯定不是为了 VC6 插件的可移植性——在我尝试的短时间内,我根本无法理解其对象模型。
幸运的是,一位也涉猎 VB 和 Delphi 的 C++ Builder 开发者向我伸出了援手,并要求提供一个独立的可执行文件。
我认为这闻起来像一个不容错过的机会;而且可能还能让我不必编写 .NET 移植版本。
还有一位发帖者要求将 CodePlotter 插件中的模态对话框改为非模态,这样他就可以在绘制图表时滚动代码。然而,这会产生另一个问题,因为插件依赖于选择不改变,以便它可以将编辑后的图表粘贴回原始图表的顶部。
因此,可执行文件开始看起来是一个绝佳的解决方案,尽管它会失去与 VC6 的紧密耦合,但这将被独立应用程序的灵活性大大弥补。
CodePlotter 重构
第一个成型的设计是用户
- 将代码中的图表复制并粘贴到 CodePlotter 界面中
- 编辑图表
- (以某种方式)复制图表并将其粘贴回代码中。
我认为这还可以,但缺乏 VC6 插件的一些精细之处,VC6 插件在如何使用对象模型的选择机制来选择和替换代码图表方面更加流畅(回想起来,这个功能也是它最大的限制,因为用户无法在代码中的任何其他地方插入图表,除非手动复制并粘贴它)。
我让它搁置了一段时间,后来当我更深入地思考这个问题时,我发现我的大脑已经将“复制和粘贴”与“剪贴板”联系起来了。
这并非一个极其令人兴奋或印象深刻的飞跃,但无论如何都是一个有价值的飞跃,因为它让我就剪贴板的程序化使用提出了假说,这可能是解决问题的最后一块拼图;这块拼图可能会赋予它迄今为止所缺失的流畅性。
于是我搜索了我所有的旧代码,看看是否有可以让我开始的东西,我偶然发现了以下片段:
OpenClipboard(); CString sText((LPCTSTR)::GetClipboardData(CF_TEXT)); CloseClipboard();
天哪,我想,肯定不会这么容易吧(我敢肯定你们中的一些人会迫不及待地告诉我它应该有多么困难),但事实就是如此。
所以,我所要做的就是通过 SetClipboardViewer()
确保 CodePlotter 在剪贴板内容更改时收到通知,然后我就准备好了。
在我基本实现并运行起来之前,还有一个最后的问题没有解决:如何防止用户每次想编辑图表时都手动运行 CodePlotter,同时又不让它占用任务栏上的宝贵空间。
你猜对了——我们的老朋友系统托盘前来帮忙。
它的工作方式如下:
- 您在每个会话中第一次想要使用 CodePlotter 时需要手动启动,除非您将其添加到启动文件夹中。
- 之后,它会作为图标驻留在系统托盘中,直到它检测到您刚刚将图表复制到剪贴板,届时它会显示出来,图表已解析。
- 编辑完成后,图表会自动复制回剪贴板,供您粘贴回代码中。
安装 CodePlotter 和……一样简单
- 将可执行文件放入您的“...\program files\microsoft visual studio\common\tools”文件夹中
- 从“工具|自定义...|工具”选项卡创建一个新的 CodePlotter 工具
- 将该工具添加到您的工具栏以方便访问
使用 CodePlotter
关于使用 CodePlotter 的简短教程,我将引导您参阅原始文章的同一部分。
仅独立版本包含的其他功能包括:
- 一个“复制”按钮,用于将当前图表复制到剪贴板,而无需关闭对话框。
- 用于退出或显示 CodePlotter 的系统托盘上下文菜单。
CodePlotter 内部
本节与原始文章相比基本没有变化,但为了避免复制代码,CodePlotter 可执行文件大量借鉴了插件项目。
这比听起来更重要,因为我在家也使用 Visual SourceSafe (VSS)。
问题在于,VC6 与 VSS 集成时,不允许在同一硬盘目录中存在多个项目(我曾设想在同一文件夹中有两个 .dsp 文件并自由共享代码)。
因此,我不得不使用两个不同的项目文件夹。
我知道,我想,我会很狡猾,使用 VSS 的共享功能,在每个项目文件夹中都拥有一份共享代码的副本。这样,每个项目似乎都有自己的副本,但实际上它们是同一个 VSS 文件。
半小时后,我才想起为什么这是一个非常糟糕的主意——如果文件在一个文件夹中签出,然后您从另一个文件夹签入,那么丢失更改并彻底搞砸(对于那些想知道我是否在骂脏话的外国人来说,“battered”的意思是“被打败”)就非常容易。
所以,在经历了大约 3 次错误的尝试后,我决定采取 KISS(保持简单,笨蛋)方法——CodePlotter 可执行项目将通过在 VC6 的 Workspace|Files 选项卡中包含文件来共享来自插件项目的代码。
这有什么意义呢?
嗯,标准的源文件没问题,我们一直都在这样做,但这是我第一次尝试共享 .rc 文件。
我早就知道 VC6,除非在极大的压力下并伴随着大量的咒语和奇怪的手势,否则不会让你在同一个项目中拥有两个 .rc 文件,所以我只是取消了默认的那个,然后像添加其他共享源文件一样添加了插件的 .rc 文件。
但随后我又遇到了另一个障碍,.rc2 文件(那个文件的意义到底是什么?我知道它的意图,但我发誓我从未见过一个应用程序使用它——请有人给我展示一个它真正的用途)。
问题在于 .rc 文件通过相对路径包含此文件——即相对于项目根目录——所以尽管我正在原始位置编译插件的 .rc 文件,预处理器却想在独立版本的文件夹中找到 CodePlotterAddin.rc2。
于是,我做了任何一个好的黑客都会做的事情。没错,我只是删除了它,让它消失,而且令人惊讶的是,它奏效了。差不多。
需要对 .rc 文件进行一些额外的修补以删除所有对它的引用,还需要一个假的 .tlb 文件来阻止预处理器发脾气(.tlb 文件是类型库,没有它,插件将无法导出与 VC6 通信所需的接口——我知道这一点,因为我也尝试过删除它!)。
进一步工作
- 键盘编辑
- 从与目标框相对的一侧开始时,路径查找得到改进(当前实现产生了一些非常违反直觉的解决方案)
- 菱形框
Copyright
代码在此提供给您无限制地使用和滥用,但您不能修改它并声称是自己的。
历史
- 1.0 初始发布
- 1.1
- 框文本的就地编辑(感谢 **=[ Abin ]=**)
- 改进的路径查找(感谢 **to_be_unknown**)
- 修复了与框移动时的大小调整相关的错误(感谢 **to_be_unknown**)
- 1.2
- 改进的图表验证(感谢 **sunil_g7**)
- 为所有非拖放编辑添加了上下文菜单
- 编辑框文本时可以使用 Enter/Escape 键
- 1.3
- 重构了 UI
- 可调整大小(并在会话之间记住)(感谢 **Anonymous**)
- 为希望使用 VB、NSBasic 或 C 语言进行开发的开发者提供了替代的注释样式(感谢 **Adrian Nicolaiev**)
- 1.4
- 上下文菜单中添加了“翻转连接”选项,用于反转连接的方向(感谢 **Ralph Wetzel**)
- 按 <F2> 键编辑所选框的文本(感谢 **Anonymous**)
- 1.6
- 修复了“复制”按钮错误(感谢 **Robert Etheridge**)
- 暂时删除了“调整框大小以适应”命令(感谢 **Robert Etheridge**)
- 连接的开始和结束处用箭头替换了“*”和“#”(由 **Robert Etheridge** 建议)
- 用户可以定义视觉页面宽度,以指导行长度(自动考虑任何前导注释的长度)(由 **Robert Etheridge** 建议)
- 一些小幅的速度改进