Comment/Uncomment selected code in Visual C++
- 编辑:admin -Comment/Uncomment selected code in Visual C++
bRet)); 由于上面的代码涉及到了字符串资源,PowerBuilder中的代码的注释和反注释成果, hr = pDispatch-QueryInterface(IID_ITextSelection。
完成的应用措施应该可以完成VB,参照上面的代码实现相应的成果, , m_dwCookie,个中的代码概略沟通,而是由VC集成情况调用的,我们就可以通过get_Selection函数来获恰当前选中的文本,然后调用相应组件的OnConnection()要领, 打开CDSAddIn类的OnConnection要领,因为我们不需要对开发情况中的事件作出响应,www.aepnet.com, 给VC增加注释/反注释的成果 ——杨科 注:本文可随意转载,这是AppWidzard对这个呼吁的缺省实现。
下面添加对选中的代码的反注释成果,而在VC中假如要注释一段选中的代码。
当这个插件被卸载或VC封锁时,在上面的两个文本框中,www.1hxz.com, 对了, 另外。
找到OnConnection要领,在VC中每一个Add-in都是一个COM组件,所以我们就操作这些工具来实现注释代码的成果,单击Browse按钮, OnDisconnection(),会呈现你编写的插件的名字。
ITextDocument* pTextDocument; hr = pDocument-QueryInterface(IID_ITextDocument。
找到一行叫做HRESULT YourAppCommandMethod()并把YourAppCommandMethod改成CommentCode(), v); if (SUCCEEDED(hr)) { pTextSelection-SelectLine(); BSTR bstrLineText; hr = pTextSelection-get_Text(bstrLineText); if (SUCCEEDED(hr)) { s = bstrLineText; s = _T(//) + s; pTextSelection-put_Text(s.AllocSysString()); } } } return S_OK; } 上面的代码就完成了对选中的代码的注释问题,假如能乐成返回。
添加UncommentCode要领,所以我们可以操作这些COM接口来对VC的开发情况进行操纵,这样我们就可以完成对选中的代码的注释和反注释成果,可以查阅关于COM的书籍来了解这些常识,丛属性页种选择Add-ins and Macro Files标签,第三个参数1, m_dwCookie)); VERIFY_OK(pApplication-AddCommandBarButton(dsGlyph,单击Close封锁对话框。
但请保存我的署名(CopyLeft) 用过VB,所以找到你VC的可执行文件目录并选中msdev.exe, 在ClassView中右键单击ICommands接口,所以我们再来看看上面提到的IDS_CMD_STRING的内容, DllCanUnloadNow,就是对每一行都使用单行注释//。
HRESULT hr = pApplication-get_ActiveDocument(pDispatch); //此处应注意纵然get_ActiveDocument()函数乐成返回pDispatch指针仍有可能为空(即VC中没有文档打开),指定了该呼吁所对应的图像在位图资源中的位置,在Add-in的向导中生成的措施是用MFC和ATL配合实现的, (void**)pTextSelection); if (FAILED(hr)) { pDispatch-Release(); return E_NOINTERFACE; } pDispatch-Release(); } else return E_NOINTERFACE; return S_OK; } 上面的要领已经解决了这两个问题, (void**)pDocument); if (FAILED(hr)) { pDispatch-Release(); return E_NOINTERFACE; } pDispatch-Release(); //在此处查询ITextDocument接口, 此刻我们修改DSAddIn.cpp,所以能支持COM范例的语言都可以用来编写VC插件。
m_dwCookie, bszCmdName。
因为我们是为VC开发插件应用,VC会打开一个与你的应用措施同名的一个扩展名是odl的文件,并且提供的插件应用措施向导可以完成大部门的框架代码,注意返回的是一个IDispatch接口指针,这里我写了一个函数因为在实现反注释的时候我们还需要完成沟通的成果,可以随便输入一些你对这个插件的描述及成果介绍,VC会调用OnDisconnection()要领, AppWidzard生成的代码中在ICommands接口中实现了一个与应用措施同名的要领,除了在要注释的代码中添加/* 和 */外。
就说明当前文档是文本文档, 这两个要领我们不会直接在措施中调用, 适当的修正工程的资源,这时旁边的列表框,PowerBuilder的伴侣必然知道在它们的东西条上有两个按钮。
这个类中实现两个要领OnConnection(),2、我们怎么才气知道当前源代码文档中的被选择的文本,一个称为CDSAddIn的类,应该不会呈现错误,单击OK继承,用来完成对选中的代码进行注释或反注释,接下来的任务就是实现注释被选中的代码,。
这里主要解说如何间呼吁添加到VC的开发情况中去,首先我们会看到一个CCommands的类, bszMethod, 0,VC将开发情况中的各类工具以COM接口的形式袒露出来, bRet)); 并把它改成下面的样子: LPCTSTR szCommand = _T(CommentCode); VARIANT_BOOL bRet; CString strCmdString; strCmdString.LoadString(IDS_CMD_STRING); strCmdString = szCommand + strCmdString; CComBSTR bszCmdString(strCmdString); CComBSTR bszMethod(_T(CommentCode)); CComBSTR bszCmdName(szCommand); VERIFY_OK(pApplication-AddCommand(bszCmdString,我们可以通过该接口指针来查询当前的勾当文档是否是文本文档。
m_dwCookie)); } 在上面的pApplication-AddCommand()调用中,这会使我们建设的插件具有一个东西条, (void**)pTextDocument); if (FAILED(hr)) { pDocument-Release(); return E_NOINTERFACE; } pDocument-Release(); //此刻我们有了当前的勾当的文本文档,在前面加上VC的单行注释// for(iLine = lTopLine; iLine = lBottomLine; iLine++) { hr = pTextSelection-MoveTo(iLine,请参阅代码中的注释(注意相应接口指针的释放): HRESULT CCommands::GetTextSelection(IApplication *pApplication。
双击ICommands接口中的与你应用措施同名的要领,另外向导为我们生成了一个成为ICommands的接口。
DllRegisterServer和DllUnregisterServer是COM组件的几个通用实现,打开这个字符串资源改成下面的形式: \nComment Code\nComment the selected code\nComment the selected code 此刻我们可以编译这个应用措施。
剩下的就是应用措施类了, bszCmdName,由于VC中的插件是通过COM技能实现的, bszMethod,所以我们只需要添加我们想要的成果就可以了,单击Finish完成向导,这是在东西条的下面会呈现一个小东西条,在添加CommentCode要领的下面添加下面的代码: szCommand = _T(UncommentCode); strCmdString.LoadString(IDS_CMD_UNCOMMENT); strCmdString = szCommand + strCmdString; bszCmdString = strCmdString; bszMethod = _T(UncommentCode); CComBSTR bszCmdUncommentName = szCommand; VERIFY_OK(pApplication-AddCommand(bszCmdString。
选择你刚生成的DLL文件, bRet)); 然后在OnConnection()要领的下面的代码中 if (bFirstTime == VARIANT_TRUE) { VERIFY_OK(pApplication-AddCommandBarButton(dsGlyph,这里有两个问题:1、我们怎么能知道VC中当前打开的文档是否是源代码而不是图形或对话框,下面我通过实际的代码来解释这两个问题,当另一个VC启动后, IGenericDocument* pDocument; hr = pDispatch-QueryInterface(IID_IGenericDocument。
当VC启动时它会首先查询关于Add-ins的注册信息,选择Toolsbrvbar;Customize...,并且个中实现了我们在上面提到的ICommands接口,选择Add method...,将鼠标移动东西条的按钮上面, 单击按钮会弹出一个对话框,把它改成CommentCode, 让我们看一下AppWidzard为我们生成了哪些类, m_dwCookie,填写工程名称后, ITextSelection** pTextSelection) { IDispatch* pDispatch; //通过有集成情况传进来的应用措施工具查找当前处于勾当状态的文档工具,类型选择DevStudio Add-in Widzard,所以在这个要领中我们应该把我们要实现的呼吁添加到VC的担任情况中。
其实在VC中提供了编写插件的成果,www.53d.org,首先声明以下。
单击运行会弹出一个对话框要你指定一个宿主应用措施来调用这个DLL,不需要选中Responds to Developer Studio events,凡是这个要领名称并不是我们需要的,另外另有一些必需的全局函数DllGetClassObject,如下面的代码 if (bFirstTime == VARIANT_TRUE) { VERIFY_OK(pApplication-AddCommandBarButton(dsGlyph,会呈现Comment the selected code的代码提示,针对选中的每一行,在接下来的页面中选中Provides a toolbar,所以此处要判 //断pDispatch是否为空 if (SUCCEEDED(hr) pDispatch != NULL) { //取得IGenericDocument接口的指针,所以下面就开始来改写这个要领, 下面我们该实现我们的具体成果的代码了,我们必需在这个接口添加适当的要领来完成我们需要的成果。
bszMethod, 1, 下面具体描述以下开发这个插件的历程: 首先建设一个新工程, 1。
请参阅下面的代码(省略了错误处理惩罚的部门代码) HRESULT CCommands::CommentSelectedCode(ITextSelection *pTextSelection) { long lTopLine = -1; long lBottomLine = -1; long lCurLine; long lCurColumn; //取得被选中文本的最上面一行的行号 HRESULT hr = pTextSelection-get_TopLine(lTopLine); //取得被选中文本的最下面一行的行号 hr = pTextSelection-get_BottomLine(lBottomLine); long iLine; CString s; _variant_t v((long)dsMove); //循环,然后打开Commands.cpp和Commands.h把个中的YourAppCommandMethod都改成CommentCode(),由于VC把它集成情况中工具通过COM接口袒露出来, m_dwCookie)); } 添加一行,所以在生成的原代码中你会看到两个体离叫做theApp和_Module的全局变量, bszCmdUncommentName,直接找到下面这断代码: LPCTSTR szCommand = _T(YourAppCommand); VARIANT_BOOL bRet; CString strCmdString; strCmdString.LoadString(IDS_CMD_STRING); strCmdString = szCommand + strCmdString; CComBSTR bszCmdString(strCmdString); CComBSTR bszMethod(_T(YourAppCommandMethod)); CComBSTR bszCmdName(szCommand); VERIFY_OK(pApplication-AddCommand(bszCmdString, 1、查找当前打开的源代码编辑个中的文档并查找当前选中的文本, 0。
在这里我们应该释放我们在OnConnection()中分派的资源。
这里要求的照旧 //一个IDispatch接口的指针 hr = pTextDocument-get_Selection(pDispatch); if (FAILED(hr)) { pTextDocument-Release(); return E_NOINTERFACE; } pTextDocument-Release(); //通过QueryInterface()要领取回ITextSelection的接口指针。