Во многих случаях нет необходимости встраивать навигатор непосредственно в приложение. Как правило достаточно ограничиться возможностью запуска навигатора из программы с переходом к нужному ресурсу.
Примером такого приложения может служить Microsoft Visual C++. Выверите из меню Help строку Web Favorites. На экране появится диалоговая панель Web Favorites (рис. 5.1). В списке Name перечислены ссылки на различные ресурсы Internet, которые могут быть интересны для программистов. Вы можете выбрать название любого ресурса из списка и нажать на кнопку Go To чтобы получить к нему доступ. Загрузится Internet Explorer, или другой навигатор, установленный в компьютере, и вы сможете просмотреть выбранный ресурс.
Рис. 5.1. Диалоговая панель Web Favorites
Кнопки New, Edit и Delete служат для редактирования списка ресурсов Internet. Они позволяют добавить новую ссылку, отредактировать уже существующую ссылку и удалить ссылку из списка.
Для загрузки ресурса Internet можно воспользоваться функциями ShellExecute или WinExec. В качестве примера мы привели приложение WebHelp. Справочная информация для приложения WebHelp доступна через Internet по адресу http://www.dials.ccas.ru/frolov/rwin/webhelp.htm.
Функция ShellExecute выполняет различные действия над определенным файлом. Файл может быть либо исполнимым файлом, либо файлом документа, либо папкой. Функция может запустить файл на выполнение (для исполняемых файлов), открыть файл документа с помощью соответствующего ему приложения или раскрыть на экране окно с содержимым папки (каталога).
Рассмотрим прототип функции ShellExecute:
HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd );
Параметр hwnd указывает идентификатор окна. Это окно будет выступать в качестве родительского окна для запускаемого приложения.
Наибольший интерес представляет параметр lpOperation. Он определяет операцию, которая будет выполняться над файлом, заданным в параметре lpFile. Как ни странно, код операции задается не числовой константой, а строкой, закрытой нулем. В качестве lpOperation можно указать строки “open”, “print” и “explore”. Краткое описание соответствующих операций мы привели в следующей таблице:
Параметр lpOperation |
Операция |
“open” или значение NULL |
Открыть файл, указанный параметром lpFile. Файл может быть исполнимым файлом, документом или папкой |
“print” |
Распечатать файл, определенный параметром lpFile. Указанный файл должен быть файлом документа |
“explore” |
Функция позволяет просмотреть содержимое папки, заданной параметром lpFile с помощью приложения Microsoft Explorer |
В случае, если ShellExecute используется для запуска исполнимого файла, вы можете передать ему строку параметров через lpParameters. Во всех остальных случаях указывайте в качестве lpParameters значение NULL.
Параметр lpDirectory задает имя каталога, который используется по умолчанию. В качестве него вы можете указать значение NULL.
Параметр nShowCmd позволяет указать режим, в котором будет запущено приложение. Этот параметр используется только при запуске исполнимых файлов. Если функция ShellExecute используется для открытия или печати файла документа, этот параметр следует указать равным нулю.
Описание возможных значений для параметра nShowCmd вы найдете в документации Microsoft Visual C++ или SDK. Фактически в качестве этого параметра можно использовать значения параметра nCmdShow известной функции WinMain. Например, вы можете указать в качестве параметра nShowCmd значение SW_SHOWNORMAL, который означает, что главное окно приложения должно иметь нормальные размеры и положение на экране, или значение SW_MINIMIZE, которое минимизирует окно запускаемого приложения.
Функция ShellExecute возвращает идентификатор (instance handle) запущенного приложения или идентификатор сервера DDE. Если возникнет ошибка, то функция возвращает ее код, значение которого меньше 32. Например, если указанный вами файл не будет обнаружен, то функция вернет код ERROR_FILE_NOT_FOUND. Полный список ошибок функции ShellExecute вы можете найти в документации.
Создайте новый проект под названием WebHelp. В качестве типа приложения выберите из списка Type строку Application. Наберите в редакторе исходный текст приложения и сохраните его в файле WebHelp.cpp (листинг 5.1). Чтобы быстрее набрать текст приложения, вы можете получить его, изменив исходный текст приложения MFMenu, которое мы приводили в 24 томе.
Включите файл WebHelp.cpp в проект. Теперь надо перейти к созданию ресурсов, используемых в приложении.
Листинг 5.1. Файл WebHelp.cpp
//============================================================ // Приложение WebHelp: справочная система на основе WWW // // (C) Фролов Г.В., 1997 // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov //============================================================ // Включаемый файл для MFC #include <afxwin.h> #include "WebHelpRes.h" //===================================================== // Класс CWebHelpApp - главный класс приложения //===================================================== class CWebHelpApp : public CWinApp { public: // Мы будем переопределять метод InitInstance, // предназначенный для инициализации приложения virtual BOOL InitInstance(); }; // Создаем объект приложение класса CWebHelpApp CWebHelpApp WebHelpApp; //===================================================== // Класс CWebHelpWindow - представляет главное окно //===================================================== class CWebHelpWindow : public CFrameWnd { public: // Объявляем конструктор класса CWebHelpWindow CWebHelpWindow(); // Объявляем методы для обработки команд меню afx_msg void WebHelpCommand(); afx_msg void AboutCommand(); afx_msg void ExitAppCommand(); // Макрокоманда необходима, так как класс // CWebHelpWindow обрабатывает сообщения DECLARE_MESSAGE_MAP() }; //===================================================== // Метод MenuCommand // Обрабатывает команду ID_TEST_BEEP //===================================================== void CWebHelpWindow::WebHelpCommand() { // Запускаем навигатор для просмотра справочной // информации, записанной на сервере WWW ShellExecute(NULL, "open", "http://www.dials.ccas.ru/frolov/rwin/webhelp.htm", NULL, NULL, SW_SHOWNORMAL); } //===================================================== // Метод MenuCommand // Обрабатывает команду ID_TEST_BEEP //===================================================== void CWebHelpWindow::AboutCommand() { MessageBox("World Wide Web Help, \n(c) Frolov Grigory"); } //===================================================== // Метод ExitApp //===================================================== void CWebHelpWindow::ExitAppCommand() { DestroyWindow(); } //===================================================== // Таблица сообщений класса CWebHelpWindow //===================================================== BEGIN_MESSAGE_MAP(CWebHelpWindow, CFrameWnd) ON_COMMAND(ID_HELP_WEBHELP, WebHelpCommand) ON_COMMAND(ID_HELP_ABOUT, AboutCommand) ON_COMMAND(ID_FILE_EXIT, ExitAppCommand) END_MESSAGE_MAP() //===================================================== // Метод InitInstance класса CWebHelpApp //===================================================== BOOL CWebHelpApp::InitInstance() { // Создаем объект класса CWebHelpWindow m_pMainWnd = new CWebHelpWindow(); // Отображаем окно на экране m_pMainWnd -> ShowWindow(m_nCmdShow); // Обновляем содержимое окна m_pMainWnd -> UpdateWindow(); return TRUE; } //===================================================== // Конструктор класса CWebHelpWindow //===================================================== CWebHelpWindow::CWebHelpWindow() { // Создаем окно приложения, соответствующее // данному объекту класса CWebHelpWindow Create(NULL, "World Wide Web Help", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU)); }
Приложение WebHelp должно содержать меню, из которого можно вызвать для просмотра в навигаторе WWW страницу со справочным текстом. Чтобы включить в проект меню, сначала создайте новый файл ресурсов. Выберите из меню File строку New, а затем из открывшейся диалоговой панели выберите строку Resource Script и нажмите кнопку OK.
Теперь выберите из меню Insert строку Resource. На экране появится диалоговая панель Insert Resource. Выберите из нее строку Menu и нажмите кнопку OK. Вы сможете разработать меню в диалоговом режиме. Чтобы быстрее перейти к редактированию меню, можно нажать кнопку New Menu () из панели управления Project.
Создайте меню Help, при выборе которой открывается меню, содержащее две строки - Web Help и About. В диалоговой панели свойств элементов меню (рис. 5.2) установите переключатель Help, тогда для этого меню будет установлено выравнивание по правому краю.
Затем в меню верхнего уровня добавьте строку File. В меню File поместите строку Exit. Строки Web Help и About из меню Help должны иметь идентификаторы ID_HELP_WEBHELP и ID_HELP_ABOUT, а строка Exit меню File - идентификатор ID_FILE_EXIT.
Рис. 5.2. Диалоговая панель Menu Item Properties
Сохраните файл ресурсов в файле с именем WebHelp.rc. Редактор ресурсов создает кроме самого файла ресурсов еще включаемый файл, в котором определяются константы, используемые в файле ресурсов. В нашем случае в нем определяются идентификаторы меню приложения. По умолчанию этот файл сохраняется под именем resource.h. Вы можете изменить его, выбрав из меню View строку Resource Includes. Для нашего приложения мы изменили имя включаемого файла для ресурсов на WebHelpRes.h. Содержимое этого файла представлено листингом 5.2.
Листинг 5.2. Файл WebHelpRes.h
//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by WebHelp.rc // #define IDR_MENU 101 #define ID_HELP_WEBHELP 40003 #define ID_FILE_EXIT 40005 #define ID_HELP_ABOUT 40007 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40008 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif
В листинге 5.3 мы привели файл ресурсов WebHelpRes.rc приложения. Этот файл был подготовлен редактором ресурсов Visual C++. Одна из первых строк файла содержит директиву #include, которой подключается файл WebHelpRes.h, содержащий описание идентификаторов ресурсов (листинг 5.2).
Среди прочих служебных строк, необходимых редактору ресурсов и компилятору Visual C++, вы можете обнаружить описание меню приложения IDR_MENU.
Листинг 5.3. Файл WebHelpRes.rc
//Microsoft Developer Studio generated resource script. // #include "WebHelpRes.h" #define APSTUDIO_READONLY_SYMBOLS ////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ////////////////////////////////////////////////////////////// // Russian resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) #ifdef _WIN32 LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT #pragma code_page(1251) #endif //_WIN32 ////////////////////////////////////////////////////////////// // // Menu // IDR_MENU MENU DISCARDABLE BEGIN POPUP "File" BEGIN MENUITEM "Exit", ID_FILE_EXIT END POPUP "Help", HELP BEGIN MENUITEM "Web Help", ID_HELP_WEBHELP MENUITEM SEPARATOR MENUITEM "About", ID_HELP_ABOUT END END #ifdef APSTUDIO_INVOKED ////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "WebHelpRes.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Russian resources ////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED
Теперь проект готов. Вы можете построить его и запустить полученное приложение WebHelp. Внешний вид приложения представлен на рисунке 5.3. Окно приложения имеет меню File и Help. В меню File расположена только одна строка Exit, выбрав которую вы можете завершить приложение. Меню Help состоит из двух строк - Web Help и About.
Рис. 5.3. Приложение WebHelp
Если вы выберите строку About, то на экране появится временная диалоговая панель с информацией об приложении. Когда же вы выбираете из меню Help строку Web Help, будет запущена программа навигатор, которая используется вами по умолчанию и в нее будет загружена WWW страница, расположенная по адресу http://www.dials.ccas.ru/frolov/rwin/webhelp.htm. Мы специально подготовили эту страницу, расположив ее на нашем сервере и поместили на ней краткие инструкции по работе с программой.
Обратите внимание, что описанная нами программа работает вне зависимости от того, какой навигатор вы используете - Microsoft Internet Explorer, Netscape Navigator или какую-либо другую программу.
Исходный текст приложения весьма прост и не содержит в себе каких-либо особенностей. Если вы желаете подробно изучить алгоритм работы приложения WebHelp, воспользуйтесь томом 24 серии “Библиотека системного программиста”. Единственное, что сейчас представляет для нас интерес, это то, как происходит запуск навигатора.
Когда вы выбираете из меню Help строку Web Help приложению поступает командное сообщение с идентификатором ID_HELP_WEBHELP. Это сообщение поступает в класс CWebHelpWindow и распределяется таблицей сообщений этого класса методу WebHelpCommand:
BEGIN_MESSAGE_MAP(CWebHelpWindow, CFrameWnd) ON_COMMAND(ID_HELP_WEBHELP, WebHelpCommand) ... END_MESSAGE_MAP()
Метод WebHelpCommand передает функции ShellExecute адрес страницы WWW, содержащей справочную информацию для приложения. Этот вызов запускает навигатор для просмотра информации по указанному адресу:
IRes = ShellExecute( NULL, // Индекс родительского окна "open", // Код операции "http://www.dials.ccas.ru/" // URL адрес страницы "frolov/rwin/webhelp.htm", NULL, // Строка параметров NULL, // Путь текущего каталога SW_SHOWNORMAL // Режим отображения // окна навигатора );
Мы не указываем функции ShellExecute индекс родительского окна и используем вместо него значение NULL. Нам надо открыть файл HTML, поэтому в качестве второго параметра передается строка "open". Строка URL адреса, в которой записан путь к справочному файлу, передается функции через третий параметр. Следующие два параметра - строка параметров и путь текущего каталога - не используются. В них указываются значения NULL.
В качестве кода операции используем строку "open". Она означает, что мы желаем открыть объект, адрес которого содержится в третьем параметре функции ShellExecute. В данном случае приложение WebHelp обращается на страницу WWW, расположенную по адресу http://www.dials.ccas.ru/frolov/rwin/webhelp.htm.
Третий и четвертый параметры функции ShellExecute содержат нулевые значения, так как мы не используем дополнительные параметры и текущий каталог. Последний, пятый параметр функции равен SW_SHOWNORMAL. Эта константа означает, что приложение для просмотра WWW страницы запускается в окне нормального размера (не свернутым до размера пиктограммы и не открытым на весь экран).
Код результата, возвращаемого функцией ShellExecute, проверяется. В случае если произошла ошибка, ее код отображается на экране при помощи функции MessageBox.
Конечно, можно было бы запустить на выполнение непосредственно исполнимый файл программы навигатора, но в этом случае необходимо знать имя этого файла и суметь передать ему адрес, который надо посетить. Следует сказать, что одно только первое требование уже составляет определенную трудность, так как файлы навигаторов разных фирм, естественно, имеют различные названия, более того для разных версий одного и того же навигатора название файлов также может отличаться.
В примере приложения WebHelp, справочная информация расположена в сети Internet на нашем WWW сервере по адресу http://www.glasnet.ru/~frolov. Однако вы можете пользоваться навигатором и для просмотра справочной информации в формате HTML на локальном диске компьютера, дискете или компакт диске.
Вы можете использовать технологии Internet для создания справочной системы приложения в формате HTML. В принципе, такая справочная система способна заменить традиционную справочную систему Windows. Надо сказать, что так поступают многие фирмы, например Microsoft и Intel. Достаточно посмотреть компакт-диск технической поддержки Intel и последнюю версию “Решений Microsoft”, также распространяемых на компакт-диске.
В пользу использования справочной системы на основе технологий Internet можно привести несколько соображений. Во-первых, разработка справочной системы в формате HTML позволяет легко перенести ее с локального варианта на WWW сервер Internet и наоборот. Поэтому вы убиваете сразу двух зайцев - создаете справочную систему для распространения вместе с приложением и подготавливаете материал для размещения на своем сервере в Internet. Во-вторых, вы можете использовать в разработке справочной системы новые технологии, открывающие новые возможности, например, органы управления ActiveX, аплеты на языке Java и т. д. Большое количество приложений для создания файлов HTML значительно облегчит вам эту задачу.
Если вы решили разрабатывать справочную систему приложения на основе файлов в формате HTML, надо позаботится, чтобы вместе с приложением поставлялась программа-навигатор. Для этого, вы можете использовать, например, навигатор Microsoft Internet Explorer. Подробную информацию о возможностях лицензионного распространения этого навигаторе вы можете получить на WWW сервере корпорации Microsoft по адресу http://www.microsoft.com/ie/ieak/.
В приложении WebHelp файлы справочной системы приложения находятся непосредственно в Internet. Измените приложение так, чтобы файлы справочной системы можно было расположить на локальном диске компьютера. Для этого достаточно записать соответствующий htm файл на жесткий диск локального компьютера и соответствующим образом изменить третий параметр функции ShellExecute, так чтобы он указывал на локальный файл.
Запустите измененное приложение WebHelp и выберите из меню Help строку Web Help. Сразу запустится навигатор Internet Explorer и в нем появится описание приложения. При этом совершенно необязательно, чтобы компьютер был соединен с сетью Internet. Более того, компьютер вообще может не иметь ни модема, ни сетевой карты - справочная система все равно будет работать, так как HTML файлы со справочной информацией расположены на локальном диске компьютера.