TN028:区分上下文的帮助备份

此说明描述了分配的帮助上下文 ID 规则,并其他帮助在 MFC 问题。 区分上下文的帮助支持要求 Visual C++ 中的可用帮助编译器。

备注

使用 HTML 帮助,除实现使用 WinHelp 的区分上下文的帮助外, MFC 还支持。有关此支持的更多信息,并且编程在 HTML 帮助下,请参见 HTML 帮助:您的程序的区分上下文的帮助

支持的帮助的类型

在 windows 应用程序实现的区分上下文的帮助两种类型的。 第一,称为 “F1 帮助”涉及生成 WinHelp 的基于当前活动的对象的相应上下文。 第二个是 “Shift+ F1”模式。 在此模式下,将鼠标光标更改帮助光标和用户同时单击对象。 此时, WinHelp 生成授予用户单击的对象的帮助。

Microsoft 基础类实现帮助的这两种形式。 此外,框架支持两个简单的帮助命令,帮助索引和使用帮助。

帮助文件

Microsoft 基础类 (mfc) 假定一个帮助文件。 该帮助文件必须与路径与应用程序相同。 例如,在中,如果可执行文件为 C:\MyApplication\MyHelp.exe 帮助文件必须位于 C:\MyApplication\MyHelp.hlp。 通过 CWinApp 类m_pszHelpFilePath 成员变量设置路径。

帮助上下文范围

MFC 的默认实现需要一个程序遵循有关帮助上下文 ID 分配的某些规则。 这些规则是 ID 的大小分配到特定控件。 可以通过提供各种帮助相关的成员函数的不同实现重写这些规则。

0x00000000 - 0x0000FFFF : user defined
0x00010000 - 0x0001FFFF : commands (menus/command buttons)
   0x00010000 + ID_
   (note: 0x18000-> 0x1FFFF is the practical range since command IDs are >=0x8000)
0x00020000 - 0x0002FFFF : windows and dialogs
   0x00020000 + IDR_
   (note: 0x20000-> 0x27FFF is the practical range since IDRs are <= 0x7FFF)
0x00030000 - 0x0003FFFF : error messages (based on error string ID)
   0x00030000 + IDP_
0x00040000 - 0x0004FFFF : special purpose (non-client areas)
   0x00040000 + HitTest area
0x00050000 - 0x0005FFFF : controls (those that are not commands)
   0x00040000 + IDW_

简单的 “帮助”命令

具有由 Microsoft 基础类实现的两个简单的帮助命令:

第一个命令显示应用程序的帮助索引。 第二个示例演示在使用 WinHelp 程序的用户帮助。

区分上下文的帮助 (F1 帮助)

F1 键通常将转换为命令与 ID_HELP ID 由快捷键将被放入主窗口的快捷键对应表。 ID_HELP 命令只能由具有 ID_HELP ID 的一个按钮也会在主窗口或对话框。

无论 ID_HELP 命令如何生成的,则将作为一般命令,直至到达命令处理程序。 有关 MFC 命令传送结构的更多信息,请参见 技术说明 21。 如果应用程序已启用帮助, ID_HELP 命令将由 CWinApp::OnHelp处理。 应用程序对象接收帮助消息正确然后将命令。 ,因为默认命令传送用于确定最具体的上下文,不充分这是必需的。

CWinApp::OnHelp 尝试生成按以下顺序的 WinHelp:

  1. 有效的 AfxMessageBox 的检查调用以帮助 ID. 如果消息框是当前活动的, WinHelp 生成与上下文适当到该消息框。

  2. WM_COMMANDHELP 信息发送到活动窗口。 如果该窗口不通过生成 WinHelp 响应,同一信息并发送到该窗口的上级,直到处理消息或当前窗口是顶级窗口。

  3. 将一个 ID_DEFAULT_HELP 命令向主窗口。 该函数来帮助。 此命令通常映射到 CWinApp::OnHelpIndex

全局重写默认 ID 基础值 (即。 命令的资源的 0x10000 和 0x20000 例如对话框),应用程序应重写 CWinApp::WinHelp

若要重写此函数和帮助上下文确定的方法,您应处理 WM_COMMANDHELP 消息。 除了框架提供了可能希望提供更具体的帮助路由,,因为它只转到相同的深度与当前 MDI 子窗口。 您可能还需要提供更具体的帮助涉及特定窗口或对话框,而基于该对象当前内部状态或在对话框中的活动控件。

WM_COMMANDHELP

afx_msg LRESULT CWnd::OnCommandHelp(WPARAM wParam, LPARAM lParam)

WM_COMMANDHELP 由活动窗口接收的专用窗口 MFC 消息,同时帮助请求时。 当窗口收到此消息时,它会调用并与窗口的内部状态的上下文 CWinApp::WinHelp

  • lParam
    包含当前可用的帮助上下文。 ,如果不确定,lParam 为零帮助上下文。 OnCommandHelp 的实现。 lParam 使用上下文 ID 确定不同的上下文或可以传递给 CWinApp::WinHelp

  • wParam
    未使用和为零。

如果 OnCommandHelp 函数调用 CWinApp::WinHelp,它将返回 TRUE。 返回 TRUE 停止该命令传送到其他类以及其他窗口。

帮助模式 (Shift+F1 帮助)

这是区分上下文的帮助的第二个窗体。 通常,此模式可以输入按 SHIFT+F1 或通过菜单或工具栏。 它实现为命令 (ID_CONTEXT_HELP)。 消息筛选器挂钩不使用将此命令,在一个模式对话框或菜单处于活动状态时,因此该命令只供用户,当应用程序执行主消息泵时 (CWinApp::Run)。

在输入此模式后,帮助鼠标光标显示在所有应用程序,因此,即使应用程序通常将显示其该区域自己的光标 (例如在窗口的大小调整边框)。 用户可以使用鼠标或键盘选择命令。 不必执行命令,该命令的帮助显示。 此外,用户可以在屏幕上单击可视对象,如工具栏上的按钮,,并有助于为该对象将显示。 CWinApp::OnContextHelp提供帮助此模式。

此循环中执行,所有键入处于非活动状态,但键访问菜单。 此外,命令转换。 PreTranslateMessage 执行多少允许用户按快捷键和获得该命令的帮助。

如果特定转换或发生在 SHIFT+F1 帮助模式下,不应执行的 PreTranslateMessage 的事件函数,则应在执行这些操作之前检查 CWinAppm_bHelpMode 成员。 PreTranslateMessage 的例如 CDialog 实现在调用 IsDialogMessage之前检查此,。 在 SHIFT+F1 模式下,这将禁用 “对话框在无模式对话框的导航”键。 此外,此循环中, CWinApp::OnIdle 仍调用。

如果用户从菜单选择命令,则的处理方式与在该命令的帮助 (通过 WM_COMMANDHELP,请参见下面的)。 如果用户单击应用程序窗口中可见区域,确定使关于是否为非工作区单击或客户端单击。 OnContextHelp 句柄映射到客户端的非工作区单击自动单击。 如果它是客户端单击,然后发送到 WM_HELPHITTEST 单击的窗口。 如果该窗口返回非零值,该值用作上下文来帮助。 如果返回零, OnContextHelp 尝试父窗口 (和失败时,其父,等等)。 如果帮助上下文无法确定的,则默认值为发送 ID_DEFAULT_HELP 命令向主窗口, (通常为) 然后映射到 CWinApp::OnHelpIndex

WM_HELPHITTEST

afx_msg LRESULT CWnd::OnHelpHitTest(WPARAM, LPARAM lParam)

WM_HELPHITTEST 为 SHIFT+F1 帮助模式下单击的活动窗口接收的私有 MFC windows 消息。 当窗口收到此消息时,它返回 DWORD 帮助 ID 供 WinHelp 使用。

  • LOWORD (lParam)
    包含鼠标单击相对于窗口的工作区的 X 轴设备坐标。

  • HIWORD (lParam)
    包含 Y 轴坐标。

  • wParam
    未使用和为零。 如果返回值为非零, WinHelp 调用与该上下文。 如果返回值为零,父窗口为帮助 " 中的查询。

在大多数情况下,您可以使用命中测试可能已经具有的代码。 进程 WM_HELPHITTEST 消息的示例参见 CToolBar::OnHelpHitTest 的实现 (代码利用按钮上和工具提示使用的命中测试代码在 CControlBar)。

MFC 应用程序向导支持和 MAKEHM

MFC 应用程序向导创建必要的文件生成帮助文件 (.cnt 和 .hpj 文件)。 它还包含由 Microsoft help 编译器接受的许多预生成的 .rtf 文件。 许多主题已完成,但是,某些可能需要对您的特定应用程序进行修改。

映射”文件的 “帮助的自动创建由调用 MAKEHM 的实用工具支持。 MAKEHM 实用工具可以将应用程序的 RESOURCE.H 文件用于映射文件的帮助。 例如:

#define IDD_MY_DIALOG   2000
#define ID_MY_COMMAND   150

将转换为:

HIDD_MY_DIALOG    0x207d0
HID_MY_COMMAND    0x10096

此格式与帮助编译器的设备兼容,映射上下文 ID (在右侧的数字) 与主题名称 (在左侧的符号)。

MAKEHM 的源代码可在 MFC 编程的实用工具示例 MAKEHM

添加帮助在运行 MFC 应用程序向导后支持

最好的方法添加添加到您的应用程序将检查在 MFC 应用程序向导的高级功能页的 “区分上下文的帮助”选项在创建应用程序。 这样 MFC 应用程序向导自动添加必要的消息映射项到您的 CWinApp- 支持帮助的派生类。

在消息框中显示帮助

在消息框中显示帮助 (有时称为提醒) 通过 AfxMessageBox 功能, MessageBox windows API 的包装支持。

具有 AfxMessageBox,一个用于字符串 ID 的使用另一的两个版本用于指针字符串 (LPCSTR):

int AFXAPI AfxMessageBox(LPCSTR lpszText, UINT nType, UINT nIDHelp);
int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp);

在这两种情况下,可以选择帮助 ID.

在第一种情况下,默认值 nIDHelp 的为 0,而指示此消息框的帮助。 如果用户按 F1,则例如消息框处于活动状态时,用户不会获得帮助 (即使应用程序支持帮助)。 如果不需要的,应为 nIDHelp 提供帮助 ID。

在第二种情况下,默认 nIDHelp 的是 -1,指示帮助 ID 相同。 nIDPrompt。 帮助将才会运行,应用程序可帮助启用,当然)。 应对 nIDHelp 提供 0,如果您希望消息框没有帮助备份。 如果不 nIDPrompt 希望消息是启用的帮助,但是,需要不同的帮助 ID,为 nIDHelp 请提供一个正整数值与 nIDPrompt 不同。

请参见

其他资源

由Number "技术说明

技术说明按类别