DevStudio 的 Window Tabs (WndTabs) 插件





5.00/5 (35投票s)
1999年12月3日

375644

7328
Visual C++ 的窗口和文件管理插件
这些下载的最新版本可以在 www.wndtabs.com/downloads 找到
概述
现在大多数人都知道 WndTabs 是什么了。如果您不知道,我建议您访问概览页面,其中还重点介绍了每个版本的新功能。
总的来说,WndTabs 是一个适用于 Visual C++ 5/6 和 eVC 3(以及某种程度上 eVC4 *)的插件,它为 Visual Studio MDI 工作区添加了一个急需的标签条。这些标签不仅仅是窗口切换工具,还提供了许多有用的文件和窗口管理功能。
还可以在线访问功能导览。建议新用户和有经验的用户都看看!
3.1 版花絮
WndTabs 的源代码基础非常庞大(将近 30,000 行,不包括扩展模块),一篇文章无法完全覆盖。因此,我想重点介绍最新版本中添加的内容。
安装程序
虽然这不是一个程序员话题,但我还是想分享我在安装程序领域的经验。
WndTabs 3.0x 版本是使用我用 InstallShield 创建的 MSI 安装程序发布的。无论 InstallShield 作为开发平台有多好或多坏,有些东西它是无法改变的,那就是 MSI,底层技术。MSI,对于那些不知道的人来说,是微软的安装程序技术/安装平台。它支持高级功能,例如按需安装(如您在 Office 中看到的)和自动修复,以及更简单的安装任务。
我将跳过冗长的细节,直接说结论:**对于小型、基于网络的软件产品,MSI 不适用**。以下是一些原因(没有特定顺序)
- 它有 bug。没有更好的说法了。而且它很神秘。用户可能会收到“*系统管理员已设置策略以阻止安装*”之类的错误,而实际上并没有这样的策略。在这种情况下,解决方法是删除一个更神秘的注册表项(WndTabs 的 `HKEY_CLASSES_ROOT\Installer\Products\A7AC1985CAF0BB64FB37E18FB2A89724`)。这对您或您的用户都不好。
还存在许多其他 bug,我不会在这里一一列出。如果您好奇,可以查看安装常见问题解答(标记为“3.0x 版本”的问题),了解我经常需要处理的一些其他问题。
- MSI 的另一个脑残功能是用户需要保留源安装包才能卸载。如果您的产品随 CD 附带,这没问题(安装程序会要求您放入 CD,这没问题)。但是,如果您从网上下载了安装程序,然后将其删除或移动(这是用户常做的事情),您将无法卸载该软件。另外,这个问题也影响“补丁”安装。
- 小抱怨 - 在 MSI 中编写除了最简单的安装程序之外的任何内容都是一场噩梦。即使有 InstallShield 等工具在您身边也是如此。
正如您所料,支持方面的噩梦最终促使我使用不同的安装程序,我对此非常满意。再次强调,MSI 通常不一定邪恶,但我建议,如果您选择它作为您的安装工具,请确保您做好功课并知道自己在做什么。
用户界面本地化 - 多语言的 WndTabs
WndTabs 3.10 中最大的变化之一是添加了本地化功能。对于我们说英语的人(至少作为最终用户)来说,这可能不是一个大功能。然而,随着全球经济日益发展,我们许多人会发现自己需要多语言用户界面。
首先,我想提一下,WndTabs 仍然支持 Win9x,所以它不使用 Unicode(是的,我知道 Win9x 有一个 Unicode 版本,但我真的不需要另一个支持噩梦)。下载其语言包的用户需要为其语言使用适当的代码页。如果您的产品适用于 NT 类操作系统,那么 Unicode 是最佳选择。
它是如何实现的
本地化主要基于一个名为 `AfxSetResourceHandle()` 的出色小 MFC 函数。MSDN 对此函数的实用性有点模糊,给出以下描述
使用此函数设置决定应用程序默认资源加载位置的 **HINSTANCE** 句柄。
本质上,`AfxSetResourceHandle()` 允许您指示 MFC 从主可执行文件/DLL 之外的其他位置获取所有资源。例如,如果您有一个包含以下条目的字符串表
IDS_WELCOME "Welcome"
您可以创建一个包含以下字符串表条目的资源 DLL(例如 `French.dll`)
IDS_WELCOME "Bienvenue"
然后您将使用 `AfxSetResourceHandle()` 根据需要获取法文字符串
CString cStr; cStr.LoadString(IDS_WELCOME); // cStr is now "Welcome" // make the French resources the default resources AfxSetResourceHandle(AfxLoadLibrary("French.dll")); cStr.LoadString(IDS_WELCOME); // cStr is now "Bienvenue"
它变得更好了
正如我所说,MFC 在查找资源时会使用指定的资源 DLL。但至少对于一种资源(字符串),如果在资源 DLL 中找不到任何内容,它会自动“回退”到您的可执行文件/DLL。在我们之前的示例中,假设 `IDS_WELCOME` 在法语 DLL 中没有定义。在这种情况下,最终的 `LoadString()` 将导致 `cStr="Welcome"`(MFC 将在资源 DLL 中找不到 `IDS_WELCOME`,所以它只会从主资源中获取)。但是,不要期望位图或对话框有这种行为。这很不幸,因为这意味着(除非您想花大量时间围绕这个问题进行编码),您需要将所有位图包含在语言 DLL 中,即使它们与主资源中的位图相同。
自行加载资源
最后一点。如果您想在使用 `AfxSetResourceHandle()` 后手动加载资源,您应该使用 `AfxGetResourceHandle()` 函数获取活动资源 DLL 的指针。
翻译了什么(和没有翻译什么)
在此版本中,只翻译了对话框、菜单和字符串表。任何带有英文字符的位图仍将是英文的(尽管如果有时间,这些也很容易解决)。
一个未解决的大领域是帮助文件。翻译帮助文件需要翻译人员付出巨大的努力。这些人是自愿将 WndTabs 翻译成他们的母语,除了感谢之外别无所求(谢谢大家!),我不想让他们工作量太大。还需要进行代码更改,因为我必须升级我的 HTML 帮助子系统以支持多个帮助文件。我决定,如果翻译包获得巨大成功,我将在下个版本中投入时间来本地化帮助文件。
互联网键盘
v3.10 中的一个不错的新功能是支持互联网键盘。这些键盘具有额外的键,例如后退、前进、停止等。勤奋的用户 Frank Fesevur 提出了这个功能,并好心地给我发了一个 MSDN 链接。总而言之,这些键盘通过一个新的消息调用 `WM_APPCOMMAND` 工作。增强的输入设备将发送此消息,LPARAM 值包含按下了哪个特殊键以及消息来自哪个设备的信息(请参阅下面的注释)。以下是处理此消息的一些示例代码
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ... //}}AFX_MSG_MAP ON_MESSAGE(WM_APPCOMMAND, OnAppCommand) END_MESSAGE_MAP() ... LRESULT CMainFrame::OnAppCommand(WPARAM wParam, LPARAM lParam) { // see which special button was pressed const int cmd = GET_APPCOMMAND_LPARAM(lParam); switch (cmd) { case APPCOMMAND_BROWSER_BACKWARD: { // do something return TRUE; // return TRUE to indicate that we processed the button } case APPCOMMAND_BROWSER_FORWARD: // .... case APPCOMMAND_BROWSER_STOP: // .... } // This was a button we don't care about - return FALSE to indicate // that we didn't process the command return FALSE; }
最后一点——只谈论键盘是片面的。任何设备都可以发出 `WM_APPCOMMAND` 消息。例如,我确定 Microsoft Intellimouse 就是其中之一。
WndTabs 源代码
WndTabs 提供完整源代码。除了上面讨论的主题,代码还展示了以下技术- 编写处理事件和导出命令的 DevStudio 插件。
- 使用 AddInComm 库与其他插件交互。
- 通过使用子类化“窃取”其他窗口的事件。
- 安装和使用系统消息钩子(SetWindowsHookEx)。
- 枚举 shell 命名空间 / 完全支持文件上下文菜单,包括难以捉摸的“发送到...”菜单。
- 使用通用控件(标签、图像等)
- 使用基于 MFC 模板的集合(CTypedPtrArray、CTypedPtrList 等)。
- MFC 应用程序中 HTML 帮助集成的可重用组件!
- 使用 MFC 访问互联网文件。
- 使用特定于语言的资源 DLL。新增!
- 为直接和拨号上网用户不显眼地通过网络检测版本更新。
- 行业小技巧
- 运行时更改的对话框。
- 将您的配置存储在注册表中。
- 以及更多...
有什么新内容
下面我列出了此版本 (3.10) 和上一个版本 (3.05) 中的新功能和修复。您可以在此处找到完整的版本历史记录。
标记为WndTabsExt的项目与 WndTabs 扩展模块的功能相关。版本 3.10 (2002年6月17日)
- 新功能:完全支持本地化菜单和对话框。
- 新功能:“复制文件名(不含路径)”命令已添加到剪贴板命令中。
- 新功能:支持互联网键盘进行标签循环和其他命令。
- 新功能:鼠标中键现在可以映射到任何 WndTabs 命令。
- 新功能:Shift+关闭按钮 ("X") 现在执行“关闭除外”。WndTabsExt
- 新功能:右键单击关闭按钮显示上下文菜单。WndTabsExt
- 新功能:来自不同目录的文件分组可以限制为仅来自同一项目的文件。1 WndTabsExt
1 必须安装免费软件 Workspace Whiz! Interface package 才能使用此功能。 - 新功能:分组标签上的按钮现在可以排序。WndTabsExt
- 新功能:添加了用于按标签顺序循环切换窗口的新命令。
- 改进:来自不同目录的文件分组更准确。WndTabsExt
- 改进:调试器中单步执行时闪烁现象大大减少。
- 错误修复:在极少数情况下,某些 WndTabs 命令如果通过键盘快捷键激活,可能会导致崩溃。
- 错误修复:从选项对话框禁用时,关闭按钮仍然有效。WndTabsExt
- 错误修复:使用关闭按钮 ("X") 关闭资源标签页会关闭所有资源。WndTabsExt
- 错误修复:更好地处理名称中带有与号 ("&") 的文件。
- 错误修复:启用 WndTabsExt 时,窗口限制功能失效。WndTabsExt
- 错误修复:如果先前打开的文件被删除,加载工作区可能会导致 WndTabs 挂起。
- 其他小错误修复。
版本 3.05 (2001年6月19日)
- 新功能:高级标签控件上的标签页的关闭 (“X”) 按钮。WndTabsExt
- 新功能:没有分组的标签页现在可以带有迷你工具栏,以保持标签页外观一致。WndTabsExt
- 错误修复:无法通过选项对话框设置前缀/后缀修剪字符。
- 错误修复:当更新选项对话框中的某些标签样式时,自动行计数功能导致问题。
- 错误修复:WndTabsExt 注册在某些系统上不起作用。WndTabsExt
注意
请务必查看 WndTabs 网站,那里更有可能找到更新和测试版http://www.wndtabs.com