Разработка приложений для Internet© Александр Фролов, Григорий ФроловТом 31, М.: Диалог-МИФИ, 1997, 286 стр. Приложение WebHelpСоздайте новый проект под названием 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. Конечно, можно было бы запустить на выполнение непосредственно исполнимый файл программы навигатора, но в этом случае необходимо знать имя этого файла и суметь передать ему адрес, который надо посетить. Следует сказать, что одно только первое требование уже составляет определенную трудность, так как файлы навигаторов разных фирм, естественно, имеют различные названия, более того для разных версий одного и того же навигатора название файлов также может отличаться. |