原文:C# 如何生成CHM帮助文件

前一段时间应公司要求,让我开发一个数据库字段信息CHM帮助文件生成软件。结果当时我就二了,这个东西我只用过,不知道咋做啊。没想到老大很随意说一句:"没事,这个软件我之前有有源码,只不过现在不能用了,你等会参考一下就可以了"。我当时还傻乎乎的谢天谢地,总算有源码可以参考了。当源代码发过来以后,我顿时石化了,我。。。。。,那玩意儿用c++builder开发的,硬着头皮看了一遍,全是带*指针变量、数组、集合、函数,更要命的是,一个类里面写了四五千行没注视的代码,函数中五六百行代码的有几个。 我说这不是坑人嘛?结果看了一天后,我果断放弃看了那个源码了,最后还是的感谢网上活跃的一帮朋友,在一个源码的帮助下(源码我不知道怎么上传,),终于完成了任务啊,

吐槽到此为止,言归正传,首先如下:

生成事件

  /// <summary>
/// 生成
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
try
{
if (!Directory.Exists("HTML")) //判断名为HTML文件夹是否存在,不存在的话就创建一个
{
Directory.CreateDirectory("HTML");
}
startPath = Application.StartupPath;//起始路径
OpenHhp(_defaultTopic);//打开hhp文件
OpenHhc(_defaultTopic);//打开hhc文件
OpenHhk();//打开hhk文件
Compile();
MessageBox.Show("生成成功!");
}
catch (Exception ex)
{
MessageBox.Show("生成失败!");
throw;
} }

从方法中我可以看出,我们需要一个hhp文件,hhc文件,hhk文件,然后再执行compile方法就可以了

首先动态生一个hhp,代码如下:

   /// <summary>
/// 创建hhp文件
/// </summary>
/// <param name="htmFile">htm文件名</param>
public void OpenHhp(string htmFile)
{
FileStream fs = new FileStream("test.hhp", FileMode.Create); //创建hhp文件
streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030")); streamWriter.WriteLine("[OPTIONS]");
streamWriter.WriteLine("Compatibility=1.1 or later");
streamWriter.WriteLine("Compiled file=" + textBox1 .Text.Trim()+ ".chm"); //定义生成文件名称
streamWriter.WriteLine("Contents file=test.hhc");
streamWriter.WriteLine("Default topic=HTML\\全部对象.htm");
streamWriter.WriteLine("Display compile progress=Yes");
streamWriter.WriteLine("Index file=DBO_HELP.hhk");
streamWriter.WriteLine("Language=0x804 中文(中国)");
streamWriter.WriteLine("Title=数据库结构展示");
streamWriter.WriteLine(" ");
streamWriter.WriteLine("[FILES]");
streamWriter.WriteLine("全部对象.htm");
streamWriter.WriteLine(" ");
streamWriter.WriteLine("[INFOTYPES]");
streamWriter.WriteLine(htmFile);
streamWriter.WriteLine();
streamWriter.Close();
}

这样在项目的根目录上面就生成了一个hhp文件
现在就要生成hhc文件了,它主要就是生成chm文件左边显示树形的内容,当点击节点,可以超链接要显示的页面(其实CHM中的内容都是HTML,你可以直接连接静态网页,),当然是显示在右边,而我的项目中要显示东西都是动态生成HTML文件,所以这个生成有些复杂,不过我这里会截取主要部分代码讲解:

  private void OpenHhc(string htmFile)
{
StringBuilder Modes = new StringBuilder(); FileStream fs = new FileStream(GetContentsHtmlFilename(), FileMode.Create); //创建hhp文件
streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030"));
FileStream fs1 = new FileStream("HTML\\全部对象.htm", FileMode.Create); //
str1 = new System.IO.StreamWriter(fs1, System.Text.Encoding.GetEncoding("GB18030")); streamWriter.WriteLine("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">");
streamWriter.WriteLine("<HTML>");
streamWriter.WriteLine("<HEAD>");
streamWriter.WriteLine("<meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\">");
streamWriter.WriteLine("<!-- Sitemap 1.0 -->");
streamWriter.WriteLine("</HEAD>");
streamWriter.WriteLine("<BODY>");
streamWriter.WriteLine("<OBJECT type=\"text/site properties\">");
streamWriter.WriteLine("<param name=\"Window Styles\" value=\"0x800025\">");
streamWriter.WriteLine("</OBJECT>"); string sql = "SELECT mId,mName FROM Models";
DataTable dt = DBHelper.getDatatable(sql); for (int i = ; i < dt.Rows.Count; i++)
{
#region
if (i == )
{
streamWriter.WriteLine(" <UL>");
streamWriter.WriteLine(" <LI> <OBJECT type=\"text/sitemap\">");
streamWriter.WriteLine(" <param name=\"Name\" value=\"数据库服务器\">");
streamWriter.WriteLine(" <param name=\"Local\" value=\"HTML\\全部对象.htm\">");
streamWriter.WriteLine(" <param name=\"ImageNumber\" value=\"13\">");
streamWriter.WriteLine(" </OBJECT>");
streamWriter.WriteLine(" <UL>"); Modes.Append("<!doctype html public \"-//W3C//DTD HTML 4.0 Transitional//EN\"> \r");
Modes.Append("<html> \r");
Modes.Append(" <head> \r");
Modes.Append(" <title>所有模块</title> \r");
Modes.Append(" <meta name=\"Generator\" content=\"EditPlus\"> \r");
Modes.Append(" <meta name=\"Author\" content=\"\"> \r");
Modes.Append(" <meta name=\"Keywords\" content=\"\"> \r");
Modes.Append(" <meta name=\"Description\" content=\"\"> \r");
Modes.Append(" </head> \r");
Modes.Append(" <body> \r");
Modes.Append(" <div align=\"Center\" style=\"font-size:20px;font-width:bold;;color:green\">全部模块</div>\r");
Modes.Append(" <hr color = #FF0000>");
Modes.Append(" <div align=\"Center\"><A href=\""+dt.Rows[i]["mName"].ToString()+".htm\">"+dt.Rows[i]["mName"].ToString()+"</A></div>\r"); }
if (i > )
{
Modes.Append(" <br/>");
Modes.Append(" <div align=\"Center\"><A href=\"" + dt.Rows[i]["mName"].ToString() + ".htm\">"+dt.Rows[i]["mName"].ToString()+"</A></div>\r");
} streamWriter.WriteLine(" <LI> <OBJECT type=\"text/sitemap\">");
streamWriter.WriteLine(" <param name=\"Name\" value=\"" + dt.Rows[i]["mName"].ToString() + "\">");
streamWriter.WriteLine(" <param name=\"Local\" value=\"HTML\\" + dt.Rows[i]["mName"].ToString() + ".htm\">");
streamWriter.WriteLine(" <param name=\"ImageNumber\" value=\"21\">");
//streamWriter.WriteLine(" <param name=\"ImageNumber\" value=\"1\">");
streamWriter.WriteLine(" </OBJECT>");
streamWriter.WriteLine("</UL>");
Modes.Append(" </BODY>\r</HTML>"); }
streamWriter.WriteLine("</UL>\r</UL>\r</BODY>\r</HTML>"); streamWriter.WriteLine();
streamWriter.Close();
str1.WriteLine(Modes);
str1.Close(); }
}

这语法很像HTML,但同时也不是,<UL></UL>代表一级节点,其中中间的 " <LI> <OBJECT type=\"text/sitemap\"><param name=\"Name\" value=\"数据库服务器\"><param name=\"Local\" value=\"HTML\\全部对象.htm\"><param name=\"ImageNumber\" value=\"13\"></OBJECT>"这段代码负责节点内容、连接、图片显示功能,如果<UL>内容嵌套的话,则表示下一级节点。还有我定义的modes,它主要负责生成一个Htm文件(记住用文件流生成,文件后缀名不要用html,而要用htm,不然会有错误,具体我也不知道啥原因),这样hhc文件生成在根目录下

接下来,则要生成hhk文件了

它主要负责你索引部分要显示的内容,这里生成也很简单

 private void OpenHhk()
{
FileStream fs = new FileStream(startPath + @"\test.hhk", FileMode.Create); //创建hhp文件
//streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030"));
streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("UTF-8"));
streamWriter.WriteLine("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">");
streamWriter.WriteLine("<HTML>");
streamWriter.WriteLine("<HEAD>");
streamWriter.WriteLine("<meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\">");
streamWriter.WriteLine("<!-- Sitemap 1.0 -->");
streamWriter.WriteLine("</HEAD>");
streamWriter.WriteLine("<BODY>");
streamWriter.WriteLine("<UL>");
string sql = "SELECT dId,dName,status,dCreTime,dFieidNum,dChName,dFunctionDesc FROM Documents order by dName";
//string sqls = "";
DataTable dt1 = DBHelper.getDatatable(sql);
foreach (DataRow dr in dt1.Rows)
{
streamWriter.WriteLine(" <LI> <OBJECT type=\"text/sitemap\">");
streamWriter.WriteLine(" <param name=\"Name\" value=\"" + dr["dName"].ToString() + "\">");
streamWriter.WriteLine("<param name=\"Local\" value=\"" + dr["dName"].ToString() + ".htm\">");
streamWriter.WriteLine("</OBJECT>");
}
streamWriter.WriteLine("</UL>");
streamWriter.WriteLine("</BODY>");
streamWriter.WriteLine("</HTML>");
streamWriter.WriteLine();
streamWriter.Close();
}

执行以后就可以在根目录下生成hhk文件了

到此为止,生成chm文件的必须的三大文件已经搞定了,下面就是compile方法了

  string hhcFile = @"C:\Program Files\HTML Help Workshop\hhc.exe";//hhc.exe文件位置,windows自带的,一般是这个路径
public string _defaultTopic = "";//默认的页面
private bool Compile()
{
string _chmFile = startPath + @"\test.chm";//chm文件存储路径
Process helpCompileProcess = new Process(); //创建新的进程,用Process启动HHC.EXE来Compile一个CHM文件
try
{
//判断文件是否存在并不被占用
try
{
string path = _chmFile; //chm生成路径
if (File.Exists(path))
{
File.Delete(path);
}
}
catch(Exception e)
{
throw new Exception("文件被打开!");
} ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
processStartInfo.FileName = hhcFile; //调入HHC.EXE文件
processStartInfo.Arguments = "\"" + GetPathToProjectFile() + "\"";//获取空的HHP文件
processStartInfo.UseShellExecute = false;
helpCompileProcess.StartInfo = processStartInfo;
helpCompileProcess.Start();
helpCompileProcess.WaitForExit(); //组件无限期地等待关联进程退出 if (helpCompileProcess.ExitCode == )
{
MessageBox.Show(new Exception().Message);
return false;
}
}
finally
{
helpCompileProcess.Close();
}
return true;
}

满足上面三个文件要求,再执行这个方法,一个CHM帮助文件就可以生成,

其实网上有很多生成chm文件的工具,但我从没用过,还好目前我这个用着还可以凑合,而且显示的样式可以自己修改成自己喜欢的那种(考你样式了,)秀秀我的作品(悲催啊,不知道咋吧程序上传上来,希望有知道的告诉一下),写起来感觉有点吃力,不好勿喷

C# 如何生成CHM帮助文件的更多相关文章

  1. C# 生成chm帮助文件

    引用博友的博客地址,里面有详细资料,谢谢博主分享 http://blog.csdn.net/snakorse/article/details/44963015

  2. Sphinx 生成 Windows 帮助文件 (.chm文件)

    本文不介绍 Sphinx 的用法,只简要罗列 Windows 下生成 .chm 文件的步骤. 0. 首先检查机器是否安装了 HTML Help Workshop 软件,一般安装路径应该是 C:\Pro ...

  3. 使用Teleport Ultra批量克隆网站,使用Easy CHM合并生成chm文件

    1.要下载的页面 http://www.howsoftworks.net/javaapi/ 2. 下载Teleport Ultra 3.使用Teleport Ultra批量克隆网站 4.下载Easy ...

  4. .NET中XML 注释 SandCastle 帮助文件.hhp 使用HTML Help Workshop生成CHM文件

    一.摘要 在本系列的第一篇文章介绍了.NET中XML注释的用途, 本篇文章将讲解如何使用XML注释生成与MSDN一样的帮助文件.主要介绍NDoc的继承者:SandCastle. .SandCastle ...

  5. 将C#文档注释生成.chm帮助文档

    由于最近需要把以前的一个项目写一个文档,但一时又不知道写成怎样的,又恰好发现了可以生成chm的工具,于是乎我就研究了下,感觉还不错,所以也给大家分享下.好了,不多废话,下面就来实现一下吧. 生成前的准 ...

  6. 工具分享——将C#文档注释生成.chm帮助文档

    由于最近需要把以前的一个项目写一个文档,但一时又不知道写成怎样的,又恰好发现了可以生成chm的工具,于是乎我就研究了下,感觉还不错,所以也给大家分享下.好了,不多废话,下面就来实现一下吧. 生成前的准 ...

  7. 代码文档生成工具-Doxygen生成CHM和RTF图文教程

    Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,可以从一套归档源文件开始,生成chm格式的文档.本文主要讲解如何在winddows下安装doxygen.     1.下载do ...

  8. 生成chm文档工具- Sandcastle -摘自网络

    Sandcastle是微软官方的文档生成工具,NDoc开发停止后,这个貌似也是唯一的一个这方面的工具.它从dll文件及其xml注释文件能够 生成完整的帮助文档,支持多种生成格式(Helpe1x:chm ...

  9. 解决win7无法打开chm格式文件的问题

    解决win7无法打开chm格式文件的问题. (一).简单方法(本人用的这个) 1.打开chm2.win7提示安全问题3.chm无法显示内容4.关闭chm5.右键点击chm,点击“解除锁定”,ok  没 ...

随机推荐

  1. Oracle拉进sqlserver表声明的建设

    我们将Oracle数据被同步到sqlserver时间,早餐在sqlserver表中的端构造. 我们是不同步的复杂领域,只考虑以下四种数据类型. Oracle到SQLServer做的映射: int -& ...

  2. Swift 学习Using Swift mix and match, network: 写rss读者

    有使用第三方库.因此,需要使用mix and match财产. 请指出错误,谢谢! rss 阅读器,非常easy的代码.仅仅是为了学习swift语言而写. 1、BaseViewController.s ...

  3. C#开发中使用配置文件

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  4. Mac下Jekyll安装

    之前一直用Wordpress,虽然功能强大,各种插件各种bug,如果想弄个主题,折腾得要命.最近改用jekyll+gitHub免费空间.记录一下. 我用的是Mac,所以只讲述Mac下如何安装,Wind ...

  5. Windows Phone APP中禁用截图

    原文:Windows Phone APP中禁用截图 Windows Phone 8 有系统自带的截图功能,快捷键:电源键+Win键,可以随意截图. Windows Phone 更新GDR2后新增了一个 ...

  6. WIN8 、WIN7 下IIS7.5、IIS8 的rewrite 伪静态功能设置方法

    原文 WIN8 .WIN7 下IIS7.5.IIS8 的rewrite 伪静态功能设置方法 win7和win8系统都自带有iis的功能.关于IIS的安装,上一篇已经讲述,这里就不重复了. 下面说下在w ...

  7. 机器人操作系统 除了Android还有一个ROS(转)

    你知道市面上的机器人都采用了哪些操作系统吗? 估计大多数人给出的答案就是 Android 了.从市面上的产品来看,基于 Android 系统开发的机器人确实是主流,但是还有一种操作系统却鲜为人知,它叫 ...

  8. mybatis generator插件开发

    mybatis现在普遍使用的每一个人DAO框架.mybatis generator它可以基于数据库中的表结构,生成自己主动mybatis代码和配置文件,方便使用,当然,实际的使用过程中.generat ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览  ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ...

  10. 再议 js 数字格式之正则表达式

    原文:再议 js 数字格式之正则表达式 前面我们提到到了js的数字格式<浅谈 js 数字格式类型>,之前的<js 正则练习之语法高亮>里也提到了优化数字匹配的正则.不过最近落叶 ...