Лабораторная работа №15. СОЗДАНИЕ СПРАВОЧНОЙ СИСТЕМЫ ДЛЯ ПРИЛОЖЕНИЯ ПОД WINDOWS.
Цель работы — овладение инструментальными и программными средствами построения справочных систем для приложений под Windows.
Большинство коммерческих Windows-программ пользуются преимуществами мощного ядра справочной системы WinHelp, входящего в состав Windows. Каркас приложений MFC позволяет применять это ядро для поддержки контекстно-зависимой справки в разрабатываемых программах.
Справочная система может быть оформлена в виде автономного файла, имеющего оглавление и позволяющего переходить от одной темы к другой. Запуск такой системы производится исполнением команды WinHelp.exe, параметром которой является имя файла справочной системы *.hlp.
Приложение на основе библиотеки MFC может само по командам меню вызывать WinHelp, передавая этой программе идентификаторы контекста справки, производные от идентификаторов окна и команд, при этом можно изменить в MFC схему обработки сообщений справочной системы, чтобы подогнать ее под нужды этого приложения и создать контекстно-зависимую справку.
Задание 1.
Создать автономный справочный файл с оглавлением и тремя тематическими разделами, выполнить следующие действия:
1. Набрать в текстовом процессоре, поддерживающем форматы RTF, следующий текст справочного файла:
Оглавление Темы:
Тема№1HID_TOPIC1 Тема №2 HID TOPIC2 Тема №3 HID TOPIC3
---------------------------------------------- конец страницы----------
Тема № 1
Это текст 1-ой темы
---------------------------------------------- конец страницы
Тема №2
Это текст 2-ой темы
---------------------------------------------- конец страницы----------
Тема №3
Это текст 3-ей темы
---------------------------------------------- конец страницы----------
2. Разбить разделителем «Конец страницы» весь текст на логические части - темы.
3. Перед словом «Оглавление» поставить сноску $ и задать для этой сноски заголовок раздела «Простое оглавление».
4. Перед сноской $ поставить сноску # и задать для этой сноски идентификатор контекста справки «HID CONTENTS».
5. Во втором разделе перед словами «Тема №1» поставить три сноски #$k с текстами соответственно «HID_TOPIC1», «Первая тема», «Темы», где сноска к позволяет задать список ключевых слов, по которым можно будет находить заданную тему.
6. В третьем разделе перед словами «Тема №2» поставить три сноски #$k с текстами соответственно «HID_TOPIC2», «Вторая тема», «Темы».
7. В четвертом разделе перед словами «Тема №3» поставить три сноски #$k с текстами соответственно «HID_TOPIC3», «Третья тема», «Темы».
8. В первом разделе слова «Тема №1» подчеркнуть двумя линиями, слова «Тема №2» - одной линией, а слова «Тема №3» - перечеркнуть (точки перехода).
9. В первом разделе слова «HID_TOPIC1», «HID_TOPIC2», «HID_TOPIC3» сделать скрытыми (гиперссылки), при этом проверить их на соответствие сноскам типа «#» и убедиться, что впереди них нет пробела , то есть, что они находятся вплотную к словам «Тема №1», «Тема №2», «Тема3».
10. Убедиться, что после четвертого раздела также стоит разделитель «Конец страницы».
11. Проверить скрытый текст с помощью команды Tool/Options/Ярлычок View/Hidden Text.
12. Сохранить текст в формате RTF в файле Simple.rtf.
13. Подготовить файл проекта Simple.hpj со следующими опциями:
[OPTIONS]
CONTENTS = HID CONTENTS TITLE = ПРОСТОЙ СПРАВОЧНЫЙ ФАЙЛ COMPRESS = true WARNING =2 [FILES] Simple.rtf
14. С помощью утилиты Microsoft Help Workshop (Hcrtf.exe), щёлкнув по кнопке Save and Compile, создать справочный файл Simple.hlp.
15. Запустить WinHelp, открыть файл Simple.hlp и проверить работу справочной системы.
Для создания оглавления с древовидной структурой добавить проект файл Simple.cnt с таким текстом:
: Base Simple.hlp
Help topics
Topic 1 = HID TOPIC 1
2 Topic 2 = HID TOPIC2
2 Topic 3 = HID TOPIC3
16 оздать справочный файл Simple.hlp с усовершенствованным оглавлением и проверить переходы из оглавления.
Оралова Ж. Ж.
Задание 2.
Создать остов одно документного приложения, установить переключатель контекстно-зависимой справки Context-Sensitive Help, посмотреть какие дополнительные файлы включены в проект, и проверить команды Contents и Search меню Help, а также действия клавиши F1. Оценить изменения в исходном тексте программы. Проверить действие комбинации клавиш Shift+F1.
Задание 3.
1. Создать однодокументное приложение с полным набором команд меню Help и функциональных клавиш для использования справочной системы Windows, выполнив следующие действия:
2. Создать остов однодокументного приложения с включенным переключателем Context-Sensitive Help и с именем Simple.
3. Создать справочный файл Simple.hlp.
4. Включить в меню Help элемент Topic 1 и в обработчик сообщения для этого элемента включить оператор:
AfxGetApp () -» WinHelp (HID TOPIC1); // - unsigned long int;
Скомпилировать проект и убедиться, что по команде Help/Topic 1 на экране появляется тема №1 справочного файла Simple.hlp, имя которого совпадает с именем приложения. Найти идентификатор HID_TOPIC1 в файле resourse.h и в файле Simple.hpj и убедиться, что он имеет одно и то же значение: #defineHID_TOPIC1 ... и [MAP] HID TOPIC 1 ....
5 .Переименовать файл Simple.hlp в файл New Simple.hlp.
6.Запустить приложениеSimple.exe и убедиться, что справочная система приложения не работает.
7.Создать новое приложение с тем же именем Simple, задав предварительно для элемента данных m_pszHelpFilePath класса CwinApp новое значение NewSimple.hlp.
8.Запустить приложение и убедиться, что справочная система приложения функционирует нормально.
9.Добавить в меню Help элемент "Поиск темы номер 2", а в обработчик сообщения для этой команды 2 строчки: Cstring string ("Тема номер 2");
AfxGetApp() -> WinHelp((DWORD)(LPCSTR) string, HELP KEY );
10.Скомпилировать проект и проверить поиск по команде Help/поиск темы номер 2.
11 .Убедиться, что для элемента HelpTopics меню Help, генерируемого AppWizard, в обработчике CwinApp: :OnHelpFinder используется следующий вызов: WinHelp(OL,HELP_FINDER);
12.Для вызова первой страницы справочного файла с перечнем чем ("старомодное оглавление") включить элемент OldContens и для его обработчика использовать функцию :
WinHelp(OL,HELP_INDEX);
13.Включить элемент "Help on Help" в меню Help и для обработчика включить вызов :
WinHelp(OL,HELP_HELPONHELP) ;
14.Скомпилировать проект и проверить вызовы справочной системы.
15.Ввести в проектный файл *.hpj псевдоним контекстной справки для первой темы: [ALIAS]
HID TOPIC 1 =HID FIRST THEAM [MAP]
HID TOPIC 1...
16.Убедиться, что вызов WinHelp(HID_FIRST_THEAM) дает тот же эффект, что и вызов WinHelp(HID_TOPIC 1).
Мастер приложений АррWizard создает стандартный справочный файл, если выбран стандартный параметр контекстной справки Context-Sensitive Help. Делается это следующим образом:
Мастер Арр Wizard формирует в меню Help создаваемого остова приложения элементы Contents и Search.
В соответствии с установленными параметрами приложения App Wizard создает следующие файлы:
o один или несколько стандартных справочных файлов в формате RTF;
o проектный файл *.hpj для компилятора Hcrtf.exe;
o стандартный файл карты справки *.hm;
o командный файл для построения справочного файла *.hlp.
Осуществляется автоматический переход на интерпретацию команд файла MakeHelp.bat, в результате сначала вызывается программа построения карты справки Makehm.exe для создания файлов * .hm, а затем - компилятор справочной системы Hcrtf.exe, создающий справочный файл * .hlp, имя которого совпадает с именем приложения.
После интерпретации команд файла MakeHelp.bat мастер App Wizard связывает клавиши F1 и Shift+F1, а также элементы меню Help с функциями класса CwinApp или CwinThread.
Во время работы приложения при нажатии клавиш F1и Shift+F1 или при выборе элементов меню Help осуществляется вызов WinHelp, который передается в качестве параметра идентификатор контекста, определяющий, какую именно справочную тему показать на экране. При этом, нажимая клавишу F1, можно задать вывод справки об элементе меню, выбранном с клавиатуры, или о текущем окне. Сочетание клавиш Shift+F1 обеспечивает вывод справок для элемента меню, на который указывает курсор мыши, для кнопки на панели инструментов, для окна - рамки, для окна отображения, для конкретного графического элемента в окне отображения, для строки состояния и для различных неклиентских элементов вроде команд системного меню. Такого же эффекта можно добиться, щелкнув мышью по кнопке ContextHelp на панели инструментов. В любом случае курсор меняет свою форму на стрелку с вопросительным знаком. При следующем щелчке мышью появляется справка с контекстом, определяемом по позиции курсора.
Сейтжанов Ж. Т.
Рис.1 Построение справочной системы приложения
Каркас приложения определяет контекст справки на основе идентификатора активного элемента интерфейса: команды меню,окна-рамки, элемента управления, диалогового или информационного окна.
При генерации исходного кода идентификатор контекста справки для того или иного элемента и префикса "H",а значение идентификатора контекста получается суммированием базового значения и значения идентификатора соответствующего элемента.Базовые шестнадцатиричные значения таковы:
Для элементов меню 10000
Для окна-рамки или диалогового окна 20000
Для окна сообщений об ошибках 30000
Для никлиентской области 40000
Для элементов управления 50000
Например,ID_EDIT_CLEAR_ALL=OxE121,в то время ,как HID EDIT CLEAR _ALL=Ox1E 121.
Стандартные справочные разделы для указанных элементов формируются в файлах AfxCore.rtf и AfxPrint.rtf (если включена опция
Printing And Rpint Preview).
Глобальная функция AfxMessageBox выводит сообщения об ошибках, формируемые каркасом приложений, и использует в качестве параметра идентификатор контекста сравки, так что при нажатии клавиши F1 при выдаче такого сообщения обеспечивается вывод подсказки.Для обеспечения такой возможности идентификаторы окон сообщений об ошибках должны начинаться с IDP_,а идентификаторы контекстов в PTF-файле - с HIDP_.Параметр функции определяет выдачу восклицательного или вопросительного знака. Строка подсказки может определяться указателем на текст или идентификатором строкового ресурса.
Контрольные вопросы
1. Какой формат имеет файл справки.
2. Опишите процесс разработки файлов справки.
3. Сто включает в себя компиляция справки.
4. Как осуществляется вызов справки из приложений.
Вопросы для подготовки к экзамену:
1. Перечислитевсе компоненты Visual C++ и выясните, какие из них установлены в студии разработчика данного компьютера. Охарактеризуйте две системы программирования, поддерживаемые Visual C++. Назовите основные классы и методы приложения, построенного на базе каркаса приложений. Опишите работу такого приложения.
2. Напишите строки исходного кода для обработки сообщения ОN_WM_LBUTTONDOWN.
3. Найдите описание указателя m_pMainWnd.
4. Перечислите основные методы класса CWinApp и укажите, какие из них являются виртуальными.
5. Перечислите основные методы класса CFrameWnd и укажите, какие из них являются виртуальными.
6. Найдите в исходных кодах Visual C++ определения макросов DECLARE_MESSAGE_MAP(), BEGIN_MESSAGE_MAP(...,...), END_MESSAGE_MAP().
7. Объясните, почему в библиотеке MFC обработчики сообщений о событиях не являются виртуальными, вспомнив, что число производных от CWin классов около 20, что число обрабатываемых сообщений в Windows более 140 и что в таблице диспетчеризации виртуальных функций требуется включать на каждую такую функцию 4 байта.
8. Объясните назначение карты сообщений MessageMap.
9. Объясните как имя сообщения Windows, например WM_LBUTTONDOWN, связано с именем соответствующего элемента в карте сообщений и с именем функции-обработчика этого сообщения.
10. Какие 4 фрагмента кода надо написать и куда их включить для создания собственного обработчика сообщения нового класса-потомка CWnd?
11. Назовите 3 способа включения трассировки программы.
12. Назовите 2 способа изменения состояния окон из стыковочного в плавающее и обратно.
13. Перечислите все типы проектов и укажите, какие из них ориентированы на использование
библиотеки MFC.
14. Укажите путь для каталога, в котором AppWizard по умолчанию создает каталоги проектов.
15. Перечислите подкаталоги, которые автоматически создает App Wizard в каталоге проекта.
16. Назовите платформу, используемую App Wizard по умолчанию.
17. Перечислите все типы интерфейсов приложений и укажите области их применения.
Серикбаева А. С.
18. Какую опцию следует задать для включения диалогового окна с информацией о версии
приложения? Как изменить или дополнить это окно?
19. Как задать управляющим элементам приложения трехмерную форму?
20. Как для приложения создать и включить справочный файл?
21. Как создать сервер или контроллер автоматизации?
22. Как создать сетевое приложение?
23. Перечислите типы создаваемых автоматически файлов проекта и укажите назначения файлов Readme.txt, StdAfx.h и StdApx.cpp.
24. Сколько шагов делает мастер AppWizard при создании остова приложения, основанного на диалоге и остова приложения с одно- и многодокументным интерфейсом?
25. Перечислите функциональные кнопки панели инструментов, вставляемые опцией Docking toolbar. Как отключить эту панель при работе приложения?
26. Что отображается в строке состояния приложения и как она отключается?
27. Каким образом произвести просмотр всех потомков и всех родителей данного класса, всех вызываемых и вызывающих функций?
28. Перечислите все способы поиска информации в электронной документации Visual C++.
29. Перечислите этапы процесса создания исполняемого файла проекта.
30. Где и какие файлы создаются при компоновке проекта для производственного режима и для отладочного режима? Сравните размеры соответствующих файлов.
31. Объясните , какие коды создал мастер ClassWisard для обработки сообщений о нажатии кнопок "Вы" и "Компьютер". 2.Поясните процедуру связывания переменных класса с окнами редактирования .
32. Поясните процедуру связывания строковых переменных с окнами редактирования и действия , выполняемые функцией UpdateData(Bool), при динамическом обмене данных.
33. Перечислите все функции которые используются при динамическом обмене.
34. Объясните возможности броузера классов и назовите условие, при котором его можно включить в работу.
35. Объяснить, каким образом производится создание документов и их обликов.
36. Перечислить классы библиотеки MFC, производные от классов CDocument и CView.
37. Объяснить назначение документных шаблонов и их структуру.
38. Сколько раз создается объект - документ при работе SDI-приложения?
39. Какими методами инициализируется объект - документ?
40. Объяснить взаимодействие главного окна - рамки, окна - рамки - документа и окна - облика.
41. Каково назначение метода Serialize?
42. Где хранится список обликов документа?
43. Как обеспечивается взаимосвязь документа и облика?
44. Как обеспечивается синхронизация работы обликов для одного и того же документа?
45. Какова роль документа в создаваемом приложении Scene?
46. Используя справочную систему Visual C++, подготовить и запомнить сведения о следующих методах: CsceneDocument:: GetDocument; CEdit:: SetWindowText; CEdit:: GetWindowText; CString:: Find; CString: :Left; CString: Mid; CString::IsEmpty.
47. Перечислите отличия многодокументного интерфейса от одно-
документного интерфейса.Укажите недостатки многодокументных приложений, создаваемых мастером АррWizard.Каково назначение документного шблона?
48. Где и каким образом создается документный шаблон?
49. Где создаются документы и облики при выполнении команд New и Open?
50. Опишите порядок создания интерфейса для приложения-словаря переводчика.
51. Перечислите этапы для реализации динамического обмена данными для окон редактирования.
52. Каково назначение класса CMapStringToString и каковы его основные методы?
53. Для каких целей используется метод Serialize()?
54. Опишите этапы создания словаря переводчика.
55. Как реализованы обработчики сообщений от командных кнопок приложения Dict?
56. Перечислите дополнения, которые необходимо сделать в методе InitInstance() для включения новых типов документов?
57. Как создаются ресурсы строк, меню и пиктограмм?
58. Каково назначение таблицы ускорителей для многодокументного интерфейса?
59. Опишите процедуру регистрации типов документов в системном реестре Windows?
60. Назвать основные функции GDIсистемы Windows.
61. Чем отличается контекст устройства системы Windows и контекст устройства библиотеки MFC
Visual C++.
62. Перечислить методы и атрибуты класса CDC.
63. Назвать и охарактеризовать производные классы класса CDC библиотеки MFC.
64. Каким образом создается и используется контекст устройства при перерисовке окна?
65. Подробнее описать реализацию метода OnDraw класса CDC.
66. Как переопределить метод OnDraw для того, чтобы нарисовать в окне фигуру прямоугольника, эллипса, сектора эллипса, замкнутого многоугольника и составного замкнутого многоугольника, а также выдать пиксел, провести линию и напечатать текст?
67. Указать события, которые приводят к передаче сообщения OnDraw.
68. Объяснить, каким образом возникает сообщение OnDraw при изменение размеров эллипса в третьем задании.
69. Объяснить назначение документа и переменной m_rectEllipse в третьем задании. 11.Что такое поврежденная клиентская область, область окна и прямоугольник окна? Как и когда они определяются?
70. Перечислить и объяснить назначения методы для обработки поврежденных частей рабочего окна
приложения.
71. Перечислить основные атрибуты контекста устройства.
72. Сколько типов логических систем координат поддерживает Windows?
73. Написать формулы для преобразования логических координат в физические координаты устройства.
74. Перечис лить все объекты GDIи указать случаи их применения.
75. Описать порядок использования объектов GDI.
76. Назвать и дать сравнительный анализ двух наборов классов библиотеки MFC для работы с базами данных.
77. Как реализуется просмотр таблицы Access?
78. Что такое сериализация обьектов Visual C++?
79. Какие изменения и дополнения в остове однодокументного приложения необходимо произвести, чтобы
обеспечить сериализацию обьекта стандартного класса MFC?
80. Какие изменения и дополнения в остове однодокументного приложения необходимо произвести, чтобы
обеспечить сериализацию обьекта нестандартного класса Visual C++?
81. В каких случаях нельзя использовать сериализацию обьектов любых классов Visual C++?
82. Обьяснить назначение класса CFile библиотеки MFC и кратко описать атрибуты и методы ?
83. Обьяснить назначение конструктора CFile и его параметров?
84. Перечислите все режимы открытия обьектов класса CFile?
85. Что такое текстовый или двоичный файл?Какое различие между этими файлами?
86. Поддерживается ли параллельная обработка данных файловой системой Visual C++?
87. Каково назначение файлового указателя?Что он определяет и как он изменяется?
88. Что такое статус файла и как он изменяется?
89. Каково различие в операторах Read и Read Huge,Write и Write Huge?
90. Возможно ли в файлах сохранять обьекты классов MFC?
91. Какой формат имеет файл справки.
92. Опишите процесс разработки файлов справки.
93. Сто включает в себя компиляция справки.
94. Как осуществляется вызов справки из приложений.