热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

 

 

MainForm

 

MainForm包含的主要变量如下 

 

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

 

 

下图是MainForm的主要方法。

 

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

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


 

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

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

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

代码
private   void  RefreshView(CHMDocument doc, System.Windows.Forms.TreeView tvw)
{
            tvw.BeginUpdate();
            tvw.Nodes.Clear();
            System.Windows.Forms.TreeNode node 
=  tvw.Nodes.Add(doc.Title);
            node.Tag 
=  doc;
            node.ImageIndex 
=   0 ;
            node.SelectedImageIndex 
=   0 ;
            AddNodes(doc.Nodes, node);
            tvw.EndUpdate();
            tvw.SelectedNode 
=  node;
            node.Expand();

 } 


 

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

代码
private   void  AddNodes(CHMNodeList list, System.Windows.Forms.TreeNode RootNode)
{
            
if  (list  ==   null   ||  list.Count  ==   0 )
                
return ;

            
foreach  (CHMNode node  in  list)
            {
                System.Windows.Forms.TreeNode n 
=   new  TreeNode(node.Name);
                n.Tag 
=  node;
                
if  (node.Nodes.Count  >   0 )
                    n.ImageIndex 
=   0 ;
                
else
                    n.ImageIndex 
=   1 ;
                n.SelectedImageIndex 
=  n.ImageIndex;
                RootNode.Nodes.Add(n);
                
if  (node.Nodes.Count  >   0 )
                    AddNodes(node.Nodes, n);
            }
}


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

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

EditForm frmEdit = EditForm.CreateEditForm();               

frmEdit.Show();

 

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

代码
// 编译方法
private   void  Compile()
{
            frmOutPut.Show(dockPanel);
            frmOutPut.DockTo(dockPanel, DockStyle.Bottom);
            chmDocument.FileName 
=   " index.xml " ;
            chmDocument.Compile();
            
// frmOutPut.RtbOutput.Text = chmDocument.OutPutText;
            frmOutPut.TxtOutput.Text  =  chmDocument.OutPutText;


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

代码
// 添加页面,此处只是将路径存入,并没有将文件考到相应的路径下(可用性待分析)
         private   void  AddPage()
        {
            TreeNode node 
=   this .frmIndex.TreeIndex.SelectedNode; // 选中的节点
            
// 查看是否是根节点或是目录节点
            CHMNodeList list  =   this .GetNodeList(node);
            
if  (list  ==   null )
            {
                MessageBox.Show(
" 请选择根节点或是目录节点 " );
                
return ;
            }
            
using  (OpenFileDialog ofd  =   new  OpenFileDialog()) // 可以批量选择
            {
                ofd.Filter 
=   " HTML Files|*.html;*.htm " ;
                ofd.Multiselect 
=   true ; // 设置可以选择多个文件
                ofd.ShowDialog();
                
                
                
if  (ofd.FileNames.Length  >   0 )
                {
                    
for  ( int  i  =   0 ; i  <  ofd.FileNames.Length; i ++ )
                    {
                        CHMNode newNode 
=   new  CHMNode(); // 创建新的节点
                        newNode.Name  =  ofd.SafeFileNames[i].ToString();
                        newNode.ImageNo 
=   " 1 " ;                        
                        newNode.Local 
=  ofd.FileNames[i].ToString();
                        newNode.Nodes 
=   null ;
                        list.Add(newNode);
                        System.Windows.Forms.TreeNode node2 
=   new  TreeNode(newNode.Name);
                        node2.Tag 
=  newNode;
                        node2.ImageIndex 
=   1 ;
                        node2.SelectedImageIndex 
=   1 ;
                        node.Nodes.Add(node2);
// 将新节点添加到树中
                        node.ImageIndex  =   0 ;
                        node.SelectedImageIndex 
=   0 ;
                    }
                }
            }
        }


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

 //保存方法
 private void Save()
{
            chmDocument.Save("index.xml");
}

 

 

 EditForm窗体

 

 

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

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

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

txtName:文章的标题

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

 

 

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


 

 

 

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

代码
///  
        
///  窗体加载事件
        
///  

        
///  
        
///  
         private   void  EditForm_Load( object  sender, EventArgs e)
        {
            startPath 
=  Application.StartupPath; // 起始路径
            
// 这边可以做成从配置文件中读取选择什么编辑器
            
// Uri u = new Uri(startPath + @"\ckeditor\index.html");
             this .wbEditor.Navigating  +=   new  WebBrowserNavigatingEventHandler(wbEditor_Navigating); // 为了获取前台的点击事件
            Uri u  =   new  Uri(startPath  +   @" \CSDN_UBB\normal.htm " );
            
this .wbEditor.Url  =  u;
        } 


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

如这边

 

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

 

代码
void  wbEditor_Navigating( object  sender, WebBrowserNavigatingEventArgs e)
        {
            
if  (e.Url.AbsolutePath.ToString().Replace( ' / ' ' \\ ' ==  startPath  +   @" \CSDN_UBB\loading.htm " )
            {
                HtmlDocument hd 
=   this .wbEditor.Document; // 获取文档信息
                HtmlElement he  =  hd.GetElementById( " content " );
                IHTMLDocument2 doc 
=  (IHTMLDocument2) this .wbEditor.Document.DomDocument;
                mshtml.HTMLInputElement text1 
=  (HTMLInputElement)doc.all.item( " content " ); // 获取隐藏域中的值
                 string  rr  =  text1.value;
                
if  ( this .txtName.Text  ==   "" )
                {
                    MessageBox.Show(
" 文章标题不能为空! " );
                    
return ;
                }

                
string  filename  =  GetFileName();
                
if  (filePathEdit  !=   "" )
                {
                    filename 
=  filePathEdit.Substring(filePathEdit.LastIndexOf( ' \\ ' +   1 );
                    filename 
=  filename.Substring( 0 , filename.LastIndexOf( ' . ' ));
                    File.Delete(filePathEdit);
                }
                
// 将内容存入到html模板中,并生产html文件
                 if  (rr  !=   "" )
                {
                    FileStream fs 
=   new  FileStream( " html_files\\ "   +  filename  +   " .htm " , FileMode.Create); // 文件名
                    StreamWriter sw  =   new  StreamWriter(fs, System.Text.Encoding.GetEncoding( " UTF-8 " ));
                    sw.WriteLine(
" " - // W3C // DTD XHTML 1.0 Transitional // EN\" \" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd \">");
                    sw.WriteLine( " " http: // www.w3.org/1999/xhtml\">");
                    sw.WriteLine( " " );
                    sw.WriteLine(
" " ); // 文章名
                    sw.WriteLine( " " text / html; charset = utf - 8 \ "  http-equiv=\ " content - type\ " /> " );
                    sw.WriteLine(
" " text / css\ "  rel=\ " stylesheet\ "  href=\ " Styles / SyntaxHighlighter.css\ " > " );
                    sw.WriteLine(
" " );
                    sw.WriteLine(
" " );
                    sw.WriteLine(
" " );
                    sw.WriteLine(
" " );
                    sw.WriteLine(
" " );
                    sw.WriteLine(
" " );
                    rr 
=  ChangeString(rr);
                    sw.WriteLine(rr);
                    sw.WriteLine(
" " );
                    sw.WriteLine(
" " );
                    sw.Close();
                }
                
// 将节点返回给目录,暂不做保存操作
                node  =   new  CHMNode();
                node.Local 
=  startPath  +   " \\html_files\\ "   +  filename  +   " .htm " ;
                node.Name 
=   this .txtName.Text;
                node.Nodes 
=   null ;
                node.ImageNo 
=   " 1 " ;

                
// TODO: 使用Lucene.Net存储索引,方便以后的搜索

                
this .Close();
                
// this.wbEditor.Url = new Uri(startPath + @"\success.htm");
            }
        }
        
#endregion


 

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

 

 源代码下载(简陋版)

 

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

 

 


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
author-avatar
hizcr
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有