Шаг 348 - MFC и функция WinHelp

То, что 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"));

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.