15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

 

Добавление Контекстной Справки


Автор: Thomas Kokholm.

Компилятор: Visual C++ 5 & 6

Добавляя контекстную помощь к Вашему приложению, Вы, тем самым улучшаете интерфейс приложения и добавляете удобства пользователю. Обычно это выглядит как всплывающее окно с текстом справки, который Вы заранее определяете как ресурс в Вашем проекте.

Добавление контекстной помощи используя всплывающий HTML можно описать следующими четырьмя шагами:

  1. Разрешить context help для диалога в страничке 'Dialog Properties' -> 'Extended Styles'.
  2. Прописать текст справки для элемента в Вашей 'String Table'.
  3. Перехватить сообщение WM_HELPINFO в диалоговом классе.
  4. Скопировать и поместить нижеприведённый код в Ваш класс.
BEGIN_MESSAGE_MAP(CDlg, CDialog)
 ON_WM_HELPINFO()
END_MESSAGE_MAP()

Важно, чтобы id, используемый в Вашей String Table был назван так же как и элемент управления, используя выпадающее меню в диалоге 'String Properties'. Обработчик для сообщения WM_HELPINFO выглядит примерно так:

afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo);

BOOL CDlg::OnHelpInfo(HELPINFO* pHelpInfo) 
{
 // Именно этот метод и делает то, что нам нужно	
 ShowContextHelp(CWnd::FromHandle((HWND)pHelpInfo->hItemHandle), 
  pHelpInfo->MousePos, pHelpInfo->iCtrlId);

 // Мы будем обрабатывать сообщение, пропуская базовый класс
 // возвращаем CDialog::OnHelpInfo(pHelpInfo);
 return TRUE;  
}

Как упомянуто в комментариях, ShowContextHelp(...) это метод который выполняет основную работу по отображению контекстной справки. На вход метода подаются два параметра: указатель на окно, и структура типа POINT, в которой происходит запрос на справку.

void CDlg::ShowContextHelp(CWnd* pWnd, POINT pt, int iCtrlID)
{
CString s;

 // Загружаем текст помощи из String Table
 if(s.LoadString(iCtrlID))
 {
  HH_POPUP hPop; // структура всплывающей HTML справки

  // Инициализируем структуру знаками NULL (нулями)	
  memset(&hPop, 0, sizeof(hPop)); 

  // Устанавливаем размер структуры
  hPop.cbStruct         = sizeof(hPop);		

  // Цвет фона - жёлтый
  hPop.clrBackground    = RGB(255, 255, 208);	

  hPop.clrForeground    = -1; // Font color	
  hPop.rcMargins.left   = -1;			 
  hPop.rcMargins.bottom = -1;
  hPop.rcMargins.right  = -1;
  hPop.pt               = pt;	
  hPop.pszText          = s; // Текст из String Table
  hPop.pszFont          = NULL; // Шрифт
    
  HtmlHelp(pWnd->GetSafeHwnd(), NULL, 
   HH_DISPLAY_TEXT_POPUP, (DWORD)&hPop);
 } // Если строка справки для данного запроса найдена, то завершаем
} // конец ShowContextHelp(...)

Структура HH_POPUP используется для отображения контекстной справки во всплывающем окне. Структура имеет члены для установки цветов foreground/background, для положения вплывающего окна, и для выбора шрифта.

Второй параметр для метода HtmlHelp(...), это указатель на объект-файл где так же может находиться строка справки.

Надеюсь данный пример Вам очень пригодится.