原文: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. 云梯vpn

    刚和大饼合买了一个云梯的vpn 表示可以把俺的优惠连接放出来了 貌似必须是新注册用户才能够享用优惠 http://protizi.com/?r=5e3fecd7eae558ec 把云梯推荐给朋友们 让 ...

  2. 答读者问(5):关于数学程序猿的作用、r \\ u0026研发工作的实践要求和问题,如求职的影响

    最近,有通过微博很多读者.微信沟通,我.我觉得我们学习.对于技术,我们很热情.我也学到了很多东西. 我提取了几个大家比較关心的问题予以答复.请有相同疑问的朋友參考一下. ,欢迎关注.) 版权声明:本文 ...

  3. String.Format in Java and C#

    原文:String.Format in Java and C# JDK1.5中,String类新增了一个很有用的静态方法String.format(): format(Locale l, String ...

  4. Fiddler工具的基本功能(转)

    Fiddler是一款用于网页数据分析,抓取的工具,里面集成了对网页强大的功能外,还可以通过设置,使其对手机的数据也可以进行抓取 Fiddler的原理是: 通过在客户端和服务器之间创建一个代理服务器来对 ...

  5. Hadoop加zookeeper构建高可靠集群

    事前准备 1.更改Linux主机名,每个人都有配置 vim /etc/sysconfig/network NETWORKING=yes HOSTNAME=hadoop-server1 2.改动IP / ...

  6. Down to the TLP: How PCI express devices talk (Part II)

    http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-2 Data Link Layer Packets A ...

  7. i++与++i哪个效率更高

    简单的比较前缀自增运算符和后缀自增运算符的效率是片面的, 因为存在很多因素影响这个问题的答案. 首先考虑内建数据类型的情况: 如果自增运算表达式的结果没有被使用, 而是仅仅简单地用于增加一元操作数, ...

  8. ASP.NET MVC:Razor 引入命名空间

    原文:ASP.NET MVC:Razor 引入命名空间 页面中引用 c# @using MvcApplication83.Models @using MvcApplication83.Common 行 ...

  9. Linux centos 主机名颜色设置 和 别名设置

    方便和乐趣写今天.至于为什么主机名颜色设置 和 别名设置放在一起写.这是因为他们的设置是在一个文件中..bashrc. .bashrc放在cd /root 这个文件夹下! 这个文件主要保存个人的一些个 ...

  10. android账号与同步之发起同步

    上一篇博文我介绍了账号与同步的同步实现过程,当中提供了一个工系统进程调用的服务,那么这个服务究竟是怎么被启动和使用的呢?这篇博文我就大体梳理一下启动过程. 事实上作为一个一般开发者,我们仅仅要知道要想 ...