如何处理 CMFCPropertySheet / CMFCPropertyPage 上的帮助按钮?

How to handle the Help button on CMFCPropertySheet / CMFCPropertyPage?

根据 MSDN:

Help in CPropertySheet is supported by the F1 key and the Help button only. The Help button appears in the application framework by default. No intervention by the user is necessary. When the user adds the help information for each of the pages inside the property sheet, the help mechanism automatically displays the help for that page when the Help button is clicked.

我假设 CMFCPropertySheet 也是如此。所以我首先开始尝试处理 WM_HELPINFO 处理程序:

void COtherSettingsEmailInfoPage::HtmlHelp(DWORD_PTR dwData, UINT nCmd)
{
    HtmlHelp((DWORD_PTR)_T("HelpOptionsEmail.html"), HH_DISPLAY_TOPIC);

    //CMFCPropertyPage::HtmlHelp(dwData, nCmd);
}

没用。然后我添加了一个 IDHELP 按钮点击处理程序:

void COtherSettingsEmailInfoPage::OnHelp()
{
    HtmlHelp((DWORD_PTR)_T("HelpOptionsEmail.html"), HH_DISPLAY_TOPIC);
}

没有成功。

那么当用户按下 sheet 上的“帮助”按钮时,我应该如何显示正确的帮助主题?困惑。

更新

我在 sheet 和页面中都试过了 - 不起作用:

BOOL COtherSettingsEmailInfoPage::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
    LPPSHNOTIFY lppsn = (LPPSHNOTIFY)lParam;

    if (lppsn->hdr.code == PSN_HELP)
    {
        AfxMessageBox(_T("Boo2"));
    }

    return CMFCPropertyPage::OnNotify(wParam, lParam, pResult);
}

最后搞定了。

首先,OI 在我的应用程序中遇到了一个小问题,CWinApp 使用了错误的文件名。这是在我对我的应用程序进行更改时引起的。所以我在 InitInstance:

中修复了它
CString strHelp = GetProgramPath();
strHelp += _T("MeetSchedAssist.CHM");
free((void*)m_pszHelpFilePath);
m_pszHelpFilePath = _tcsdup(strHelp);

接下来,我必须向 CMFCPropertySheet class 添加一个通知处理程序:

页眉:

afx_msg void OnPsnHelp(NMHDR* hdr, LRESULT* res);   // Our help button message handler

来源:

ON_NOTIFY(PSN_HELP, 0, &COtherSettingsEmailInfoPage::OnPsnHelp)

...
...

void COtherSettingsEmailInfoPage::OnPsnHelp(NMHDR* hdr, LRESULT* res)
{
    HtmlHelp((DWORD_PTR)_T("HelpOptionsEmail.htm"), HH_DISPLAY_TOPIC);
}

现在它可以正确显示帮助主题。