a) 自动添加文件注释 效果如下:
- /*
- * Copyright(C) 2012,Company 保留所有权利。( All rights reserved. )
- *
- * 文件名称:TEDlg.cpp
- * 摘 要:
- * 当前版本:1.0
- * 作 者:YuJian
- * 创建日期:2012年3月18日
- */
b) 自动添加函数注释 效果如下:
- //-----------------------------------------------------------
- //
- // 函数名称:CTEDlg::OnInitDialog
- //
- // 参 数: -无
- //
- // 返 回:BOOL
- //
- // 函数作用:
- //
- // 修改日期:2012年3月18日 By YuJian
- //
- //-----------------------------------------------------------
所使用的途径 是:编写宏
而在,编写宏之前,要给VS2005安装补丁文件 ,否则 vs2005无法执行宏
英文补丁 431M
安装好了以后,就可以编写自动注释函数的宏了。。。
由于是VB,以前没用过,因此借鉴网上的程序,自己根据需要稍微修改了下
1 建立宏项目
工具→宏→新建宏项目,输入文件名称,并选择要保存的位置
将下面的代码复制到Module1模块,保存。
- Imports System
- Imports EnvDTE
- Imports EnvDTE80
- Imports System.Diagnostics
- Public Module Module1
- ' --------------------------------------------------
- ' 生成文件说明注释
- ' --------------------------------------------------
- Sub FileDescription()
- Dim gAuthor As String = "YuJian"
- Dim gCompany As String = "Company"
- Dim outTextDoc As TextDocument
- Dim outText As EditPoint
- DTE.ActiveDocument.Selection.GotoLine(1)
- outTextDoc = DTE.ActiveDocument.Object("TextDocument")
- outText = outTextDoc.StartPoint.CreateEditPoint()
- outText.Insert("/*" + vbCrLf)
- outText.Insert(" * Copyright(C) " + Date.Today.Year.ToString() + "," + gCompany + " 保留所有权利。( All rights reserved. )" + vbCrLf)
- outText.Insert(" * " + vbCrLf)
- outText.Insert(" * 文件名称:" + DTE.ActiveDocument.Name + vbCrLf)
- outText.Insert(" * 摘 要:" + vbCrLf)
- outText.Insert(" * 当前版本:1.0" + vbCrLf)
- outText.Insert(" * 作 者:" + gAuthor + vbCrLf)
- outText.Insert(" * 创建日期:" + Date.Today.ToLongDateString() + vbCrLf)
- outText.Insert(" */" + vbCrLf)
- DTE.ActiveDocument.Selection.GotoLine(10)
- End Sub
- ' --------------------------------------------------
- ' 生成函数说明注释
- ' --------------------------------------------------
- Sub FunctionRemark()
- Dim preSpaceCount As Integer = 0 ' 注释前面的空格数, 缩进(单位:字符)
- Dim outTextDoc As TextDocument
- Dim outText As EditPoint
- Dim iCurrentLineNumber As Integer
- iCurrentLineNumber = DTE.ActiveDocument.Selection.CurrentLine '.ToString()
- outTextDoc = DTE.ActiveDocument.Object("TextDocument")
- outText = outTextDoc.StartPoint.CreateEditPoint()
- ' 移动文本输入点到指定行上
- outText.MoveToLineAndOffset(iCurrentLineNumber, 1)
- Dim strSpace As String = ""
- Dim iSpaceIndex As Integer
- For iSpaceIndex = 1 To preSpaceCount
- strSpace = strSpace + " "
- Next
- outText.Insert(strSpace + "//-----------------------------------------------------------" + vbCrLf)
- outText.Insert(strSpace + "// 函数名称:" + vbCrLf)
- outText.Insert(strSpace + "// " + vbCrLf)
- outText.Insert(strSpace + "// 参数:" + vbCrLf)
- outText.Insert(strSpace + "// - " + vbCrLf)
- outText.Insert(strSpace + "// 返回:" + vbCrLf)
- outText.Insert(strSpace + "// " + vbCrLf)
- outText.Insert(strSpace + "// 说明:" + vbCrLf)
- outText.Insert(strSpace + "// " + vbCrLf)
- outText.Insert(strSpace + "//-----------------------------------------------------------" + vbCrLf)
- End Sub
- ' --------------------------------------------------
- '
- ' 函数注释解析部分
- '
- ' --------------------------------------------------
- Public Structure ITEMDATA
- Public itemType As Integer
- Public itemText As String
- End Structure
- Public lItemList As New System.Collections.Generic.List(Of ITEMDATA)(4)
- Private Function ParseFunctionDescription(ByVal funText As String) As Boolean
- Dim strItem As String
- Dim idata As ITEMDATA
- Dim strSplit As String() = funText.Split("(")
- If strSplit.Length = 1 Then
- Return False
- End If
- '解析函数名称部分
- If strSplit.Length > 2 Then
- strItem = strSplit(strSplit.Length - 2).Trim()
- Else
- strItem = strSplit(0).Trim()
- End If
- Dim strHeadSplit As String() = strItem.Split(" ")
- strItem = strHeadSplit(strHeadSplit.Length - 1).Trim()
- idata.itemType = 1
- idata.itemText = strItem.Trim()
- lItemList.Add(idata)
- '解析参数部分
- strItem = strSplit(strSplit.Length - 1).Trim()
- If strItem.Substring(0, 1) <> ")" Then
- Dim iend As Integer = strItem.IndexOf(")", 0)
- Dim strParams As String = strItem.Substring(0, iend).Trim()
- Dim strParamSplit As String() = strParams.Split(",")
- For Each strItem In strParamSplit
- idata.itemType = 2
- idata.itemText = strItem.Trim()
- lItemList.Add(idata)
- Next strItem
- Else
- idata.itemType = 2
- idata.itemText = "无参数"
- lItemList.Add(idata)
- End If
- '解析返回值类型
- Dim iIndex As Integer
- For iIndex = 0 To strHeadSplit.Length - 2
- idata.itemType = 3
- idata.itemText = strHeadSplit(iIndex).Trim()
- lItemList.Add(idata)
- Next iIndex
- Return True
- End Function
- ' --------------------------------------------------
- '
- ' 根据函数声明生成注释
- '
- ' --------------------------------------------------
- Sub MakeFunctionRemark()
- Dim preSpaceCount As Integer = 0 ' 注释前面的空格数, 缩进(单位:字符)
- Dim outTextDoc As TextDocument
- Dim outText As EditPoint
- Dim iCurrentLineNumber As Integer
- Dim iLineLength As Integer
- Dim strFunText As String
- Dim iItemIndex As Integer
- Dim idata As ITEMDATA
- lItemList.Clear()
- iCurrentLineNumber = DTE.ActiveDocument.Selection.CurrentLine.ToString()
- outTextDoc = DTE.ActiveDocument.Object("TextDocument")
- outText = outTextDoc.StartPoint.CreateEditPoint()
- ' 移动文本输入点到指定行上
- outText.MoveToLineAndOffset(iCurrentLineNumber, 1)
- iLineLength = outText.LineLength
- strFunText = outText.GetText(iLineLength)
- iLineLength = strFunText.Trim().Length
- '但前行没有内容直接返回
- If iLineLength = 0 Then
- Return
- End If
- ' 解析函数名称
- Dim bResult As Boolean = ParseFunctionDescription(strFunText.Trim())
- If bResult = False Then
- lItemList.Clear()
- Return
- End If
- Dim pcount As Integer = 0
- Dim rcount As Integer = 0
- Dim strSpace As String = ""
- Dim iSpaceIndex As Integer
- For iSpaceIndex = 1 To preSpaceCount
- strSpace = strSpace + " "
- Next
- outText.Insert(strSpace + "//-----------------------------------------------------------" + vbCrLf)
- For iItemIndex = 0 To lItemList.Count - 1
- idata = lItemList.Item(iItemIndex)
- Select Case idata.itemType
- Case 1
- outText.Insert(strSpace + "// " + vbCrLf)
- outText.Insert(strSpace + "// 函数名称:" + idata.itemText + vbCrLf)
- outText.Insert(strSpace + "// " + vbCrLf)
- Case 2
- If idata.itemText = "无参数" Then
- outText.Insert(strSpace + "// 参 数: -无" + vbCrLf)
- outText.Insert(strSpace + "// " + vbCrLf)
- Else
- If pcount = 0 Then
- outText.Insert(strSpace + "// 参 数:" + vbCrLf)
- End If
- pcount = pcount + 1
- outText.Insert(strSpace + "// - " + idata.itemText + vbCrLf)
- outText.Insert(strSpace + "// " + vbCrLf)
- End If
- Case 3
- If rcount = 0 Then
- outText.Insert(strSpace + "// 返 回:" + idata.itemText + vbCrLf)
- outText.Insert(strSpace + "// " + vbCrLf)
- End If
- rcount = rcount + 1
- Case 4
- Case 5
- End Select
- Next
- outText.Insert(strSpace + "// 函数作用:" + vbCrLf)
- outText.Insert(strSpace + "// " + vbCrLf)
- outText.Insert(strSpace + "// 修改日期:" + Date.Today.ToLongDateString() + " By YuJian" + vbCrLf)
- outText.Insert(strSpace + "// " + vbCrLf)
- outText.Insert(strSpace + "//-----------------------------------------------------------" + vbCrLf)
- lItemList.Clear() '清楚所有元素
- End Sub
- End Module
将宏项目加载后, 在宏资源器中,便会发现该项目有三个宏方法:
FileDescription : 是为整个文件添加注释
FunctionRemark: 为函数添加注释------(很粗糙的 信息需要自己输入,这是中间函数 )
MakeFunctionRemark: 自动为函数添加注释
我们需要的是 FileDescription 和MarkFunctionRemark这两个宏函数。
分别双击它们,便可建立文件注释和函数注释。 不过,建立函数注释前, 光标必须位于函数定义处。
c) 对语句进行说明
- /****************************** add by yujian 2012年5月8日 10:19 *************************************/
- if (FontType&RASTER_FONTTYPE)
- {
- return TRUE;
- }
- /****************************** add by yujian 2012年5月8日 10:19 *************************************/
代码:
- ' --------------------------------------------------
- ' 生成函数语句说明注释
- ' --------------------------------------------------
- Sub FunctionRemark()
- Dim preSpaceCount As Integer = 0 ' 注释前面的空格数, 缩进(单位:字符)
- Dim outTextDoc As TextDocument
- Dim outText As EditPoint
- Dim iCurrentLineNumber As Integer
- ' iCurrentLineNumber = DTE.ActiveDocument.Selection.CurrentLine '.ToString()
- iCurrentLineNumber = DTE.ActiveDocument.Selection.TopLine
- outTextDoc = DTE.ActiveDocument.Object("TextDocument")
- outText = outTextDoc.StartPoint.CreateEditPoint()
- ' 移动文本输入点到指定行上
- outText.MoveToLineAndOffset(iCurrentLineNumber - 1, 1)
- Dim strSpace As String = ""
- Dim iSpaceIndex As Integer
- For iSpaceIndex = 1 To preSpaceCount
- strSpace = strSpace + " "
- Next
- outText.Insert(strSpace + "/****************************** " + " add by yujian " + Date.Today.ToLongDateString() + " " + Date.Now.Hour.ToString + ":" + Date.Now.Minute.ToString + " *************************************/" + vbCrLf)
- ' outText.Insert(strSpace + vbCrLf)
- ' outText.Insert(strSpace + "/****************************** " + " add by yujian " + Date.Today.ToLongDateString() + " " + Date.Now.Hour.ToString + ":" + Date.Now.Minute.ToString + " *************************************/" + vbCrLf)
- iCurrentLineNumber = DTE.ActiveDocument.Selection.BottomLine + 1
- ' 移动文本输入点到指定行上
- outText.MoveToLineAndOffset(iCurrentLineNumber + 1, 1)
- outText.Insert(strSpace + "/****************************** " + " add by yujian " + Date.Today.ToLongDateString() + " " + Date.Now.Hour.ToString + ":" + Date.Now.Minute.ToString + " *************************************/" + vbCrLf)
- End Sub
2 建立快捷键
在源项目工程中【不是在宏项目中】 依次选择
工具→选项→环境→键盘
设置用来运行宏的快捷键,注意不要和已有的快捷键相冲突。
比如: 建立文件注释 快捷键为: ALT+A
建立函数注释 快捷键为: ALT+R
参考资料:
http://z.chao.yue.blog.163.com/blog/static/13086262020114210373211/
http://www.cppblog.com/eday/archive/2007/07/15/28079.html
http://pppboy.blog.163.com/blog/static/3020379620091030111611858/