MFC Custom HtmlHelp

Я занимаюсь обслуживанием устаревшего приложения MFC. Когда пользователь выбирает "Справка" → "Справка" в главном меню в верхней части приложения, мне нужен пользовательский OnHelp() быть названным. Из моего исследования я узнал, что MFC обычно перехватывает эту команду автоматически и вызывает сам файл справки. Но вы можете переопределить эту команду и перехватить это сообщение самостоятельно. У меня есть это в моей карте сообщений:

BEGIN_MESSAGE_MAP(MyApp, MyBaseApp)
   //{{AFX_MSG_MAP(MyApp)
   ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
   ON_COMMAND(ID_HELP, OnHelp)
   //}}AFX_MSG_MAP
   // Standard file based document commands
END_MESSAGE_MAP()

"О" OnAppAbout() вызывается, но не мой OnHelp() (MFC все еще перехватывает это и вызывает помощь самостоятельно). Моя реализация довольно проста:

void MyApp::OnHelp()
{
    // This never gets called
   MessageBox( NULL, "HtmlHelp: MyApp", "Hey", MB_OK );

   CString csHelpFile;
   csHelpFile.Format( "%s/MyHelp.chm", MyDoc::GetHelpPath() );
   ::HtmlHelp(
       NULL,
       csHelpFile,
       HELP_WM_HELP,
       NULL );
}

Я знаю, что он не вызывается, потому что мой MessageBox никогда не появляется (я не могу использовать Visual Studio для отладки этого; только окна сообщений). Я также пытался втиснуть его в CMDIFrameWndс картой сообщений и аналогичной реализацией, но безуспешно (здесь реализован элемент, отличный от пункта меню Справка, и он работает нормально). Любая идея, что мне нужно сделать, чтобы подключиться к моей собственной функции справки?

1 ответ

Решение

Вам нужно добавить ON_WM_HELPINFO() в карту сообщений вашего CMainFrame. определять afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo); в заголовочном файле для основного фрейма и внедрите его в файл cpp:

BOOL CMainFrame::OnHelpInfo(HELPINFO* pHelpInfo)
{
#ifdef _DEBUG
  MessageBox( NULL, "HtmlHelp: MyApp", "Hey", MB_OK );
#endif

  CString csHelpFile;
  csHelpFile.Format( "%s/MyHelp.chm", MyDoc::GetHelpPath() );
  ::HtmlHelp(
   NULL,
   csHelpFile,
   HELP_WM_HELP,
   NULL );
  return CFrameWnd::OnHelpInfo(pHelpInfo);
}
Другие вопросы по тегам