在这篇文章中,我将介绍AlexisEditor项目下主要Form的实现,即MainForm、EditForm。

MainForm

MainForm包含的主要变量如下

以frm开头的都是对应的窗体变量,chmDocument表示当前的电子书,dockPanel是MainForm上的Panel,负责实现Visual Studio风格的面板。

下图是MainForm的主要方法。

在一开始是实例化Form窗体的时候会调自身的构造器,在构造器中我们其他的窗体,主要代码如下

  1. frmIndex.Show(dockPanel);//显示目录窗体
  2. frmIndex.DockTo(dockPanel, DockStyle.Left);
  3. frmList.Show(dockPanel);//显示搜索窗体
  4. frmList.DockTo(dockPanel, DockStyle.Fill);
  5. this.frmIndex.TreeIndex.NodeMouseDoubleClick += new TreeNodeMouseClickEventHandler(TreeIndex_NodeMouseDoubleClick);//注册编辑文章事件

加载界面的时候会触发MainForm_Load事件,我们在这个方法里面加载电子书的目录,代码如下:

  1. chmDocument.Load("index.xml");//加载目录
  2. RefreshView(chmDocument, frmIndex.TreeIndex);

RefreshView是同步TreeView和CHMDocument的方法,很重要

  1. private void RefreshView(CHMDocument doc, System.Windows.Forms.TreeView tvw)
  2. {
  3. tvw.BeginUpdate();
  4. tvw.Nodes.Clear();
  5. System.Windows.Forms.TreeNode node = tvw.Nodes.Add(doc.Title);
  6. node.Tag = doc;
  7. node.ImageIndex = 0;
  8. node.SelectedImageIndex = 0;
  9. AddNodes(doc.Nodes, node);
  10. tvw.EndUpdate();
  11. tvw.SelectedNode = node;
  12. node.Expand();
  13. }

RefreshView会调用AddNodes方法添加节点,方法明细如下

  1. private void AddNodes(CHMNodeList list, System.Windows.Forms.TreeNode RootNode)
  2. {
  3. if (list == null || list.Count == 0)
  4. return;
  5. foreach (CHMNode node in list)
  6. {
  7. System.Windows.Forms.TreeNode n = new TreeNode(node.Name);
  8. n.Tag = node;
  9. if (node.Nodes.Count > 0)
  10. n.ImageIndex = 0;
  11. else
  12. n.ImageIndex = 1;
  13. nn.SelectedImageIndex = n.ImageIndex;
  14. RootNode.Nodes.Add(n);
  15. if (node.Nodes.Count > 0)
  16. AddNodes(node.Nodes, n);
  17. }
  18. }

New方法是新建文章方法,当我们选中目录节点,右击的时候会出现一些菜单,其中就有新建文章

方法体很简单,其他的事情都交给EditForm去完成

  1. EditForm frmEdit = EditForm.CreateEditForm();
  2. frmEdit.Show();

Compile方法是编译方法,负责将目录中的文章编译为对应的CHM电子书,并且在编译的时候主页面下方的状态栏会显示编译过程,虽然是比较简陋的编译过程。

  1. //编译方法
  2. private void Compile()
  3. {
  4. frmOutPut.Show(dockPanel);
  5. frmOutPut.DockTo(dockPanel, DockStyle.Bottom);
  6. chmDocument.FileName = "index.xml";
  7. chmDocument.Compile();
  8. //frmOutPut.RtbOutput.Text = chmDocument.OutPutText;
  9. frmOutPut.TxtOutput.Text = chmDocument.OutPutText;
  10. }

AddPage对应着程序工具栏上的IE图标,添加HMTL页面的功能,主要代码如下:

  1. //添加页面,此处只是将路径存入,并没有将文件考到相应的路径下(可用性待分析)
  2. private void AddPage()
  3. {
  4. TreeNode node = this.frmIndex.TreeIndex.SelectedNode;//选中的节点
  5. //查看是否是根节点或是目录节点
  6. CHMNodeList list = this.GetNodeList(node);
  7. if (list == null)
  8. {
  9. MessageBox.Show("请选择根节点或是目录节点");
  10. return;
  11. }
  12. using (OpenFileDialog ofd = new OpenFileDialog())//可以批量选择
  13. {
  14. ofd.Filter = "HTML Files|*.html;*.htm";
  15. ofd.Multiselect = true;//设置可以选择多个文件
  16. ofd.ShowDialog();
  17. if (ofd.FileNames.Length > 0)
  18. {
  19. for (int i = 0; i < ofd.FileNames.Length; i++)
  20. {
  21. CHMNode newnewNode = new CHMNode();//创建新的节点
  22. newNode.Name = ofd.SafeFileNames[i].ToString();
  23. newNode.ImageNo = "1";
  24. newNode.Local = ofd.FileNames[i].ToString();
  25. newNode.Nodes = null;
  26. list.Add(newNode);
  27. System.Windows.Forms.TreeNode node2 = new TreeNode(newNode.Name);
  28. node2.Tag = newNode;
  29. node2.ImageIndex = 1;
  30. node2.SelectedImageIndex = 1;
  31. node.Nodes.Add(node2);//将新节点添加到树中
  32. node.ImageIndex = 0;
  33. node.SelectedImageIndex = 0;
  34. }
  35. }
  36. }
  37. }

保存方法是将目录上的信息保存到xml 文件中,是调用CHMDocument类中的Save方法。

  1. //保存方法
  2. private void Save()
  3. {
  4. chmDocument.Save("index.xml");
  5. }

EditForm窗体

startPath:程序的开始路径,有重要用处

node属性:负责和其他页面的交互

wbEditor:WebBrowser控件的实例,负责加载HTML编辑器,保存文章等功能

txtName:文章的标题

txtKeyWords:文章的关键字,用于Lucene.NET搜索

下面来看看他的一些主要方法及其实现:

EditForm_Load方法:加载编辑器,实现如下:

  1. /// <summary>
  2. /// 窗体加载事件
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void EditForm_Load(object sender, EventArgs e)
  7. {
  8. startPath = Application.StartupPath;//起始路径
  9. //这边可以做成从配置文件中读取选择什么编辑器
  10. //Uri u = new Uri(startPath + @"\ckeditor\index.html");
  11. this.wbEditor.Navigating += new WebBrowserNavigatingEventHandler(wbEditor_Navigating);//为了获取前台的点击事件
  12. Uri u = new Uri(startPath + @"\CSDN_UBB\normal.htm");
  13. this.wbEditor.Url = u;
  14. }

WebBrowser控件中的html事件,是通过Navigating方法来实现的,WebBrowser导航发生改变时就会触发如下的方法,我们可以自己写js事件,让WebBrowser的导航发生改变

如这边

  1. <script type="text/javascript">
  2. function getValue(){
  3. document.getElementById("content").value=document.getElementById("tb_ReplyBody___Editor").innerHTML;
  4. this.location.href="loading.htm";
  5. }
  6. </script>

具体的实现可以参考源代码

  1. void wbEditor_Navigating(object sender, WebBrowserNavigatingEventArgs e)
  2. {
  3. if (e.Url.AbsolutePath.ToString().Replace('/', '\\') == startPath + @"\CSDN_UBB\loading.htm")
  4. {
  5. HtmlDocument hd = this.wbEditor.Document;//获取文档信息
  6. HtmlElement he = hd.GetElementById("content");
  7. IHTMLDocument2 doc = (IHTMLDocument2)this.wbEditor.Document.DomDocument;
  8. mshtml.HTMLInputElement text1 = (HTMLInputElement)doc.all.item("content");//获取隐藏域中的值
  9. string rr = text1.value;
  10. if (this.txtName.Text == "")
  11. {
  12. MessageBox.Show("文章标题不能为空!");
  13. return;
  14. }
  15. string filename = GetFileName();
  16. if (filePathEdit != "")
  17. {
  18. filename = filePathEdit.Substring(filePathEdit.LastIndexOf('\\') + 1);
  19. filenamefilename = filename.Substring(0, filename.LastIndexOf('.'));
  20. File.Delete(filePathEdit);
  21. }
  22. //将内容存入到html模板中,并生产html文件
  23. if (rr != "")
  24. {
  25. FileStream fs = new FileStream("html_files\\" + filename + ".htm", FileMode.Create);//文件名
  26. StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.GetEncoding("UTF-8"));
  27. sw.WriteLine("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
  28. sw.WriteLine("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
  29. sw.WriteLine("<head>");
  30. sw.WriteLine("<title>" + this.txtName.Text + "</title>");//文章名
  31. sw.WriteLine("<meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\"/>");
  32. sw.WriteLine("<link type=\"text/css\" rel=\"stylesheet\" href=\"Styles/SyntaxHighlighter.css\"></link>");
  33. sw.WriteLine("<script type=\"text/javascript\" src=\"Scripts/shCore.js\"></script>");
  34. sw.WriteLine("<script type=\"text/javascript\" src=\"Scripts/shBrushCSharp.js\"></script>");
  35. sw.WriteLine("<script type=\"text/javascript\" src=\"Scripts/shBrushXml.js\"></script>");
  36. sw.WriteLine("<script type=\"text/javascript\"> window.onload = function () {");
  37. sw.WriteLine("dp.SyntaxHighlighter.ClipboardSwf = 'Scripts/clipboard.swf';");
  38. sw.WriteLine("dp.SyntaxHighlighter.HighlightAll('code');}");
  39. sw.WriteLine("</script>");
  40. sw.WriteLine("</head>");
  41. sw.WriteLine("<body>");
  42. rr = ChangeString(rr);
  43. sw.WriteLine(rr);
  44. sw.WriteLine("</body>");
  45. sw.WriteLine("</html>");
  46. sw.Close();
  47. }
  48. //将节点返回给目录,暂不做保存操作
  49. node = new CHMNode();
  50. node.Local = startPath + "\\html_files\\" + filename + ".htm";
  51. node.Name = this.txtName.Text;
  52. node.Nodes = null;
  53. node.ImageNo = "1";
  54. //TODO: 使用Lucene.Net存储索引,方便以后的搜索
  55. this.Close();
  56. //this.wbEditor.Url = new Uri(startPath + @"\success.htm");
  57. }
  58. }
  59. #endregion

ok,至此,主要的部分都已经讲解了(还有一个BookIndexForm,在下篇中和其他的一起讲解),还有许多细节的地方可参考我的源代码

源代码下载(简陋版)

PS:不是最新版的源代码,最新版的源代码还在开发中, 恕不提供,嘿嘿

转载于:https://blog.51cto.com/alexis/574427

C#生成CHM文件(应用篇)之代码库编辑器(3)【附源代码下载】相关推荐

  1. C#生成CHM文件(应用篇)之代码库编辑器(1)

    下面的这个系列是以一个小软件的开发过程为基础,和大家分享下我在开发这个软件时遇到的一些问题和总结. 先更新下软件:代码库编辑器Beta版下载 ,上一版的程序见<C#生成CHM文件(应用篇)> ...

  2. C#生成CHM文件(应用篇)之代码库编辑器(5)【总结、程序、源代码】

    经历了快一个月的开发(因为都是在闲暇时间做的,实际实际可能不到一周),AlexisEditor总算完成了. 这边说明一下为什么有些网友不能新增文章的问题. 原因是路径中有中文字符,我一直用的是英文系统 ...

  3. C#生成CHM文件(汇总篇)

    本文是前面的C#生成CHM文件系列文章的汇总以及一些其他的关于CHM的资料链接等. C#生成CHM文件(入门篇) http://www.cnblogs.com/alexis/archive/2010/ ...

  4. C# 生成CHM文件 资料汇总

    本文是前面的C#生成CHM文件系列文章的汇总以及一些其他的关于CHM的资料链接等. C#生成CHM文件(入门篇) http://www.cnblogs.com/alexis/archive/2010/ ...

  5. C#生成CHM文件(中级篇)

    在上篇<C#生成CHM文件(入门篇)>中,我们利用微软自带的hhc.exe以编程的方式创建一个CHM文件,而且调用的是一个静态的HMTL文件.   在中篇中,实现以下几个目标  1.将在线 ...

  6. C#生成CHM文件(应用篇)

    在入门篇中我们了解到如何使用C#调用hhc.exe来生成CHM文件,而在中篇中,我们进行了CHM反编译和将CHM文件转化为Word.在下篇中,我将简单介绍下这些技术在如何应用在实际项目中. CHM电子 ...

  7. C#生成CHM文件(外篇使用hha.dll)

    在<C#生成CHM文件>一系列中,我们是以微软自带的hhc.exe来编译CHM文件的,这样有一个弊端就是当我们的机器里面并没有装hhc.exe就会报错,这通常在盗版的Windows系统比较 ...

  8. 使用Teleport Ultra批量克隆网站,使用Easy CHM合并生成chm文件

    1.要下载的页面 http://www.howsoftworks.net/javaapi/ 2. 下载Teleport Ultra 3.使用Teleport Ultra批量克隆网站 4.下载Easy ...

  9. 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...

     本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较    (三)SSIS的简介    (四)数据库中存储过程示例(SSIS应用需要) (五)Excel模板的制作(这步这么简单,稍微介 ...

最新文章

  1. java default修饰符_Java修饰符看这一篇就够了
  2. 智能化的数据中心到底该如何建设?
  3. go语言csv包_玩转数据处理120题R语言版本
  4. 2019 年百度之星·程序设计大赛 - 初赛一Game HDU 6669 (实现,贪心)
  5. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】
  6. WebUploader点击上传文件选择框会延迟几秒才会显示
  7. 【转】DICOM中几个判断图像方向的tag
  8. 【Pytorch神经网络理论篇】 16 过拟合问题的优化技巧(三):批量归一化
  9. Java Integer类lowerOneBit()方法与示例
  10. bp 神经网络 优点 不足_基于粒子群算法和BP神经网络的多因素林火等级预测模型...
  11. python实现决策树算法sklearn_GitHub - cbyonder/lihang_algorithms: 用python和sklearn两种方法实现李航《统计学习方法》中的算法...
  12. ssh tar_2015年最佳情侣:tar和ssh
  13. python37从零开始学_从零开始学Python【37】--朴素贝叶斯模型(理论部分)
  14. Bad Hair Day(求数组中元素和它后面离它最近元素之间的元素个数)
  15. 网络设备巨头优倍快的客户数据遭泄露
  16. 为什么静态static成员函数不能成为virtual虚函数
  17. C# winform 中MessageBox用法大全(附效果图)
  18. Linux 串口termios.h分析
  19. bmd硬盘测试_硬盘测速工具:Blackmagic Disk Speed Test Mac
  20. fast无线路由器设置服务器,Fast迅捷无线路由器怎么设置 Fast迅捷无线路由器设置方法【详细步骤】...

热门文章

  1. 最精明的商家-9元包邮不亏反赚
  2. 【翻译】 A survey of transfer learning迁移学习综述
  3. AI听曲识歌!哼曲、口哨吹,都能秒识!
  4. 营改增对建筑业财务管理的三大影响
  5. Best Cow Fences
  6. C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?
  7. SQL之子查询(2)
  8. 用了30年的电流反馈放大器竟然是错的,PSpice仿真来判定立见端倪
  9. win7系统没有光驱怎么重装系统?三种方法教你如何重装系统
  10. JHipster------使用JDL-Studio自动生成代码