Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разработка справочной системы, Справка для отдельных кнопок, меню, окон 
V
    Опции темы
east
Дата 19.10.2011, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 22.5.2006

Репутация: 1
Всего: 1



Всем привет!
Решил сделать справку для приложения. Приложение SDI, есть сплитер, окно вида разделено на на два вида. Справка сформированная мастером работает как надо, т.е. в панели инструментов нажимаю кнопку со знаком вопроса, а потом на любом месте окна. Если нажать на кнопке панели инструментов, то выдается справка по этой кнопке. Такое же поведение и с меню. Меня интересует как это все работает, т.к. нужно будет добавлять свои пункты меню и кнопки на панель инструментов и соответственно хотелось бы отдельную справку для них. Также отдельную справку нужно организовать для разных видов.
Может кто знает какие ресурсы по данному вопросу, пдскажите, пожалуйста или обьясните как это работает.
PM MAIL   Вверх
spyswamp
Дата 2.11.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: нет
Всего: 7



Загугли по "организация справки MFC". Работает это все достаточно просто, пусть и не сразу очевидно (сам такой штукой пользовался несколько лет назад, результатом остался доволен, но более подробную информацию (имена классов и т.п.), к сожалению сейчас предоставить не могу - названия не помню, а в код глянуть смогу только вечером, если не забуду).


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
east
Дата 3.11.2011, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 22.5.2006

Репутация: 1
Всего: 1



Спасибо за ответ! Запрос по гуглю выдает всякую ерунду. Как я понял этим мало кто занимается и инфу в сети не выставляют кроме  msdn. Так что пришлось самому разбираться. Это действительно не сложно.
Если при создании проекта отмечена галочка создания контекстной справки, то при добавлении меню все идентификаторы для справки добавляются автоматом, остается добавить только файл справки. Идентификатор добавляется в файл HTMLDefines.h.
Допустим мы добавили пункт меню. Его ID = ID_FILE_NEW. В файле HTMLDefines.h создастся идентификатор справки HID_FILE_NEW. Создаем файл справки для нового пункта меню, например, file_new.htm. Далее в файле с расширением .hhp прописываем данные. В разделе [FILES] вставляем имя файла file_new.htm, в разделе [ALIAS] вставляем hid_file_new=file_new.htm. Теперь для нашего пункта меню будет вызываться созданная нами справка.
Теперь создадим справку для представления. Допустим нам нужно представление, созданное на базе CRichEditView. Создаем класс наследник от CRichEditView, например, CMyRichView. Создаем для этого класса идентификатор справки #define HID_MY_RICH_VIEW 0x0100, можно в файле HTMLDefines.h или в файле с расширением .hhp в разделе [MAP]. Также создаем файл справки и прописываем все данные как это делали для пункта меню. Теперь в нашем классе создаем функцию-обработчик сообщения WM_HELPHITTEST. В этой функции делаем вызов справки HtmlHelp(0x0100, 15);. Теперь для нашего вида будет работать справка.
PM MAIL   Вверх
spyswamp
Дата 9.11.2011, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: нет
Всего: 7



Я тут немного поковырял старье. Нарыл, что делал не прям глобальную справку, а ту, которая в тултипах появляется, если кликнуть на кнопку с вопросиком в заголовке, а потом на интересующий элемент окна.

Для этого у окна должен быть соответствующий стиль. Потом необходимо перегрузить функцию OnHelpInfo и выдать свою справку. Пример кода, в котором выводится свой справочный тултип для каждой строки списка, ниже:

Код

BOOL PerfomanceDialog::OnHelpInfo(HELPINFO *pHelpInfo)
{
    if (pHelpInfo->iCtrlId != 500)
        return FALSE;
    ShowContextHelp(CWnd::FromHandle((HWND)pHelpInfo->hItemHandle), pHelpInfo->MousePos, pHelpInfo->iCtrlId);
    return TRUE;
}

...

void PerfomanceDialog::ShowContextHelp(CWnd *wnd, POINT point, int ctrlID)
{
    // Определяем строку.
    CBCGPGridItemID itemId;
    CBCGPGridItem *item = NULL;
    m_PerfomanceGrid.ScreenToClient(&point);
    CBCGPGridRow *row = m_PerfomanceGrid.HitTest(point, itemId, item);
    m_PerfomanceGrid.ClientToScreen(&point);
    if (!row)
        return;
    // Выбираем текст для вывода на тултипе.
    CString text = _T("");
    switch (itemId.m_nRow)
    {
        // Тут формируется text.
        // Кейсы по справкам для каждой строки убрал, т.к. их там 13 штук было. :)
    }

    // Формируем тултип.
    HH_POPUP hPop;
    ZeroMemory(&hPop, sizeof(HH_POPUP));
    hPop.cbStruct         = sizeof(hPop);
    hPop.clrBackground    = RGB(255, 255, 208);
    hPop.clrForeground    = -1;   
    hPop.rcMargins.left   = -1;
    hPop.rcMargins.bottom = -1;
    hPop.rcMargins.right  = -1;
    hPop.pt               = point;
    hPop.pszText          = text;

    // Вывод тултипа.
    ::HtmlHelp(wnd->GetSafeHwnd(), NULL, HH_DISPLAY_TEXT_POPUP, (DWORD)&hPop);
}


Надеюсь, что это тоже пригодится, если уж кто задумает делать мегасправку по всему приложению, включая эту мелочь.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0642 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.