C# 如何生成CHM帮助文件

烟尘你妹俘
推荐于2016-11-26 · TA获得超过2970个赞
知道大有可为答主
回答量:1102
采纳率:0%
帮助的人:2618万
展开全部
前一段时间应公司要求,让我开发一个数据库字段信息CHM帮助文件生成软件。结果当时我就二了,这个东西我只用过,不知道咋做啊。没想到老大很随意说一句:"没事,这个软件我之前有有源码,只不过现在不能用了,你等会参考一下就可以了"。我当时还傻乎乎的谢天谢地,总算有源码可以参考了。当源代码发过来以后,我顿时石化了,我。。。。。,那玩意儿用c++builder开发的,硬着头皮看了一遍,全是带*指针变量、数组、集合、函数,更要命的是,一个类里面写了四五千行没注视的代码,函数中五六百行代码的有几个。 我说这不是坑人嘛?结果看了一天后,我果断放弃看了那个源码了,最后还是的感谢网上活跃的一帮朋友,在一个源码的帮助下(源码我不知道怎么上传,),终于完成了任务啊, 吐槽到此为止,言归正传,首先如下:生成事件View Code 从方法中我可以看出,我们需要一个hhp文件,hhc文件,hhk文件,然后再执行compile方法就可以了首先动态生一个hhp,代码如下: 1///<summary> 2/// 创建hhp文件 3///</summary> 4///<param name="htmFile">htm文件名</param> 5publicvoid 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")); 91011 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文件,所以这个生成有些复杂,不过我这里会截取主要部分代码讲解:privatevoid 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® 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++) { #regionif (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文件了它主要负责你索引部分要显示的内容,这里生成也很简单 1privatevoid 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® HTML Help Workshop 4.1\">"); 10 streamWriter.WriteLine("<!-- Sitemap 1.0 -->"); 11 streamWriter.WriteLine("</HEAD>"); 12 streamWriter.WriteLine("<BODY>"); 13 streamWriter.WriteLine("<UL>"); 14string sql = "SELECT dId,dName,status,dCreTime,dFieidNum,dChName,dFunctionDesc FROM Documents order by dName"; 15//string sqls = "";16 DataTable dt1 = DBHelper.getDatatable(sql); 17foreach (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方法了 1string hhcFile = @"C:\Program Files\HTML Help Workshop\hhc.exe";//hhc.exe文件位置,windows自带的,一般是这个路径 2publicstring _defaultTopic = "";//默认的页面 3privatebool Compile() 4 { 5string _chmFile = startPath + @"\test.chm";//chm文件存储路径 6 Process helpCompileProcess = new Process(); //创建新的进程,用Process启动HHC.EXE来Compile一个CHM文件 7try 8 { 9//判断文件是否存在并不被占用10try11 { 12string path = _chmFile; //chm生成路径13if (File.Exists(path)) 14 { 15 File.Delete(path); 16 } 17 } 18catch(Exception e) 19 { 20thrownew Exception("文件被打开!�恢�勒Π沙绦蛏洗�侠矗�M�兄�赖母嫠咭幌拢��雌鹄锤芯跤械愠粤Γ�缓梦鹋
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式