То, что MFC умеет работать с помощью, вызвать ее это хорошо. Но что делать, если нам самим нужно вызвать эту команду да еще со своими параметрами. Можно воспользоваться функцией WinHelp API, в тоже время класс CWnd имеет такую же функцию.
CWinApp::WinHelp virtual void WinHelp ( DWORD dwData, // данные UINT nCmd = HELP_CONTEXT // команда );
Как видите она намного проще. Во-первых не надо указывать какое приложение вызывает справку, плюс к этому вообще и файл справки указывать не надо, так как MFC помнит файл, который она создала. Для того, чтобы воспользоваться этой функцией самому нужно первое это описать константы разделов, которые будут вызываться.
// MainFrm.cpp : implementation of the CMainFrame class // ...... #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define HIDD_DIALOG1 0x20082 /////////////////////////// ......
И вызвать саму функцию в ответ на какое-то событие.
///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers void CMainFrame::OnViewDialog() { WinHelp(HIDD_DIALOG1); }
Откуда MFC знает имя ? Оно хранится в классе CWinApp. Этот код выдаст Вам имя справки.
void CMainFrame::OnViewDialog() { AfxMessageBox(AfxGetApp()->m_pszHelpFilePath); }
Откуда оно берется ? Определяется во время инициализации WinApp, вычисляется исходя из имени модуля.
void CWinApp::SetCurrentHandles() { ...... TCHAR szBuff[_MAX_PATH]; VERIFY(::GetModuleFileName(m_hInstance, szBuff, _MAX_PATH)); ...... if (m_pszHelpFilePath == NULL) { lstrcpy(lpszExt, _T(".HLP")); BOOL bEnable = AfxEnableMemoryTracking(FALSE); m_pszHelpFilePath = _tcsdup(szBuff); AfxEnableMemoryTracking(bEnable); *lpszExt = '\0'; // back to no suffix } ...... }
При необходимости смены этого имени сначала память выделенную под строку нужно удалить, потом присвоить значение этой строке:
free((void*)m_pszHelpFilePath m_pszHelpFilePath=_tcsdup(_T("d:\\somedir\\myhelp.hlp"));