Разработка приложений для Internet

Добавление программного кода


После того как вы подготовили главную диалоговую панель приложения Look и привязали к органам управления этой панели соответствующие переменные, надо добавить к классу CLookDlg ряд методов, которые будут обрабатывать сообщения от диалоговой панели. Вы должны добавить методы, обрабатывающие сообщения от кнопок Navigate (IDC_NAVIGATE), Stop (IDC_BUTTON_STOP), Refresh (IDC_BUTTON_REFRESH), Exit (IDOK), от списка с адресами серверов Internet (IDC_COMBO_ADDRESS) и от объекта навигатора (IDC_EXPLORER).

Чтобы добавить все эти методы мы рекомендуем вам воспользоваться средствами MFC ClassWizard. Для этого надо запустить MFC ClassWizard, в диалоговой панели MFC ClassWizard выбрать страницу Message Map. Затем из списка Class name выберите имя класса CLookDlg. К этому классу мы будем добавлять все наши методы.

Из списка Object IDs выбирайте идентификаторы кнопок, списка и навигатора, сообщения от которых надо обрабатывать. При этом в списке Messages будет отображаться список сообщений, которые этот орган управления вырабатывает и методов которые вызываются при определенных условиях. Чтобы добавить новый метод, выберите из списка Messages идентификатор сообщения или название метода которые надо обработать или переопределить и нажмите кнопку Add Function. Вам будет предложено определить название метода. Вы можете оставить его по умолчанию или изменить по своему усмотрению.

Так, вы должны добавить к классу CLookDlg методы для обработки командных сообщений BN_CLICKED от кнопок Navigate (IDC_NAVIGATE), Stop (IDC_BUTTON_STOP), Refresh (IDC_BUTTON_REFRESH). Примите предложение MFC ClassWizard и назовите соответствующие методы именами OnButtonNavigate, OnButtonStop и OnButtonRefresh.

Для списка IDC_COMBO_ADDRESS вы должны назначить обработчик сообщения с кодом идентификации CBN_SELCHANGE. Это сообщение передается диалоговой панели, когда пользователь выбирает из списка новый элемент. Назовите этот метод OnSelchangeComboAddress.

Рис. 4.11. Орган управления Microsoft Web Browser и MFC ClassWizard


Теперь вам надо переназначить ряд методов, которые вызываются навигатором IDC_EXPLORER. Выберите из списка Object IDs идентификатор IDC_EXPLORER. В списке Messages появятся названия методов, которые вы можете переназначить (рис. 4.11). Обратите внимание, когда вы выбираете строки из списка Messages, то ниже списка Member function в поле Description отображается краткое описание данного метода.

Вы должны переопределить следующие методы - DownloadBegin, DownloadComplete, ProgressChange, BeforeNavigate, FrameBeforeNavigate, TitleChange, Quit, StatusTextChange и NavigateComplete. Для каждого из них MFC ClassWizard предложит собственное название. Согласитесь со всеми предложенными названиями. В следующей таблице мы привели соответствие названий событий в списке Messages и названий методов, которые их обрабатывают:



Строка Messages

Метод-обработчик

DownloadBegin

OnDownloadBeginExplorer

DownloadComplete

OnDownloadCompleteExplorer

ProgressChange

OnProgressChangeExplorer

TitleChange

OnTitleChangeExplorer

StatusTextChange

OnStatusTextChangeExplorer

NavigateComplete

OnNavigateCompleteExplorer

Шаблоны новых методов будут добавлены к файлу LookDlg.cpp, содержащему определения всех методов класса CLookDlg. Вы должны внести в них изменения в соответствии с листингом 4.8.

Определение класса CLookDlg содержится во включаемом файле LookDlg.h. Мы привели исходный текст файла LookDlg.h в листинге 4.7.

Листинг 4.7. Файл LookDlg.h

//////////////////////////////////////////////////////////////

// CLookDlg dialog

//{{AFX_INCLUDES()

#include "webbrowser.h"

//}}AFX_INCLUDES

class CLookDlg : public CDialog

{

// Construction

public:

   CLookDlg(CWnd* pParent = NULL);   // standard constructor

// Dialog Data

   //{{AFX_DATA(CLookDlg)

   enum { IDD = IDD_LOOK_DIALOG };

   CProgressCtrl   m_Progress;

   CWebBrowser   m_explorer;

   CString   m_address;

   CString   m_StatusText;

   CString   m_TitleBar;



   //}}AFX_DATA

   // ClassWizard generated virtual function overrides

   //{{AFX_VIRTUAL(CLookDlg)

   protected:

   virtual void DoDataExchange(CDataExchange* pDX); 

   //}}AFX_VIRTUAL

// Implementation

protected:

   HICON m_hIcon;

   // Generated message map functions

   //{{AFX_MSG(CLookDlg)

   virtual BOOL OnInitDialog();

   afx_msg void OnPaint();

   afx_msg HCURSOR OnQueryDragIcon();

   afx_msg void OnSelchangeComboAddress();

   afx_msg void OnButtonRefresh();

   afx_msg void OnButtonStop();

   afx_msg void OnButtonBack();

   afx_msg void OnButtonNext();

   afx_msg void OnDownloadBeginExplorer();

   afx_msg void OnDownloadCompleteExplorer();

   afx_msg void OnProgressChangeExplorer(long Progress,

                   long ProgressMax);

   afx_msg void OnTitleChangeExplorer(LPCTSTR Text);

   afx_msg void OnStatusTextChangeExplorer(LPCTSTR Text);

   afx_msg void OnNavigate();

   afx_msg void OnNavigateCompleteExplorer(LPCTSTR URL);

   DECLARE_EVENTSINK_MAP()

   //}}AFX_MSG

   DECLARE_MESSAGE_MAP()

};

Вы должны самостоятельно доработать все новые методы, только что добавленные MFC ClassWizard к классу CLookDlg, в соответствии с листингом 3.3.

Определение методов класса CLookDlg и таблица сообщений этого класса содержатся в файле LookDlg.cpp. Кроме того файл LookDlg.cpp содержит конструкцию, которая ранее не встречалась в наших приложениях.

Исходный текст файла LookDlg.cpp приведен нами в листинге 4.8.

Листинг 4.8. Файл LookDlg.cpp

#include "stdafx.h"

#include "Look.h"

#include "LookDlg.h"

#ifdef _DEBUG

   #define new DEBUG_NEW

   #undef THIS_FILE

   static char THIS_FILE[] = __FILE__;

#endif

//////////////////////////////////////////////////////////////

// Конструктор класса CLookDlg

CLookDlg::CLookDlg(CWnd* pParent /*=NULL*/)

   : CDialog(CLookDlg::IDD, pParent)

{

   //{{AFX_DATA_INIT(CLookDlg)

   m_address = _T("");

   m_StatusText = _T("");



   m_TitleBar = _T("");

   //}}AFX_DATA_INIT

   m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

//////////////////////////////////////////////////////////////

// Метод DoDataExchange класса CLookDlg.

// Организует взаимодействие между органами управления

// диалоговой панели и привязанными к ним элементами класса

void CLookDlg::DoDataExchange(CDataExchange* pDX)

{

   CDialog::DoDataExchange(pDX);

   //{{AFX_DATA_MAP(CLookDlg)

   DDX_Control(pDX, IDC_PROGRESS, m_Progress);

   DDX_Control(pDX, IDC_EXPLORER, m_explorer);

   DDX_CBString(pDX, IDC_COMBO_ADDRESS, m_address);

   DDX_Text(pDX, IDC_STATUS_TEXT, m_StatusText);

   DDX_Text(pDX, IDC_TITLE_BAR, m_TitleBar);

   //}}AFX_DATA_MAP

}

//////////////////////////////////////////////////////////////

// Таблица сообщений класса CLookDlg

BEGIN_MESSAGE_MAP(CLookDlg, CDialog)

   //{{AFX_MSG_MAP(CLookDlg)

   ON_WM_PAINT()

   ON_WM_QUERYDRAGICON()

   ON_CBN_SELCHANGE(IDC_COMBO_ADDRESS,

      OnSelchangeComboAddress)

   ON_BN_CLICKED(IDC_BUTTON_REFRESH, OnButtonRefresh)

   ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)

   ON_BN_CLICKED(IDC_BUTTON_BACK, OnButtonBack)

   ON_BN_CLICKED(IDC_BUTTON_NEXT, OnButtonNext)

   ON_BN_CLICKED(IDC_NAVIGATE, OnNavigate)

   //}}AFX_MSG_MAP

END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////

// Метод OnInitDialog класса CLookDlg

BOOL CLookDlg::OnInitDialog()

{

   CDialog::OnInitDialog();

   SetIcon(m_hIcon, TRUE);       

   SetIcon(m_hIcon, FALSE);     

  

   return TRUE;

}

//////////////////////////////////////////////////////////////

// Метод OnPaint класса CLookDlg

void CLookDlg::OnPaint()

{

   if (IsIconic())

   {

      CPaintDC dc(this); // device context for painting

      SendMessage(WM_ICONERASEBKGND,

         (WPARAM) dc.GetSafeHdc(), 0);

      int cxIcon = GetSystemMetrics(SM_CXICON);

      int cyIcon = GetSystemMetrics(SM_CYICON);



      CRect rect;

      GetClientRect(&rect);

      int x = (rect.Width() - cxIcon + 1) / 2;

      int y = (rect.Height() - cyIcon + 1) / 2;

      dc.DrawIcon(x, y, m_hIcon);

   }

   else

   {

      CDialog::OnPaint();

   }

}

//////////////////////////////////////////////////////////////

// Метод OnQueryDragIcon класса CLookDlg

HCURSOR CLookDlg::OnQueryDragIcon()

{

   return (HCURSOR) m_hIcon;

}

//////////////////////////////////////////////////////////////

// Метод OnSelchangeComboAddress класса CLookDlg.

// Вызывается при выборе нового адреса из списка

void CLookDlg::OnSelchangeComboAddress()

{

   // Определяем адрес, выбранный из списка

   UpdateData(TRUE);

   // Переходим к просмотру соответствующего ресурса

   m_explorer.Navigate(

      m_address,   // Адрес URL для просмотра

      NULL,        // Дополнительные флаги

      NULL,        // Имя (frame name) ресурса

      NULL,        // Данные для запроса POST

      NULL         // Заголовок запроса HTTP

   );

}

//////////////////////////////////////////////////////////////

// Метод OnButtonRefresh класса CLookDlg. Обновить

// текущую страницу WWW, которая отображается навигатором

void CLookDlg::OnButtonRefresh()

{

   m_explorer.Refresh();

}

//////////////////////////////////////////////////////////////

// Метод OnButtonStop класса CLookDlg.

// Прервать загрузку страницы WWW

void CLookDlg::OnButtonStop()

{

   m_explorer.Stop();  

}

//////////////////////////////////////////////////////////////

// Метод OnButtonBack класса CLookDlg.

// Вернуться к просмотру предыдущей страницы

void CLookDlg::OnButtonBack()

{

   m_explorer.GoBack();     

}

//////////////////////////////////////////////////////////////

// Метод OnButtonStop класса CLookDlg.

// Передти к просмотру следующей страницы

void CLookDlg::OnButtonNext()

{

   m_explorer.GoForward();     

}

//////////////////////////////////////////////////////////////



// Таблица сообщений класса CLookDlg.

//

BEGIN_EVENTSINK_MAP(CLookDlg, CDialog)

    //{{AFX_EVENTSINK_MAP(CLookDlg)

   ON_EVENT(CLookDlg, IDC_EXPLORER, 106 /* DownloadBegin */,

      OnDownloadBeginExplorer, VTS_NONE)

   ON_EVENT(CLookDlg,IDC_EXPLORER, 104 /* DownloadComplete */,

      OnDownloadCompleteExplorer, VTS_NONE)

   ON_EVENT(CLookDlg, IDC_EXPLORER, 108 /* ProgressChange */,

      OnProgressChangeExplorer, VTS_I4 VTS_I4)

   ON_EVENT(CLookDlg, IDC_EXPLORER, 100 /* BeforeNavigate */,

      OnBeforeNavigateExplorer, VTS_BSTR VTS_I4 VTS_BSTR

      VTS_PVARIANT VTS_BSTR VTS_PBOOL)

   ON_EVENT(CLookDlg,IDC_EXPLORER,200 /*FrameBeforeNavigate*/,

      OnFrameBeforeNavigateExplorer, VTS_BSTR VTS_I4 VTS_BSTR

      VTS_PVARIANT VTS_BSTR VTS_PBOOL)

   ON_EVENT(CLookDlg, IDC_EXPLORER, 113 /* TitleChange */,

      OnTitleChangeExplorer, VTS_BSTR)

   ON_EVENT(CLookDlg, IDC_EXPLORER, 103 /* Quit */,

      OnQuitExplorer, VTS_PBOOL)

   ON_EVENT(CLookDlg,IDC_EXPLORER, 102 /* StatusTextChange */,

      OnStatusTextChangeExplorer, VTS_BSTR)

   ON_EVENT(CLookDlg, IDC_EXPLORER, 101 /*NavigateComplete */,

      OnNavigateCompleteExplorer, VTS_BSTR)

   //}}AFX_EVENTSINK_MAP

END_EVENTSINK_MAP()

//////////////////////////////////////////////////////////////

// Метод OnDownloadBeginExplorer класса CLookDlg.

// Начало загрузки файла

void CLookDlg::OnDownloadBeginExplorer()

{

   // Инициализируем линейный индикатор

   m_Progress.SetRange(0, 100);

   m_Progress.SetStep(0);

   m_Progress.SetPos(0);

}

//////////////////////////////////////////////////////////////

// Метод OnDownloadCompleteExplorer класса CLookDlg.

// Загрузка завершена, сбрасываем линейный индикатор

void CLookDlg::OnDownloadCompleteExplorer()

{

   // TODO: Add your control notification handler code here

   m_Progress.SetPos(0);

}

//////////////////////////////////////////////////////////////

// Метод OnProgressChangeExplorer класса CLookDlg.

// Идет загрузка, обновляем положение линейного индикатора



void CLookDlg::OnProgressChangeExplorer(long Progress, long ProgressMax)

{

   // На всякий случай проверяем параметры метода

   if(Progress <= 0 | ProgressMax <= 0)

      return;

   // Изменяем положение линейного индикатора

   m_Progress.SetPos( (int) (Progress * 100) / ProgressMax);

}

//////////////////////////////////////////////////////////////

// Метод OnTitleChangeExplorer класса CLookDlg.

// Получен текст для заголовка окна навигатора

void CLookDlg::OnTitleChangeExplorer(LPCTSTR Text)

{

   // Отображаем заголовок в поле редактирования IDC_TITLE_BAR

   SetDlgItemText(IDC_TITLE_BAR, Text);

}

//////////////////////////////////////////////////////////////

// Метод OnTitleChangeExplorer класса CLookDlg.

// Получен текст для панели состояния окна навигатора

void CLookDlg::OnStatusTextChangeExplorer(LPCTSTR Text)

{

   // Отображаем текст в поле редактирования IDC_STATUS_TEXT

   SetDlgItemText(IDC_STATUS_TEXT, Text);

}

//////////////////////////////////////////////////////////////

// Метод OnNavigate класса CLookDlg.

// Передти к просмотру заданного адреса URL

void CLookDlg::OnNavigate()

{

   // Определяем адрес URL, выбранный пользователем

   UpdateData(TRUE);

   // Переходим к просмотру ресурса по заданному адресу

   m_explorer.Navigate(

      m_address,   // Адрес URL

      NULL,  

      NULL,  

      NULL,  

      NULL  

   );

}

//////////////////////////////////////////////////////////////

// Метод OnNavigateCompleteExplorer класса CLookDlg.

// Загрузка всех ресурсов страницы завершена

void CLookDlg::OnNavigateCompleteExplorer(LPCTSTR URL)

{

   // Обновляем адрес URL ресурса, показанного навигатором

   m_address =  URL;

   UpdateData(FALSE);

}


Содержание раздела