zoukankan      html  css  js  c++  java
  • 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,代码如下:

    复制代码
     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"> 
    ");
                            Modes.Append("<html>  
    ");
                            Modes.Append("      <head>  
    ");
                            Modes.Append("       <title>所有模块</title>    
    ");
                            Modes.Append("     <meta name="Generator" content="EditPlus">  
    ");
                            Modes.Append("       <meta name="Author" content=""> 
    ");
                            Modes.Append("       <meta name="Keywords" content="">   
    ");
                            Modes.Append("       <meta name="Description" content="">  
    ");
                            Modes.Append("        </head> 
    ");
                            Modes.Append("       <body>  
    ");
                            Modes.Append("       <div align="Center" style="font-size:20px;font-bold;;color:green">全部模块</div>
    ");
                            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>
    ");
    
                          
                        }
                        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>
    ");
                        }
                      
                        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>
    </HTML>");
                       
                }
                streamWriter.WriteLine("</UL>
    </UL>
    </BODY>
    </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 + @"	est.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 FilesHTML Help Workshophhc.exe";//hhc.exe文件位置,windows自带的,一般是这个路径
     2         public string _defaultTopic = "";//默认的页面
     3  private bool Compile()
     4         {
     5             string _chmFile = startPath + @"	est.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文件的工具,但我从没用过,还好目前我这个用着还可以凑合,而且显示的样式可以自己修改成自己喜欢的那种(考你样式了,)秀秀我的作品(悲催啊,不知道咋吧程序上传上来,希望有知道的告诉一下),写起来感觉有点吃力,不好勿喷

    出处:http://www.cnblogs.com/Dotaer/archive/2012/08/02/2619854.html

  • 相关阅读:
    1.1、html概述和基本结构
    几个常用的产品原型设计工具
    Redis 3. 与python交互
    Redis 2.2、主从配置
    Redis 2.1、发布订阅
    Redis 1.6、zset
    Redis 1.5、set
    Redis 1.4、list
    php实现手机拍照上传头像功能
    php获取文件mime类型Fileinfo等方法
  • 原文地址:https://www.cnblogs.com/mq0036/p/7385123.html
Copyright © 2011-2022 走看看