C# 如何生成CHM帮助文件

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

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

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

生成事件

 1  /// <summary>
 2         /// 生成
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void button1_Click(object sender, EventArgs e)
 7         {
 8             try
 9             {
10                 if (!Directory.Exists("HTML"))  //判断名为HTML文件夹是否存在,不存在的话就创建一个
11                 {
12                     Directory.CreateDirectory("HTML");
13                 }
14                 startPath = Application.StartupPath;//起始路径
15                 OpenHhp(_defaultTopic);//打开hhp文件
16                 OpenHhc(_defaultTopic);//打开hhc文件
17                 OpenHhk();//打开hhk文件
18                 Compile();
19                 MessageBox.Show("生成成功!");
20             }
21             catch (Exception ex)
22             {
23                 MessageBox.Show("生成失败!");
24                 throw;
25             }
26
27         }

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

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

 1   /// <summary>
 2         /// 创建hhp文件
 3         /// </summary>
 4         /// <param name="htmFile">htm文件名</param>
 5         public void OpenHhp(string htmFile)
 6         {
 7             FileStream fs = new FileStream("test.hhp", FileMode.Create); //创建hhp文件
 8             streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030"));
 9
10
11             streamWriter.WriteLine("[OPTIONS]");
12             streamWriter.WriteLine("Compatibility=1.1 or later");
13             streamWriter.WriteLine("Compiled file=" + textBox1 .Text.Trim()+ ".chm");      //定义生成文件名称
14             streamWriter.WriteLine("Contents file=test.hhc");
15             streamWriter.WriteLine("Default topic=HTML\\全部对象.htm");
16             streamWriter.WriteLine("Display compile progress=Yes");
17             streamWriter.WriteLine("Index file=DBO_HELP.hhk");
18             streamWriter.WriteLine("Language=0x804 中文(中国)");
19             streamWriter.WriteLine("Title=数据库结构展示");
20             streamWriter.WriteLine("      ");
21             streamWriter.WriteLine("[FILES]");
22             streamWriter.WriteLine("全部对象.htm");
23             streamWriter.WriteLine("       ");
24             streamWriter.WriteLine("[INFOTYPES]");
25             streamWriter.WriteLine(htmFile);
26             streamWriter.WriteLine();
27             streamWriter.Close();
28         }

这样在项目的根目录上面就生成了一个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 = 0; i < dt.Rows.Count; i++)
            {
                #region
                if (i == 0)
                    {
                        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 > 0)
                    {
                      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文件了

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

 1 private void OpenHhk()
 2         {
 3             FileStream fs = new FileStream(startPath + @"\test.hhk", FileMode.Create); //创建hhp文件
 4             //streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030"));
 5             streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("UTF-8"));
 6             streamWriter.WriteLine("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">");
 7             streamWriter.WriteLine("<HTML>");
 8             streamWriter.WriteLine("<HEAD>");
 9             streamWriter.WriteLine("<meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\">");
10             streamWriter.WriteLine("<!-- Sitemap 1.0 -->");
11             streamWriter.WriteLine("</HEAD>");
12             streamWriter.WriteLine("<BODY>");
13             streamWriter.WriteLine("<UL>");
14             string sql = "SELECT dId,dName,status,dCreTime,dFieidNum,dChName,dFunctionDesc FROM Documents order by dName";
15             //string sqls = "";
16             DataTable dt1 = DBHelper.getDatatable(sql);
17             foreach (DataRow dr in dt1.Rows)
18             {
19                 streamWriter.WriteLine("    <LI> <OBJECT type=\"text/sitemap\">");
20                 streamWriter.WriteLine("        <param name=\"Name\" value=\"" + dr["dName"].ToString() + "\">");
21                 streamWriter.WriteLine("<param name=\"Local\" value=\"" + dr["dName"].ToString() + ".htm\">");
22                 streamWriter.WriteLine("</OBJECT>");
23             }
24             streamWriter.WriteLine("</UL>");
25             streamWriter.WriteLine("</BODY>");
26             streamWriter.WriteLine("</HTML>");
27             streamWriter.WriteLine();
28             streamWriter.Close();
29         }

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

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

 1  string hhcFile = @"C:\Program Files\HTML Help Workshop\hhc.exe";//hhc.exe文件位置,windows自带的,一般是这个路径
 2         public string _defaultTopic = "";//默认的页面
 3  private bool Compile()
 4         {
 5             string _chmFile = startPath + @"\test.chm";//chm文件存储路径
 6             Process helpCompileProcess = new Process();  //创建新的进程,用Process启动HHC.EXE来Compile一个CHM文件
 7             try
 8             {
 9                 //判断文件是否存在并不被占用
10                 try
11                 {
12                     string path = _chmFile;  //chm生成路径
13                     if (File.Exists(path))
14                     {
15                         File.Delete(path);
16                     }
17                 }
18                 catch(Exception e)
19                 {
20                     throw new Exception("文件被打开!");
21                 }
22
23                 ProcessStartInfo processStartInfo = new ProcessStartInfo();
24                 processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
25                 processStartInfo.FileName = hhcFile;  //调入HHC.EXE文件
26                 processStartInfo.Arguments = "\"" + GetPathToProjectFile() + "\"";//获取空的HHP文件
27                 processStartInfo.UseShellExecute = false;
28                 helpCompileProcess.StartInfo = processStartInfo;
29                 helpCompileProcess.Start();
30                 helpCompileProcess.WaitForExit(); //组件无限期地等待关联进程退出
31
32                 if (helpCompileProcess.ExitCode == 0)
33                 {
34                     MessageBox.Show(new Exception().Message);
35                     return false;
36                 }
37             }
38             finally
39             {
40                 helpCompileProcess.Close();
41             }
42             return true;
43         }

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

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

时间: 2024-10-17 10:08:40

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

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

本文不介绍 Sphinx 的用法,只简要罗列 Windows 下生成 .chm 文件的步骤. 0. 首先检查机器是否安装了 HTML Help Workshop 软件,一般安装路径应该是 C:\Program Files (x86)\HTML Help Workshop\hhw.exe 如果没有安装,下载安装包 htmlhelp.exe 双击安装即可,地址为 https://msdn.microsoft.com/en-us/library/ms669985 1. 编译输出文件时,使用命令:  m

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

Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,可以从一套归档源文件开始,生成chm格式的文档.本文主要讲解如何在winddows下安装doxygen. 1.下载doxygen-1.8.8-setup.exe,下载地址为: 1)官方地址:http://www.stack.nl/~dimitri/doxygen/download.html 2)华军软件:http://www.onlinedown.net/soft/117010.htm 2.下载graphviz,下载地址为

C#生成chm思路

本文主要介绍如何用C#代码把html文件编译成chm格式文件. 准备工作 开发环境及测试框架 获取hha.dll并引用到项目中 整理html,css,js,图片到工作目录 生成过程文件 生成hhp 生成hhc 生成hhk 编译 将过程文件编译为chm 利用编译进度信息 错误处理 C#生成chm思路

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

由于最近需要把以前的一个项目写一个文档,但一时又不知道写成怎样的,又恰好发现了可以生成chm的工具,于是乎我就研究了下,感觉还不错,所以也给大家分享下.好了,不多废话,下面就来实现一下吧. 生成前的准备 在开始做之前,还是要补充说明一点:我们是通过C#文档注释生成的XML文件来生成帮助文档的.因此,第一步就是生成XML文档: 具体步骤:打开VS->随意创建一个项目(这里我用的是控制台项目),然后添加如下内容: /// <summary> /// 人类 /// </summary&g

使用Eclipse生成CHM帮助文档(图解)

使用Eclipse生成CHM帮助文档(图解) 博客分类: System Operate javadoc生成chm文档java生成api帮助文档api帮助文档生成工具 Eclipse JavaDoc和jd2chm创建CHM文档 由于图片在这里贴在这里比较麻烦,所以图片见附件 一.首先创建一个java项目 二.导入需要生成API文档的项目源文件 三.复制到新建项目的src目录下 四.导入项目所依赖的相应jar包 要注意的是:处理view层的框架还需要用到 jsp.api.jar 和 servlet.

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

Sandcastle是微软官方的文档生成工具,NDoc开发停止后,这个貌似也是唯一的一个这方面的工具.它从dll文件及其xml注释文件能够 生成完整的帮助文档,支持多种生成格式(Helpe1x:chm, Helper2x:Hxs, Website,HelperView),结合新发布的Sandcastle Help File Builder可视化工具,整个生成过程十分简单,而且SHFB工具看起来很强大,不仅能够直接配置生成文档的各个属性,而且还支持很灵活的扩展设置,为 我们提供完美的.NET类库文

Android gen根目录下自动生成的R文件指向问题

今天才弄明白,原来在调用vitamio包的时候使用它们的R文件,然后在迁入广告的时候出现了问题,但是瞎胡搞半天后把问题解决了,可没有明白这是什么原因. 今天更新应用又出现了相同的情况,无意中打开了gen的根目录妈蛋!发现里面的报名根本就不是我现在应用的包名.而是调用的那个工程的包名!这下终于找到根本原因了,但是怎么解决呢???----------->修改包名呗~~~~~~~可是你改了它又会自动生成了原来的那个,--------------后来终于发现原来这个R文件的包名适合manifest文件中

文件分割器,一个读取流,相应多个输出流,并且生成的碎片文件都有有序的编号

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; public class FileSpilte { /** * @param args * @throws IOException */

VHDL生成的ngc文件被verilog的工程调用的问题

1. 问题的提出 工程a是一个soft core,用VHDL写的,综合的时候去掉了"Add I/O buffers" ,并将-iob(Pack I/O Registers into IOBs)置为否.综合最后生成了a.ngc文件供其他工程使用.在生成完ngc后,还可以在 "Design Utilities" -> "View HDL Instantiation Template" 中生成相应的调用文件. 工程b调用的a.ngc,但是工程b使