Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Разработка приложений для 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.

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

[Назад] [Содеожание] [Дальше]