如何在C++程序中调用.chm文件

如何在C++程序中调用.chm文件,第1张

在vc中的调用方法

在vc中的函数原型为HWND

HtmlHelp(HWND

hwndCaller,LPCSTR

pszFile,UINT

uCommand,DWORD

dwData)

调用时需要包含Htmlhelp.lib

Htmlhelp.h这两个文件

默认路径是C:\Program

Files\HTML

Help

Workshop\Lib和C:\Program

Files\HTML

Hel

p

Workshop\Include,你可以把这两个文件拷到vc可以辨认的目录下在vc程序里加上#i

nclude

"htmlhelp.h",并在菜单project下的setting中的link下加入Htmlhelp.lib

你在你的程序中加入下列语句之一就可以调用该帮助文件了:

HWND

helpwnd=HtmlHelp(GetSafeHwnd(

),"hh.chm::/01.htm>hh",HH_DISPLAY_TOPIC,NULL)

HWND

helpwnd=HtmlHelp(GetSafeHwnd(

),"hh.chm::/01.htm",HH_DISPLAY_TOC,NULL)

HWND

helpwnd=HtmlHelp(GetSafeHwnd(

),"hh.chm",HH_DISPLAY_INDEX,(DWORD)"帮助一")

你可以下载一个CHM 制作精灵 1.18 试试~~

“CHM 制作精灵”是一款将网页文件(Html文档)转化为CHM文件(已编译的 HTML 帮助文件)和将CHM文件转化为网页文件的软件,即网页“打包”和CHM文件“解包”(CHM文件反编译);是集 HTML Help Workshop工程创建,目录、索引编写,工程编译和CHM文件反编译等多种功能于一身的 CHM电子图书处理软件。与HTML Help Workshop v4.74配合使用制作出来的 Html Help 文档会更见出色。欢迎使用 “CHM 制作精灵”来制作更多 CHM电子图书!!!

前一段时间应公司要求,让我开发一个数据库字段信息CHM帮助文件生成软件。结果当时我就二了,这个东西我只用过,不知道咋做啊。没想到老大很随意说一句:"没事,这个软件我之前有有源码,只不过现在不能用了,你等会参考一下就可以了"。我当时还傻乎乎的谢天谢地,总算有源码可以参考了。当源代码发过来以后,我顿时石化了,我。。。。。,那玩意儿用c++builder开发的,硬着头皮看了一遍,全是带*指针变量、数组、集合、函数,更要命的是,一个类里面写了四五千行没注视的代码,函数中五六百行代码的有几个。 我说这不是坑人嘛?结果看了一天后,我果断放弃看了那个源码了,最后还是的感谢网上活跃的一帮朋友,在一个源码的帮助下(源码我不知道怎么上传,),终于完成了任务啊, 吐槽到此为止,言归正传,首先如下:生成事件View Code 从方法中我可以看出,我们需要一个hhp文件,hhc文件,hhk文件,然后再执行compile方法就可以了首先动态生一个hhp,代码如下: 1///<summary>2/// 创建hhp文件 3///</summary>4///<param name="htmFile">htm文件名</param>5publicvoid OpenHhp(string htmFile) 6 { 7 FileStream fs = new FileStream("test.hhp", FileMode.Create)//创建hhp文件 8 streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030"))91011 streamWriter.WriteLine("[OPTIONS]")12 streamWriter.WriteLine("Compatibility=1.1 or later")13 streamWriter.WriteLine("Compiled file=" + textBox1 .Text.Trim()+ ".chm")//定义生成文件名称14 streamWriter.WriteLine("Contents file=test.hhc")15 streamWriter.WriteLine("Default topic=HTML\\全部对象.htm")16 streamWriter.WriteLine("Display compile progress=Yes")17 streamWriter.WriteLine("Index file=DBO_HELP.hhk")18 streamWriter.WriteLine("Language=0x804 中文(中国)")19 streamWriter.WriteLine("Title=数据库结构展示")20 streamWriter.WriteLine("")21 streamWriter.WriteLine("[FILES]")22 streamWriter.WriteLine("全部对象.htm")23 streamWriter.WriteLine("")24 streamWriter.WriteLine("[INFOTYPES]")25 streamWriter.WriteLine(htmFile)26 streamWriter.WriteLine()27 streamWriter.Close()28 }这样在项目的根目录上面就生成了一个hhp文件现在就要生成hhc文件了,它主要就是生成chm文件左边显示树形的内容,当点击节点,可以超链接要显示的页面(其实CHM中的内容都是HTML,你可以直接连接静态网页,),当然是显示在右边,而我的项目中要显示东西都是动态生成HTML文件,所以这个生成有些复杂,不过我这里会截取主要部分代码讲解:privatevoid OpenHhc(string htmFile) { StringBuilder Modes = new StringBuilder()FileStream fs = new FileStream(GetContentsHtmlFilename(), FileMode.Create)//创建hhp文件 streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030"))FileStream fs1 = new FileStream("HTML\\全部对象.htm", FileMode.Create)// str1 = new System.IO.StreamWriter(fs1, System.Text.Encoding.GetEncoding("GB18030"))streamWriter.WriteLine("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">")streamWriter.WriteLine("<HTML>")streamWriter.WriteLine("<HEAD>")streamWriter.WriteLine("<meta name=\"GENERATOR\" content=\"Microsoft® HTML Help Workshop 4.1\">")streamWriter.WriteLine("<!-- Sitemap 1.0 -->")streamWriter.WriteLine("</HEAD>")streamWriter.WriteLine("<BODY>")streamWriter.WriteLine("<OBJECT type=\"text/site properties\">")streamWriter.WriteLine("<param name=\"Window Styles\" value=\"0x800025\">")streamWriter.WriteLine("</OBJECT>")string sql = "SELECT mId,mName FROM Models"DataTable dt = DBHelper.getDatatable(sql)for (int i = 0i <dt.Rows.Counti++) { #regionif (i == 0) { streamWriter.WriteLine(" <UL>")streamWriter.WriteLine(" <LI><OBJECT type=\"text/sitemap\">")streamWriter.WriteLine(" <param name=\"Name\" value=\"数据库服务器\">")streamWriter.WriteLine(" <param name=\"Local\" value=\"HTML\\全部对象.htm\">")streamWriter.WriteLine(" <param name=\"ImageNumber\" value=\"13\">")streamWriter.WriteLine(" </OBJECT>")streamWriter.WriteLine(" <UL>")Modes.Append("<!doctype html public \"-//W3C//DTD HTML 4.0 Transitional//EN\">\r")Modes.Append("<html>\r")Modes.Append(" <head>\r")Modes.Append(" <title>所有模块</title>\r")Modes.Append(" <meta name=\"Generator\" content=\"EditPlus\">\r")Modes.Append(" <meta name=\"Author\" content=\"\">\r")Modes.Append(" <meta name=\"Keywords\" content=\"\">\r")Modes.Append(" <meta name=\"Description\" content=\"\">\r")Modes.Append(" </head>\r")Modes.Append(" <body>\r")Modes.Append(" <div align=\"Center\" style=\"font-size:20pxfont-width:boldcolor:green\">全部模块</div>\r")Modes.Append(" <hr color = #FF0000>")Modes.Append(" <div align=\"Center\"><A href=\""+dt.Rows[i]["mName"].ToString()+".htm\">"+dt.Rows[i]["mName"].ToString()+"</A></div>\r")} if (i >0) { Modes.Append(" <br/>")Modes.Append(" <div align=\"Center\"><A href=\"" + dt.Rows[i]["mName"].ToString() + ".htm\">"+dt.Rows[i]["mName"].ToString()+"</A></div>\r")} streamWriter.WriteLine(" <LI><OBJECT type=\"text/sitemap\">")streamWriter.WriteLine(" <param name=\"Name\" value=\"" + dt.Rows[i]["mName"].ToString() + "\">")streamWriter.WriteLine(" <param name=\"Local\" value=\"HTML\\" + dt.Rows[i]["mName"].ToString() + ".htm\">")streamWriter.WriteLine(" <param name=\"ImageNumber\" value=\"21\">")//streamWriter.WriteLine(" <param name=\"ImageNumber\" value=\"1\">")streamWriter.WriteLine(" </OBJECT>")streamWriter.WriteLine("</UL>")Modes.Append(" </BODY>\r</HTML>")} streamWriter.WriteLine("</UL>\r</UL>\r</BODY>\r</HTML>")streamWriter.WriteLine()streamWriter.Close()str1.WriteLine(Modes)str1.Close()} }这语法很像HTML,但同时也不是,<UL></UL>代表一级节点,其中中间的 " <LI><OBJECT type=\"text/sitemap\"><param name=\"Name\" value=\"数据库服务器\"><param name=\"Local\" value=\"HTML\\全部对象.htm\"><param name=\"ImageNumber\" value=\"13\"></OBJECT>"这段代码负责节点内容、连接、图片显示功能,如果<UL>内容嵌套的话,则表示下一级节点。还有我定义的modes,它主要负责生成一个Htm文件(记住用文件流生成,文件后缀名不要用html,而要用htm,不然会有错误,具体我也不知道啥原因),这样hhc文件生成在根目录下接下来,则要生成hhk文件了它主要负责你索引部分要显示的内容,这里生成也很简单 1privatevoid OpenHhk() 2 { 3 FileStream fs = new FileStream(startPath + @"\test.hhk", FileMode.Create)//创建hhp文件 4//streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("GB18030"))5 streamWriter = new System.IO.StreamWriter(fs, System.Text.Encoding.GetEncoding("UTF-8"))6 streamWriter.WriteLine("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">")7 streamWriter.WriteLine("<HTML>")8 streamWriter.WriteLine("<HEAD>")9 streamWriter.WriteLine("<meta name=\"GENERATOR\" content=\"Microsoft® HTML Help Workshop 4.1\">")10 streamWriter.WriteLine("<!-- Sitemap 1.0 -->")11 streamWriter.WriteLine("</HEAD>")12 streamWriter.WriteLine("<BODY>")13 streamWriter.WriteLine("<UL>")14string sql = "SELECT dId,dName,status,dCreTime,dFieidNum,dChName,dFunctionDesc FROM Documents order by dName"15//string sqls = ""16 DataTable dt1 = DBHelper.getDatatable(sql)17foreach (DataRow dr in dt1.Rows) 18 { 19 streamWriter.WriteLine(" <LI><OBJECT type=\"text/sitemap\">")20 streamWriter.WriteLine(" <param name=\"Name\" value=\"" + dr["dName"].ToString() + "\">")21 streamWriter.WriteLine("<param name=\"Local\" value=\"" + dr["dName"].ToString() + ".htm\">")22 streamWriter.WriteLine("</OBJECT>")23 } 24 streamWriter.WriteLine("</UL>")25 streamWriter.WriteLine("</BODY>")26 streamWriter.WriteLine("</HTML>")27 streamWriter.WriteLine()28 streamWriter.Close()29 }执行以后就可以在根目录下生成hhk文件了到此为止,生成chm文件的必须的三大文件已经搞定了,下面就是compile方法了 1string hhcFile = @"C:\Program Files\HTML Help Workshop\hhc.exe"//hhc.exe文件位置,windows自带的,一般是这个路径 2publicstring _defaultTopic = ""//默认的页面 3privatebool Compile() 4 { 5string _chmFile = startPath + @"\test.chm"//chm文件存储路径 6 Process helpCompileProcess = new Process()//创建新的进程,用Process启动HHC.EXE来Compile一个CHM文件 7try 8 { 9//判断文件是否存在并不被占用10try11 { 12string path = _chmFile//chm生成路径13if (File.Exists(path)) 14 { 15 File.Delete(path)16 } 17 } 18catch(Exception e) 19 { 20thrownew Exception("文件被打开!�恢�勒Π沙绦蛏洗�侠矗�M�兄�赖母嫠咭幌拢��雌鹄锤芯跤械愠粤Γ�缓梦鹋


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11374263.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存