凹甲陆龟生长:VC程序使用chm作为上下文相关帮助

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 11:21:36
VC程序使用chm作为上下文相关帮助 发布于:软件开发网 来源:互联网 作者:佚名 时间:2009-02-26 00:00

废话:
最近在做一个安装程序。鉴于用户对数据库啊,应用服务器啊不可能那么熟悉,所以想要弄一个上下文相关帮助。
一开始想用VC6自带的上下文相关帮助。在建立工程的时候选择context-sensitivehelp即可。嗯,vc帮我创建了AfxDlg.rtf、setup.cnt、setup.hm、setup.hpj、setup.ph等文件,以为省事了,用word打开AfxDlg.rtf一看,完全不会编辑。看了《insidevisualC 》里面的文章,还是一头雾水。
winhelp这老掉牙的东西,在win98年代就被htmlhelp淘汰了,俺还用它干嘛?决定弃暗投明,使用htmlhelpworkshop来做帮助。htmlhelpworkshop是一款制作chm文件的工具,微软免费提供,到处有的下。使用起来也方便,比编辑rtf格式要方便多得多,基本方法是把制作好的网页往里面塞,不浪费口舌了。

原理:
用htmlhelpworkshop制作chm是方便,关键是怎么让它可以"上下文相关"。程序里调用chm帮组文件的api是
HWNDHtmlHelp(HWNDhwndCaller,LPCSTRpszFile,UINTuCommand,DWORDdwData);
简单啊。废话少说,更改App类的WinHelp()方法如下:
voidCSetupApp::WinHelp(DWORDdwData,UINTnCmd)
{
::HtmlHelp(NULL,"E:\\workshop\\setup\\hlp\\chmtest.chm",HH_HELP_CONTEXT,dwData);
}
当然啦,具体文件在哪请你自己具体分析。这里要说的是这个dwData可是很有来头的,设个断点你就可以看个清楚了:
ID_HELP命令的消息路径是:
CWnd::OnWndMsg()
CDialog::OnCommandHelp()具体:
LRESULTCDialog::OnCommandHelp(WPARAM,LPARAMlParam)
{
if(lParam==0&&m_nIDHelp!=0)
lParam=HID_BASE_RESOURCE m_nIDHelp;//m_nIDHelp就是你的对话框的id哦
if(lParam!=0)
{
CWinApp*pApp=AfxGetApp();
if(pApp!=NULL)
pApp->WinHelp(lParam);//注意看这里,这就是为什么要改App类的WinHelp()
returnTRUE;
}
returnFALSE;
}

如何写CHM:
现在要做的就是把dwData和想要显示的东西关联起来。还好有了网络我们身边有很多专家:
具体方法是:
1、使用记事本建立一个文本文件,文件名为Map.h。在该文件中输入下面的内容:
#defineTOPIC1100
#defineTOPIC2200
这里TOPIC1、TOPIC2是一些常量,100、200是你在API调用时指定的ContextID。
2、在HTMLHelpWorkshop中选择Project标签,点击HtmlHelpAPIinformation按钮,在对话框的Map标签中选择HeaderFile按钮,然后选择你前面建立的Map.h文件。
3、还是在HtmlHelpAPIinformation对话框中选择Alias标签,点击Add按钮,在对话框中的WheneverThisConstantornumberispassedtotheHTMLHelpAPI下输入常量,如TOPIC1。
4、在UseittoRefertoThisHTMLFile中选择HTML文件,如Topic1.html。
5、重复3、4两步指定所有文件。
6、编译文件就可以了。
(转自http://www.china-askpro.com/msg44/qa78.shtml)
具体的ContextID可不是100,200啊,是HID_BASE_RESOURCE 对话框ID。
查找一下发现:#defineHID_BASE_RESOURCE0x00020000UL,如果你的对话框ID值是0x0102那就该
#defineMYDLGID0x20102了。

如何调用HtmlHelp:
还真烦,在vc里调用这玩意还不是简单的小事。还好微软心肠不错,在提供htmlhelpworkshop的时候提供了调用方法,就是在htmlhelpworkshop的安装目录下提供了个头文件和静态库,这个库的作用是装载hhctrl.ocx(system32目录下),调用其中真正的htmlhelp方法。具体见:
http://www.yesky.com/SoftChannel/72342376173010944/20010409/165483.shtml

疑问:
是不是所有系统下面都有hhctrl.ocx?win98上应该都有吧?Windows自己的帮助文件也是chm格式的...