使用Visual C++编程,其中的AppWizard可以提供上述两种帮助机制,但它提供的帮助机制最深只到当前的MDI子窗口。例如它可以为对话框提供帮助,但不能细到对话框中的对象--编辑框、列表框、按钮等。若要为子窗口中的对象提供更精细的帮助,将帮助内容显示在一个弹出式窗口中,(正如现在许多流行的应用程序那样),必须进行一些编程。本文介绍两种简单的方法。第一种方法:
(1)打开对话框的资源:
A. 选择对话框属性窗口的“扩展类型(Extended Styles)”书签,选中复选框“上下文 帮助(Context help)”
B. 选中对话框中所有你想提供帮助的控制的“帮助标志(Help ID)”复选框
C. 保存该资源
(2)用Microsoft Help Workshop打开该项目的帮助项目文件,在引用(Map)区,加入文件resource.hm,因为对话框中所有控制的帮助标志符都存在文件resource.hm中。
(3)在对话框类(CMyDialog)中,用ClassWizard覆盖消息WM_HELPINFO对应的函数OnHelpInfo。并对函数OnHelpInfo做如下修改:
BOOL CMyDialog::OnHelpInfo (HELPINFO* pHelpInfo)

CWnd *pWnd;
CRect rect;
CPoint point;//得到当前活动窗口
pWnd=FromHandle((HWND)pHelpInfo->hItemHandle);//得到当前活动窗口的大小和位置
pWnd->GetWindowRect(&rect);//得到当前活动窗口屏幕左上角的坐标
point.x=rect.left;
point.y=rect.top;//设置帮助的弹出式窗口位置
::WinHelp((HWND)pHelpInfo->hItemHandle,AfxGetApp()->m_pszHelpFilePath,
HELP_SETWINPOS,(DWORD)(point.x,point.y));//在弹出式窗口中显示帮助
AfxGetApp( )->WinHelp(pHelpInfo->dwContextId, HELP_CONTEXTPOPUP;
return TRUE;
}  (4)将帮助主题和内容加入你的帮助源文件中。
(5)编译帮助项目文件以及程序项目文件。此时,你可以试一下你的应用程序。打开对话框,在对话框中的控制上按下F1,或先按下标题栏上的问号按钮,再按下对话框中的任何控制,你会看见在一个弹出式窗口中显示出该控制的帮助。第二种方法:
(1)--(2)与第一种一致。
(3)在对话框的.CPP文件中,加入一个由两个双字组成的数组。数组的每一项代表了对话框中的一个控制。第一个双字是该控制的标志符;第二个是该控制的上下文帮助标志符。
const DWORD CMydialog::m_nHelpIDs[] =
{
IDC_MYBUTTON1, HIDC_MYBUTTON1,// HIDC_MYBUTTON1由文件 //resource.hm得到,它是该按钮的帮助
IDC_MYLIST1, HIDC_MYLIST1,, // HIDC_MYLIST1由文件resource.hm得 //到,它是该列表的帮助
IDOK, HIDOK,
IDCANCEL, HIDCANCEL,
0 , 0 //数组结束符
};
在对话框的.H文件中,在保护(Protected)区域中加上:
static const DWORD m_nHelpIDs[];
virtual const DWORD* GetHelpIDs() {return m_nHelpIDs;}
(4)在对话框类中,覆盖消息WM_HELPINFO对应的函数OnHelpInfo。并对函数 OnHelpInfo做如下修改:
BOOL CMyDialog::OnHelpInfo (HELPINFO* pHelpInfo)

::WinHelp((HWND)pHelpInfo->hItemHandle, AfxGetApp()->m_pszHelpFilePath,
HELP_WM_HELP, (DWORD)(LPVOID)GetHelpIDs());
return TRUE;
}
你也可以在对话框中覆盖消息WM_CONTEXTMENU对应的函数OnContextMenu,这样当鼠标右击对话框中的控制时,会弹出一个很象按钮的弹出式窗口,写着“What's This?”,再单击弹出式窗口,就会显示出该控制的帮助。程序如下:
void CMyDialog::OnContextMenu(CWnd* pWnd, CPoint point) 
{
::WinHelp(pWnd->m_hWnd, AfxGetApp()->m_pszHelpFilePath,
HELP_CONTEXTMENU, (DWORD)(LPVOID)GetHelpIDs());
}步骤(5)--(6)同第一种方法的(4)--(5)  

解决方案 »

  1.   

    菜单中作一个菜单项help,定义其快捷键为F1,在help的响应函数中处理。
      

  2.   

    to:a813(周)  首先谢谢你的帮助,你的资料对我很有帮助,但是我发现你用的是winhlp函数,他应该是对应的比较老的hlp帮助文件,我做的是chm的,好象应该用htmlhelp函数,并且这个函数可以用HH_HELP_CONTEXT 来显示一个特定的主题。现在我不知道如果操作chm文件的[map]section,我不知道如何对应控件的id到一个context上面,这方面还请多多指教了。
      

  3.   

    给你一个URL,该文章写的较详细
     http://www2.yesky.com/34670720/165483.shtml