可编程桌面 HTML 帮助生成器





5.00/5 (5投票s)
C# 中可编程的桌面 HTML 帮助应用程序。
引言
对于桌面开发人员来说,通常需要包含某种本地帮助,以便向用户解释应用程序的使用方法。当没有可靠的互联网连接时,这一点尤其有用。市面上有许多商业程序声称可以做到这一点,但大多数都不是免费的。一个独立的Microsoft HTML Help Workshop仍然可用,但已不再积极开发,并且在Windows 10系统上效果不佳(如果可用的话)。MFC C++开发人员以前可以在向导中点击“上下文敏感帮助”来实施HTML帮助,但从Visual Studio 2017开始,这已不再是一个选项。本应用程序为开发人员提供了一个可定制的、独立的帮助应用程序,模仿HTML Help Workshop,完全用C#编写,并且可以在Windows 10上运行。
背景
对于那些喜欢使用.NET和C#来演示桌面应用程序概念验证的开发人员来说,无论他们最终是否打算通过网络运行,唯一的用户帮助选项是购买应用程序的订阅,例如RoboHelp (C) Adobe Systems,或者在服务器上提供HTML文件。虽然后者方便所有用户更新,但并非所有用户都能访问互联网,或者他们运行的网络环境不允许远程服务器访问。显然,一个经济可行、可定制的、基于本地的HTML帮助系统对C# Windows开发人员来说应该非常有价值。
Using the Code
THtmlHelp
窗口只有两个主要组件:一个选项卡控件和一个Web浏览器。选项卡控件包含三个页面:一个“目录”页面,带有一个显示所有帮助文件列表的TreeView;一个“索引”页面,包含关键字列表;以及一个“搜索”页面,用于在所有帮助文件中搜索特定单词。Web浏览器组件是从CodeProject文章《Web Browser in C# by Claudia Goga, 20 Feb 2010》中获得的经过修改和精简的版本。源代码包含两个独立的应用程序:THelpViewer
和KeyWordListBuilder
,可以单独编译和运行。THelpViewer
可执行文件是实际的HTML帮助查看器。可下载的源代码只有基本的页面,旨在作为开发人员创建自己帮助页面的模板。要做到这一点,开发人员必须使用HTML编辑器。在这方面,该应用程序与其他大多数HTML帮助程序类似。在正确的目录结构中运行THtmlHelp.exe将导致应用程序自动将所有HTML帮助文件填充到TabControl TreeView
中。为了提供关键字及其各自链接到相应帮助文件的列表,需要单独处理“索引”页面。THtmlHelp.exe将自动加载包含填充“索引”页面所需信息的IndexData.xml文件。要自定义IndexData.xml文件,您可以手动进行,或者最好使用附带的KeyWordListBuilder
应用程序。该构建器应用程序包含一些简单的说明,允许您添加关键字并将其与特定文件关联,然后将整个列表保存为XML文件。请注意,THtmlHelp.exe和IndexData.xml文件必须放在应用程序的根目录下,并且该目录还必须包含名为“hlp”的子目录,该子目录中包含所有帮助htm文件以及用于图像的子目录(如果您选择使用任何图像)。此外,THtmlViewer
的标题栏将显示您命名的HTML页面的名称。
下面的代码展示了查看器如何加载target目录中的所有文件,然后加载TreeView
和Browser
。这假设hlp目录中有文件,包括contents.htm。
// Fields
public ArrayList arList = new ArrayList();
public String Url = string.Empty;
public String sPath = string.Empty;
public String sFolderPath = string.Empty;
// Constructor
public Form1()
{
sPath = GetFullPathName("hlp/contents.htm");
Url = "file:///" + sPath;
int n = sPath.LastIndexOf('\\');
sFolderPath = Path.GetDirectoryName(sPath);
ProcessDirectory(sFolderPath);
myTreeView();
myBrowser();
//..
}
public void ProcessDirectory(string targetDirectory)
{
string[] fileEntries = Directory.GetFiles(targetDirectory);
foreach (string fileName in fileEntries)
arList.Add(path);
}
下面的代码展示了如何填充TreeView
。
private void myTreeView()
{
string directoryName = GetFullPathName(sPath);
int n1 = directoryName.LastIndexOf('/');
int n2 = directoryName.Length;
directoryName = directoryName.Remove(n1, n2 - n1);
treeView1.Nodes.Clear();
treeView1.BeginUpdate();
string yourParentNode = "Contents";
treeView1.Nodes.Add(yourParentNode);
treeView1.EndUpdate();
try
{
var txtFiles = Directory.EnumerateFiles(directoryName);
foreach (string currentFile in txtFiles)
{
string fileName = currentFile.Substring(directoryName.Length + 1);
n1 = fileName.LastIndexOf('.');
n2 = fileName.Length;
fileName = fileName.Remove(n1, n2 - n1);
treeView1.Nodes[0].Nodes.Add(fileName);
}
catch (Exception e)
{
MessageBox.Show("Warning: " + e.Message);
}
treeView1.ExpandAll();
}
使用附带的KeywordListBuilder
应用程序可以方便地填充“索引”页面。
- 使用“新建”、“打开”和“保存”来管理“索引”页面列表(IndexData.xml)。
- “工具”/“添加关键字”以添加到列表中
- 将每个关键字与hlp目录中的文件关联
- “工具”/“移除关键字”以删除突出显示的列表项。
- 将列表保存为应用程序根目录中的“IndexData.xml”(参见上文)。
将THtmlHelp.exe放在您的调用应用程序根目录中,以及必需的附带IndexData.xml文件和hlp文件夹,您的调用应用程序可以使用以下代码来启动帮助应用程序。
private void contentsToolStripMenuItem_Click(object sender, EventArgs e)
{
Process p = Process.Start("THelpViewer.exe");
p.WaitForInputIdle();
}
protected override bool ProcessCmdKey(Keys keyData)
{
if (keyData == Keys.F1)
{
Process p = Process.Start("THelpViewer.exe");
p.WaitForInputIdle();
return true;
}
// Call the base class
return base.ProcessCmdKey(keyData);
}
关注点
令我感到奇怪的是,Visual Studio不再支持HTML Help Studio (HTMLS),开发者只能自行提供帮助。可能存在一些解决方法可以使HTMLS正常工作,但我未能找到。这就是我为何要开发这个应用程序。在C++编程方面花费了大量时间后,我欣喜地发现Visual Studio C#是多么的直接、高效和强大。尽管当前的努力还有待完善,也许其中最重要的一点是能够以某种方式将所有必要的帮助文件和应用程序本身压缩成一个类似于chm的包。我曾考虑过简单地将所有组件打包成zip文件,但很快意识到存在许多不同的zip文件格式,并且访问zip应用程序并不容易。此外,无疑有一种方法可以实现上下文敏感帮助,但这会大大增加程序的复杂性。
历史
- 版本 2.2 2018年3月5日