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

Visual Studio 6.0 的 AutoText 插件

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2001 年 3 月 4 日

viewsIcon

117811

downloadIcon

1491

将 MS Word (tm) 的自动文本功能添加到 Developer Studio (tm)

Sample Image - DeveloperStudioAutoText.gif

引言

我个人使用这个工具已经大约一年了,它工作得很好。在阅读了 CodeProject 上的一些文章后,我觉得我应该为社区贡献一些有用的东西。所以,它来了……

这个插件为 Visual Studio 添加了一个 AutoText 功能,类似于 MS Word (tm) 中的功能。它可以在键入时替换拼写错误或用完整文本替换缩写词。这可以用来缩写难以输入的名称;例如,UNUSED_ALWAYS(我缩写为 ua)。或者纠正常见的拼写错误;例如,键入 TURE 并将其替换为 TRUE。

当前版本:Version 1,0,0.1 (2001年2月21日)
如有更新,我将在此发布。


安装

您可以下载 DeveloperStudioAutoText_src.zip 文件自行编译,或者直接下载可直接使用的版本 DeveloperStudioAutoText_addin.zip,然后将 DeveloperStudioAutoText.dll 文件复制到 c:\Program Files\microsoft visual studio\common\msdev98\addins 或您安装 Visual Studio 的相应位置。
  1. DeveloperStudioAutoText.dll 复制到您想要的任何位置。一个不错的位置是在 Microsoft Visual Studio 文件夹下的 Common\MDev98\AddIns
  2. 打开 Visual Studio,选择:Tools | Customize...
  3. 转到 Add-ins and Macro files 选项卡,然后单击 Browse 按钮。
  4. 转到您复制 DeveloperStudioAutoText.dll 的文件夹并选择它。确保 "files of type" 列表框设置为 "Add-ins (.dll)"。
  5. 关闭对话框时,将出现一个工具栏,上面有 AutoText-Configuration 按钮(大写 "T" 下面有小写的 "Auto")和一个标记为 "H/C+" 的按钮,该按钮在 C(++) 和 .H 文件之间切换。
    与其他工具栏按钮一样,您可以将此按钮移动到任何其他工具栏。
  6. 按左侧按钮(带有 "T" 的那个)来设置 AutoText 替换表。在这里,您可以启用/禁用插件,方法是切换 Enable AutoText 复选框的开/关。
  7. Replace 编辑框中输入要替换的文本,在 With 编辑框中输入要替换成的内容。然后按或单击 Add New 添加它。
  8. 使用 Delete 按钮可以删除不需要的条目,如果替换文本已存在,Add New 按钮将变为 Replace,以便您修改现有条目。
  9. 按下 OK 按钮后,所有设置都将写入文件 %windir%\DSAutoText.CFG,实际上这是一个标准的 .INI 文件。您可以手动编辑它(它的语法非常直接:在 [Substitutions] 部分,等号左侧是原始文本,右侧是要替换成的内容。
    你不应该修改 WordListState。这包含列表视图的设置(列宽和顺序)。
  10. 在键入时,插件会监视空格和开括号。当您输入任何这些字符时,它会搜索其替换列表,并在找到合适的匹配项时,用替换文本替换您输入的单词。
  11. 如果替换的文本不是您想要的,只需使用编辑/撤销或按退格键将其删除,然后重新键入原始文本。下次输入停止字符(空格或括号)时,它会询问是否替换,您可以通过按 ESC 或选择 DON'T REPLACE 来取消替换。
    Replace with question menu


工作原理

加载时,它会尝试识别主窗口和 MDIClientArea 窗口(方法 CDSAddIn::OnConnection)。有趣的部分如下:
   //First find the main window
   hWnd = ::GetActiveWindow();
   while( hWnd  &&  hWnd != hDesktopWnd )
   {
       m_hDevStudioWnd = hWnd;
       hWnd = ::GetParent(hWnd);
   }

   GetWindowText( m_hDevStudioWnd, szWindowTitle, 512 );
   
   if( strstr( szWindowTitle, "Microsoft Visual C++" ) )
   {
      m_wndDevStudioMainWindow.SubclassWindow( m_hDevStudioWnd );

      // The MDIArea always has ID 0xe900
      m_hDevStudioMDIArea = GetDlgItem( m_hDevStudioWnd, 0xe900 );

      m_wndMDIAreaManager.SubclassWindow( m_hDevStudioMDIArea );
   }
m_wndDevStudioMainWindow.SubclassWindow( m_hDevStudioWnd ); 对 DevStudio 主窗口(类 C_DevStudioMainWindowFilter)进行子类化。这是必要的,因为否则它会将某些光标移动转换为 WM_COMMAND 消息。但由于我们需要光标消息,因此我们将其拦截。

还有一个类 C_DevStudioMainWindowFilter,主要用于轻松获取活动 MDI(又名文本编辑器)窗口并处理菜单和普通按键。

关于是否需要替换的决策过程可以在 C_ActiveMDIWindowFilter::OnSpecialKeyPressed() 中找到。值得注意的是对 m_bEnableAutoCorrect 的处理,它决定是自动替换输入的文本,还是询问用户是否应该替换(在用户按 delete 后,它将被设置为 FALSE,并在按下停止字符时恢复为 TRUE)。

实际替换发生在 CheckAutoText() 中。如果 bAutoReplace 为 TRUE,则在可能的情况下文本将立即被替换。否则,只会返回替换文本(如果可用)。如果用户输入的文本没有可以替换的内容,则返回值将为空,文本不会改变。

已知问题

在某些系统上,MsDev6 在使用宏/插件时,在从同一文本窗口复制文本后,向编辑器粘贴文本(Edit/Paste)时存在问题。
据我所知,可以通过添加以下注册表项来禁用新的堆管理器来解决此问题(至少在我的同事的系统上有效)。
使用 regedit 添加此项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\MSDEV.EXE
然后在下面添加一个名为 DisableHeapLookaside 的字符串值,并将其设置为 "1"

此插件使用 Visual C++ 6.0 Service Pack 4 构建。我也在 Service Pack 3 上对其进行了测试,它在那边也运行良好,所以我认为它不会与其他 Service Pack 存在问题。

有关更多信息,请参阅知识库中的 Q231652Q195009

版本历史

版本 1,0,0.1
首次公开发布。

致谢

对主窗口进行子类化的最初想法(但不是技术)也借鉴于 Code Guru 上找到的一个插件。但一年多过去了,我忘了是谁了。抱歉。

一些版权声明摘自 Yuri Tkachov 的增强型窗口列表提交。我希望他不会介意。

此外,我必须感谢我的公司(MicroMotion GmbH),允许我使用他们的设备(以及一些工作时间)来编写这个插件。(顺便说一下,这个插件不符合内部编码标准 - 这是一个业余项目)

关于 Christoph Weber

Christoph Weber 是 MicroMotion GmbH 核心开发团队的成员。
他已经用汇编/C/C++(以及其他一些语言)编程了 18 年,用 Visual C++/MFC 和 ATL 编程了 6 年。
© . All rights reserved.