首页 > 代码库 > 网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)

网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)

一 本系列随笔概览及产生的背景

自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱。同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的。

该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者。

本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决思路和界面开发的编程经验,非常适合.NET开发的初级,中级读者,希望大家多多支持。

很多初学者常有此类困惑,“为什么我书也看了,C#相关的各个方面的知识都有所了解,但就是没法写出一个像样的应用呢?”,

这其实还是没有学会综合运用所学知识,锻炼出编程思维,建立起学习兴趣,我想该系列文章也许会帮到您,但愿如此。

开发环境:VS2008

本节源码位置:https://github.com/songboriceboy/SimpleFrameWork

源码下载办法:安装SVN客户端(本文最后提供下载地址),然后checkout以下的地址:https://github.com/songboriceboy/SimpleFrameWork

系列文章提纲拟定如下:

1.如何使用C#语言获取博客园某个博主的全部随笔链接及标题;
2.如何使用C#语言获得博文的内容;
3.使用C#语言如何将html网页转换成pdf(html2pdf)
4.如何使用C#语言下载博文中的全部图片到本地并可以离线浏览
5.如何使用C#语言合成多个单个的pdf文件到一个pdf中,并生成目录
6.网易博客的链接如何使用C#语言获取到,网易博客的特殊性;
7.微信公众号文章如何使用C#语言下载;
8.如何获取任意一篇文章的全部图文
9.如何使用C#语言去掉html中的全部标签获取纯文本(html2txt)
10.如何使用C#语言将多个html文件编译成chm(html2chm)
11.如何使用C#语言远程发布文章到新浪博客
12.如何使用C#语言开发静态站点生成器
13.如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)
14.如何使用C#语言实现网页编辑器(Winform)
......

二 第七节主要内容简介(如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面))

如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)的解决方案,演示demo如下图所示:可执行文件下载

demo功能简介:

程序启动后,扫描程序所在目录的WebSiteDB文件夹(参见上一节,里面保存着各个博主的全部博文,xxx.db文件),在左边的树形控件上加载数据库名称;双击树形控件的某个子节点,在右边新增一个类似浏览器的tab界面,在新打开的界面中,自动加载博主的博文列表信息。

 

三 基本原理

这个简单框架,主要有3个比较重要的地方:

1.树形控件节点的递归加载;

2.右边tab窗体的创建(主要利用了大名鼎鼎的WeifenLuo.WinFormsUI.Docking.dll);

3.点击树形节点,打开新窗口(前2者的结合)。

 首先来看第一点,树形控件节点的递归加载,主要代码如下

    private void LoadWebSiteTree()        {            this.treeViewTask.Nodes.Clear();            TreeNode nodeRoot = new TreeNode();            nodeRoot.Text = "站点列表";            nodeRoot.Tag = -1;            this.treeViewTask.Nodes.Add(nodeRoot);            GetSubDirectoryNodes(nodeRoot, m_strDBFolder,true);            this.treeViewTask.SelectedNode = this.treeViewTask.TopNode;        }

创建根节点,然后调用GetSubDirectoryNodes函数,递归地加载子节点:

  private void GetSubDirectoryNodes(TreeNode parentNode, string fullName, bool getFileNames)        {            if (!Directory.Exists(fullName))            {                Directory.CreateDirectory(fullName);            }            DirectoryInfo dir = new DirectoryInfo(fullName);            DirectoryInfo[] dirSubs = dir.GetDirectories();            // 为每个子目录添加一个子节点            foreach (DirectoryInfo dirSub in dirSubs)            {                // 不显示隐藏文件夹                if ((dirSub.Attributes & FileAttributes.Hidden) != 0)                {                    continue;                }                               TreeNode node = new TreeNode();                node.Text = dirSub.Name;                node.Tag = 0;                node.ImageIndex = 0;                parentNode.Nodes.Add(node);                // 递归调用                GetSubDirectoryNodes(node, dirSub.FullName, getFileNames);                         }            // 为每个子目录添加一个子节点            foreach (DirectoryInfo dirSub in dirSubs)            {                // 不显示隐藏文件夹                if ((dirSub.Attributes & FileAttributes.Hidden) != 0)                {                    continue;                }            }            if (getFileNames) // 书中源码中,这部分在foreach内部,不正确            {                // 获取此节点的所有文件                FileInfo[] files = dir.GetFiles();                // 放置节点后。放置子目录中的文件。                foreach (FileInfo file in files)                {                    if (file.Extension.ToString() != ".db")                        continue;                    string strNodeName = file.Name.Remove(file.Name.Length - 3, 3);                    if (strNodeName == "home")                        continue;                                        TreeNode node = new TreeNode();                    node.Text = strNodeName;                    node.Tag = 1;                    node.ImageIndex = 1;                    parentNode.Nodes.Add(node);                }            }        }  

接下来看第二点,2.右边tab窗体的创建(主要利用了大名鼎鼎的WeifenLuo.WinFormsUI.Docking.dll),主要代码如下:

public DockContent ShowContent(string caption/*, Type formType*/)        {            DockContent frm = FindDocument(caption);            if (frm == null)            {                Frm_TargetUrlView frm_TargetUrlView = new Frm_TargetUrlView((string)this.treeViewTask.SelectedNode.Parent.Text                    , m_strDBConStringPath + m_strTreeNodeName               ,  (string)this.treeViewTask.SelectedNode.Text, this);                frm_TargetUrlView.MdiParent = this;                frm_TargetUrlView.WindowState = FormWindowState.Maximized;                frm_TargetUrlView.Show(this.dockPanel1);                frm_TargetUrlView.Focus();                frm_TargetUrlView.BringToFront();                return frm_TargetUrlView;            }            frm.Show(this.dockPanel1);            frm.Focus();            frm.BringToFront();            return frm;        }

首先调用FindDocument(caption),判断当前tab窗口是否已经打开了,如果已经打开,则激活它;如果还未打开,新建一个tab窗口,并使这个刚创建的窗口成为激活窗口。

 3.点击树形节点,打开新窗口(前2者的结合)。主要代码如下:

  private void treeViewTask_MouseDoubleClick(object sender, MouseEventArgs e)        {            Point pos = new Point(e.X, e.Y);            TreeNode nodeClick = this.treeViewTask.GetNodeAt(pos);            if (nodeClick.Text == "站点列表")            {                this.treeViewTask.ContextMenuStrip = null;                return;            }            if (nodeClick != null && e.Button == MouseButtons.Left)            {                int nTag = (int)nodeClick.Tag;                if (nTag == 0)                    return;                this.treeViewTask.SelectedNode = nodeClick;                LoadInfoByNode();            }            ShowContent(this.treeViewTask.SelectedNode.Text);        }

在树形节点的鼠标双击处理函数中,调用上面第二步的ShowContent函数,弹出对应的tab窗体。

更详细的代码请自行下载研究。

作者:宋波
出处:http://www.cnblogs.com/ice-river/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

网络采集软件核心技术剖析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)