几何尺寸与公差论坛

 找回密码
 注册
查看: 1915|回复: 0

如何做上下文敏感的帮助,就是响应f1的那种

[复制链接]
发表于 2007-7-16 23:40:26 | 显示全部楼层 |阅读模式
?使用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)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-5-8 06:14 , Processed in 0.036891 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表