昨天因为时间的原因,就草草的写了个比较简单的方法,调用hha.dll来编译CHM文件,昨天晚上回去,将这个方法整理到ChmHelper.dll中了,具体的代码如下:

CHMDocument.cs文件

添加编译的重载方法

  1. /// <summary>  
  2.         /// 使用hha.dll进行编译  
  3.         /// </summary>  
  4.         /// <param name="file"></param>  
  5.         /// <returns></returns>  
  6.         public bool Compile(string file)  
  7.         {  
  8.             this.CreateHhp();  
  9.             this.OpenHhc();  
  10.             this.OpenHhk();  
  11.             HHA_CompileHHP(this.strHhp, GetInfo1, GetInfo1, 0);  
  12.             return true;  
  13.         } 

关于hha.dll中的 代码

  1. delegate string GetInfo(string log);  
  2.  
  3.         [DllImport("hha.dll")]  
  4.         static extern bool HHA_CompileHHP(string hhp, GetInfo pro, GetInfo fi, int flag);  
  5.  
  6.         public string GetInfo1(string log)  
  7.         {  
  8.             this.OutPutText += log;  
  9.             return log;  
  10.         }   

新的创建hhp的方法

  1. /// <summary>  
  2.         /// 创建hhp文件  
  3.         /// </summary>  
  4.         /// <param name="htmFile">htm文件名</param>  
  5.         private void CreateHhp()  
  6.         {  
  7.             FileStream fs = new FileStream(strHhp, FileMode.Create); //创建hhp文件  
  8.             streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding(config.EncodeType));//可能会报警告   
  9.             streamWriter.WriteLine("[OPTIONS]");  
  10.             streamWriter.WriteLine("Compatibility=1.1 or later");  
  11.             streamWriter.WriteLine("Compiled file=" + "Alexis.chm");  //chm文件名,要带后缀名  
  12.             streamWriter.WriteLine("Contents file=" + strHhc);  //hhc文件名  
  13.             streamWriter.WriteLine("Index file=" + strHhk);  
  14.             streamWriter.WriteLine("Default topic=" + config.DefaultPage);  //默认页  
  15.             streamWriter.WriteLine("Display compile progress=yes"); //是否显示编译过程  
  16.             streamWriter.WriteLine("Language=0x804 中文(中国)");  //chm文件语言  
  17.             streamWriter.WriteLine("Title=" + _title);//标题  
  18.             streamWriter.WriteLine("Default Window=Main");  
  19.             streamWriter.WriteLine();  
  20.             streamWriter.WriteLine("[WINDOWS]");  
  21.             streamWriter.WriteLine("Main=,\"xeditor.hhc\",\"xeditor.hhk\",,,,,,,0x20,180,0x104E, [80,60,720,540],0x0,0x0,,,,,0");//这里最重要了,一般默认即可  
  22.             streamWriter.WriteLine();  
  23.             streamWriter.WriteLine("[FILES]");  
  24.             NodesHhp(nodeList);  
  25.             streamWriter.WriteLine();  
  26.             streamWriter.Close();  
  27.         } 

昨天的“农民伯伯”说想整个基于文件夹目录的生成CHM的软件,想了下,也不是很难,主要的难点就是如果确定子节点、父节点的关系。于是乎,昨晚花了点时间,将其实现,现将代码和实现跟大家分享:

 这个是测试的文件夹目录:

基于文件夹目录生成CHM电子书 _WinForm

 程序的界面如下:很简单的一个界面,选择根目录,编译(使用hha.dll)

 

基于文件夹目录生成CHM电子书 _休闲_02

 

这个是生成的chm电子书,基于文件夹目录的
 

基于文件夹目录生成CHM电子书 _职场_03

代码:

遍历整个目录,生成父节点、子节点

  1. private void GetFiles(string filePath, CHMNode node)  
  2.         {  
  3.             DirectoryInfo folder = new DirectoryInfo(filePath);  
  4.             node.Name = folder.Name;  
  5.  
  6.             FileInfo[] chldFiles = folder.GetFiles("*.*");  
  7.             foreach (FileInfo chlFile in chldFiles)  
  8.             {  
  9.                 if (chlFile.Extension == ".htm" || chlFile.Extension == ".html")  
  10.                 {  
  11.                     CHMNode chldNode = new CHMNode();  
  12.                     chldNode.Name = chlFile.Name;  
  13.                     chldNode.Local = chlFile.FullName;  
  14.                     node.Nodes.Add(chldNode);  
  15.                 }  
  16.             }  
  17.  
  18.             DirectoryInfo[] chldFolders = folder.GetDirectories();  
  19.             foreach (DirectoryInfo chldFolder in chldFolders)  
  20.             {  
  21.                 CHMNode chldNode = new CHMNode();  
  22.                 chldNode.Name = folder.Name;  
  23.                 node.Nodes.Add(chldNode);  
  24.                 GetFiles(chldFolder.FullName, chldNode);  
  25.             }  
  26.  
  27.         } 

编译按钮,在这里设置跟节点

  1. private void btnComplie_Click(object sender, EventArgs e)  
  2.         {  
  3.             if (this.txtPath.Text=="")  
  4.             {  
  5.                 MessageBox.Show("请选择目录");  
  6.                 return;  
  7.             }  
  8.               
  9.             CHMDocument document = new CHMDocument();  
  10.             document.FileName = "Made by Alexis";  
  11.             document.Title = "Alexis";//设置根目录的名字  
  12.             //根节点  
  13.             CHMNode root = new CHMNode();  
  14.             root.Name = this.txtPath.Text.Substring(this.txtPath.Text.LastIndexOf('\\') + 1);  
  15.             document.Nodes.Add(root);  
  16.             GetFiles(this.txtPath.Text, root);  
  17.             //编译  
  18.             document.Compile("a");  
  19.         } 

程序下载