?? 最近在做一個(gè)安裝程序。想要弄一個(gè)上下文相關(guān)幫助。
??? 一開(kāi)始想用vc6自帶的上下文相關(guān)幫助。在建立工程的時(shí)候選擇context-sensitive help即可。嗯,vc幫我創(chuàng)建了AfxDlg.rtf、setup.cnt、setup.hm、setup.hpj、setup.ph等文件,以為省事了,用word打開(kāi)AfxDlg.rtf一看,完全不會(huì)編輯。看了《inside visual c++》里面的文章,還是一頭霧水。
??? winhelp這老掉牙的東西,在win98年代就被htmlhelp淘汰了,俺還用它干嘛?決定棄暗投明,使用html help workshop來(lái)做幫助。html help workshop是一款制作chm文件的工具,微軟免費(fèi)提供,到處有的下。使用起來(lái)也方便,比編輯rtf格式要方便多得多,基本方法是把制作好的網(wǎng)頁(yè)往里面塞,不浪費(fèi)口舌了。
??? 用html help workshop制作chm是方便,關(guān)鍵是怎么讓它可以"上下文相關(guān)"。程序里調(diào)用chm幫組文件的api是
??? HWND HtmlHelp(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD dwData);?
??? 更改App類(lèi)的WinHelp()方法如下:
?void CSetupApp::WinHelp(DWORD dwData, UINT nCmd)
?{
? ::HtmlHelp(NULL, "E:\\workshop\\setup\\hlp\\chmtest.chm", HH_HELP_CONTEXT, dwData);
?}
??? 具體文件在哪需要具體分析。這里要說(shuō)的是這個(gè)dwData可是很有來(lái)頭的,設(shè)個(gè)斷點(diǎn)就可以看個(gè)清楚了:
?ID_HELP命令的消息路徑是:
?CWnd::OnWndMsg()
?CDialog::OnCommandHelp()
?LRESULT CDialog::OnCommandHelp(WPARAM, LPARAM lParam)
?{
? if (lParam == 0 && m_nIDHelp != 0)
?? lParam = HID_BASE_RESOURCE + m_nIDHelp;//m_nIDHelp就是你的對(duì)話框的id哦
? if (lParam != 0)
? {
?? CWinApp* pApp = AfxGetApp();
?? if (pApp != NULL)
??? pApp->WinHelp(lParam);//
?? return TRUE;
? }
? return FALSE;
?}
?
如何寫(xiě)CHM:
??? 現(xiàn)在要做的就是把dwData和想要顯示的東西關(guān)聯(lián)起來(lái)。
?具體方法是:
?1、使用記事本建立一個(gè)文本文件,文件名為Map.h。在該文件中輸入下面的內(nèi)容:
?#define TOPIC1 100
?#define TOPIC2 200
?這里TOPIC1、TOPIC2是一些常量,100、200是你在API調(diào)用時(shí)指定的ContextID。
?2、在HTMLHelp Workshop中選擇Project標(biāo)簽,點(diǎn)擊HtmlHelp API information按鈕,在對(duì)話框的Map標(biāo)簽中選擇Header File按鈕,然后選擇你前面建立的Map.h文件。
?3、還是在HtmlHelp API information對(duì)話框中選擇Alias標(biāo)簽,點(diǎn)擊Add按鈕,在對(duì)話框中的Whenever This Constant or number is passed to the HTMLHelp API下輸入常量,如TOPIC1。
?4、在Use it to Refer to This HTML File中選擇HTML文件,如Topic1.html。
?5、重復(fù)3、4兩步指定所有文件。
?6、編譯文件就可以了。
?(轉(zhuǎn)自
http://www.china-askpro.com/msg44/qa78.shtml)
?具體的ContextID不是100,200啊,是HID_BASE_RESOURCE+對(duì)話框ID。
?查找一下發(fā)現(xiàn):#define HID_BASE_RESOURCE 0x00020000UL ,如果你的對(duì)話框ID值是0x0102那就該
?#define MYDLGID 0x20102了。
注:// Help ID bases(afxpriv.h)
#define HID_BASE_COMMAND??? 0x00010000UL??????? // ID and IDM
#define HID_BASE_RESOURCE?? 0x00020000UL??????? // IDR and IDD
#define HID_BASE_PROMPT???? 0x00030000UL??????? // IDP
#define HID_BASE_NCAREAS??? 0x00040000UL
#define HID_BASE_CONTROL??? 0x00050000UL??????? // IDC
#define HID_BASE_DISPATCH?? 0x00060000UL??????? // IDispatch help codes
?