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


Класс CFtpViewDlg


Все изменения, которые мы будем вносить в наш проект затронут, в основном, только класса CFtpViewDlg. Это и понятно - именно к диалоговой панели IDD_FTPVIEW_DIALOG, которая управляется данным классом, мы добавили новые органы управления для взаимодействия с сервером FTP.

Приложения, которые используют для доступа к ресурсам сети Internet классы MFC WinInet, должны иметь как минимум один объект класса CInternetSession. Этот объект представляет собой “сеанс” связи с Internet.

В окне Project Workspace щелкните правой клавишей мыши по имени класса CFtpViewDlg. Откроется контекстное меню, из которого следует выбрать строку Add Variable. На экране появится диалоговая панель Add Member Variable (рис. 2.8).

Рис. 2.8. Диалоговая панель Add Member Variable

В поле Variable Type введите имя класса CInternetSession, а в поле Variable Declaration имя нового элемента класса CFtpViewDlg - m_InternetSession. Переключатель Access переведите в положение Protect. Нажмите кнопку OK. В класс CFtpViewDlg будет добавлен новый элемент - объект класса CInternetSession. Так как мы выбрали тип доступа Protect, то этот элемент будет расположен в секции protected и будет доступен только методам данного класса.

Повторите описанную процедуру и добавьте к классу CFtpViewDlg еще три элемента - строку sCurentDirectory класса CString, указатель m_ImageList на класс CImageList и указатель m_FtpConnection на класс CFtpConnection.

С помощью MFC ClassWizard привяжите переменные к органам управления диалоговой панели IDD_FTPVIEW_DIALOG. Для этого откройте MFC ClassWizard, перейдите на страницу Member Variables. В поле Class name выберите имя класса CFtpViewDlg. Затем последовательно выбирайте идентификаторы органов управления из списка Control IDs, нажимайте кнопку Add Variable и в открывающейся панели Add Member Variable вводите имя, категорию и тип переменной.

Добавляя переменные, пользуйтесь рисунком 2.9. На нем видно, какие переменные привязаны к органам управления диалоговой панели. Только кнопка OK не имеет собственной переменной, так как она нам не понадобится.




Рис. 2.9. Диалоговая панель MFC ClassWizard

Перейдите в диалоговой панели MFC ClassWizard на страницу Message Maps и добавьте несколько методов-обработчиков сообщений от органов управления диалоговой панели IDD_FTPVIEW_DIALOG. Для кнопки Connect, имеющей идентификатор IDC_CONNECT, и кнопки On Top с идентификатором IDC_ON_TOP добавьте обработчики командного сообщения BN_CLICKED - методы OnConnect и OnOnTop. Они будут вызываться при нажатии на эти кнопки. Для списка IDC_FTP_LIST добавьте обработчик сообщения NM_DBLCLK - метод OnDblclkFtpList. Он будет вызываться при двойном щелчке левой кнопкой мыши внутри списка.



Теперь остается совсем немного. Надо добавить метод DirectoryView и деструктор к классу CFtpViewDlg. MFC ClassWizard в этом вам не помощник. Откройте окно Project Workspase, если оно закрыто, и щелкните правой клавишей мыши по названию класса CFtpViewDlg. Откроется контекстное меню, из которого надо выбрать строку Add Function. На экране появится диалоговая панель Add Member Function (рис. 2.10).



Рис. 2.10. Диалоговая панель Add Member Function

Чтобы добавить метод DirectoryView, введите в поле Function Declaration его название, а в поле Function Type - тип значения, возвращаемого этим методом - BOOL. Повторите описанную операцию еще один раз и добавьте к классу CFtpViewDlg деструктор ~CFtpViewDlg. Для этого введите в поле Function Declaration строку ~CFtpViewDlg, а поле Function Type оставьте пустым.

MFC ClassWizard создает только шаблоны методов. Рабочий программный код вы должны добавить в них самостоятельно.  Ниже мы привели исходные тексты файлов FtpViewDlg.h и FtpViewDlg.cpp, в соответствии с которыми вам надо доработать свой проект.

Класс CFtpViewDlg определен в файле FtpViewDlg.h. Мы привели исходный текст этого файла в листинге 2.6. Для этого файла вам надо добавить директивы define, определяющие четыре константы - COL_NUM, MIN_LEN_BUF, DIRECTORY и FILE. Эти константы будут использоваться методами класса FtpViewDlg.

Листинг 2.6. Файл FtpViewDlg.h



//============================================================

// Определение класса FtpViewDlg и некоторых констант

//============================================================

// Определение констант

#define COL_NUM      4    // Количество колонок таблицы

#define MIN_LEN_BUF  30   // Минимальная длина буфера

#define DIRECTORY    0    // Пиктограмма каталога

#define FILE         1    // Пиктограмма файла

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

// Класс CFtpViewDlg

class CFtpViewDlg : public CDialog

{

// Construction

public:

   ~CFtpViewDlg();

   CFtpViewDlg(CWnd* pParent = NULL);

// Dialog Data

   //{{AFX_DATA(CFtpViewDlg)

   enum { IDD = IDD_FTPVIEW_DIALOG };

   CEdit       m_Status;     // Поле Directory

   CButton     m_Ok;         // Кнопка OK

   CButton     m_OnTop;      // Кнопка On top

   CButton     m_Connect;    // Кнопка Connect

   CListCtrl   m_FtpList;    // Таблица с содержимым каталога

   CString     m_FtpAddress; // Поле адреса сервера FTP

   //}}AFX_DATA

   //{{AFX_VIRTUAL(CFtpViewDlg)

   protected:

   // Обмен данными - DDX/DDV

   virtual void DoDataExchange(CDataExchange* pDX);  

   //}}AFX_VIRTUAL

// Implementation

protected:

   CString sCurentDirectory;            // Текущий каталог

   CImageList* m_ImageList;             // Список изображений

   CFtpConnection* m_FtpConnection;     // Сервер FTP

   CInternetSession* m_InternetSession; // Сеанс связи

   HICON m_hIcon;                       // Пиктограмма

                                        // приложения

protected:

   // Метод, просматривающий содержимое каталога

   BOOL DirectoryView();            

   // Методы обрабатывающие сообщения

   //{{AFX_MSG(CFtpViewDlg)

   virtual BOOL OnInitDialog();

   afx_msg void OnPaint();

   afx_msg HCURSOR OnQueryDragIcon();

   afx_msg void OnOnTop();

   afx_msg void OnDblclkFtpList(NMHDR* pNMHDR,

      LRESULT* pResult);



   afx_msg void OnConnect();

   //}}AFX_MSG

   DECLARE_MESSAGE_MAP()

};

¨     В листинге файла FtpViewDlg.h, в блоке AFX_MSG, описание метода OnDblclkFtpList разбито на две строки. Это сделано исключительно из-за ограничений, налагаемых типографией. Вы должны поместить данное описание на одной строке, в противном случае MFC ClassWizard будет выдавать сообщение об ошибке и вы не сможете воспользоваться его средствами для просмотра и изменения программного кода

Конструктор, деструктор, методы класса CFtpViewDlg, а также таблица сообщений определены в файле FtpViewDlg.cpp. Мы привели исходный текст файла FtpViewDlg.cpp в листинге 2.7. В соответствии с текстом этого файла вы должны доработать методы OnInitDialog, OnConnect, DirectoryView, OnDblclkFtpList, OnOnTop.

Листинг 2.7. Файл FtpViewDlg.cpp

#include "stdafx.h"

#include "FtpView.h"

#include "FtpViewDlg.h"

#ifdef _DEBUG

   #define new DEBUG_NEW

   #undef THIS_FILE

   static char THIS_FILE[] = __FILE__;

#endif

//============================================================

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

//============================================================

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

   : CDialog(CFtpViewDlg::IDD, pParent)

{

   //{{AFX_DATA_INIT(CFtpViewDlg)

   m_FtpAddress = _T("");

   //}}AFX_DATA_INIT

   // При использовании метода LoadIcon нет необходимости

   // вызывать DestroyIcon

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

}

//============================================================

// Деструктор класса CFtpViewDlg

//============================================================

CFtpViewDlg::~CFtpViewDlg()

{

   // Если соединение с сервером установлено, закрываем его

   if (m_FtpConnection != NULL)

   {

      m_FtpConnection -> Close();

      delete m_FtpConnection;

   }

   // Завершаем сеанс связи с Internet

   if (m_InternetSession != NULL)



   {

      m_InternetSession -> Close();

      delete m_InternetSession;

   }

   // Удаляем список изображений

   delete m_ImageList;

}

//============================================================

// Метод DoDataExchange класса CFtpViewDlg

// Выполняет привязку органов управления диалоговой панели

// IDD_FTPVIEW_DIALOG и соответствующих элементов класса

// CFtpViewDlg

//============================================================

void CFtpViewDlg::DoDataExchange(CDataExchange* pDX)

{

   CDialog::DoDataExchange(pDX);

   //{{AFX_DATA_MAP(CFtpViewDlg)

   DDX_Control(pDX, IDC_STATUS, m_Status);

   DDX_Control(pDX, IDOK, m_Ok);

   DDX_Control(pDX, IDC_ON_TOP, m_OnTop);

   DDX_Control(pDX, IDC_CONNECT, m_Connect);

   DDX_Control(pDX, IDC_FTP_LIST, m_FtpList);

   DDX_Text(pDX, IDC_FTP_ADDRESS, m_FtpAddress);

   //}}AFX_DATA_MAP

}

//============================================================

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

//============================================================

BEGIN_MESSAGE_MAP(CFtpViewDlg, CDialog)

   //{{AFX_MSG_MAP(CFtpViewDlg)

   ON_WM_PAINT()

   ON_WM_QUERYDRAGICON()

   // Сообщение от кнопки Connect

   ON_BN_CLICKED(IDC_CONNECT, OnConnect)

   // Сообщение от кнопки On Top

   ON_BN_CLICKED(IDC_ON_TOP, OnOnTop)

   // Сообщение с кодом извещения NM_DBLCLK от списка

   ON_NOTIFY(NM_DBLCLK, IDC_FTP_LIST, OnDblclkFtpList)

   //}}AFX_MSG_MAP

END_MESSAGE_MAP()

//============================================================

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

// Выполняет инициализацию диалоговой панели, а также сеанса

// связи с Internet (создает объект класса CInternetSession)

//============================================================

BOOL CFtpViewDlg::OnInitDialog()

{

   // Вызываем метод OnInitDialog базового класса CDialog

   CDialog::OnInitDialog();

   // Устанавливаем пиктограммы, которые будут отображаться

   // в случае минимизации диалоговой панели



   SetIcon(m_hIcon,TRUE);  // Пиктограмма стандартного размера

   SetIcon(m_hIcon,FALSE); // Пиктограмма маленького размера

  

   //=========================================================

   // Выполняем инициализацию списка IDC_FTP_LIST

   //=========================================================

   // Структура, для описания характеристик колонок списка

   LV_COLUMN   lv_column;

   // Переменная для определения размера списка

   CRect       rectList;

   // Названия для колонок списка

   TCHAR szColHeader[COL_NUM][10] = {

         _T("Name"),

         _T("Length"),

         _T("Date"),

         _T("Time"),

   };

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

   // IDC_FTP_LIST в диалоговой панели

   m_FtpList.GetWindowRect(&rectList);

   // Указываем поля структуры lv_column, которые будут

   // использоваться

   lv_column.mask = LVCF_FMT |   // Используется поле fmt

                LVCF_SUBITEM |   // Используется поле iSubItem

                   LVCF_TEXT |   // Используется поле pszText

                  LVCF_WIDTH;    // Используется поле cx

   // Задаем выравнивание по левому краю

   lv_column.fmt = LVCFMT_LEFT;

   // Ширина колонки

   lv_column.cx = (rectList.Width() / COL_NUM) - 1;

   // Определяем характеристики колонок списка

   for (int i = 0; i < COL_NUM; i++) 

   {

      // Номер колонки

      lv_column.iSubItem = i;

      // Заголовок колонки

      lv_column.pszText = szColHeader[i];

      // Добавляем колонку с заданными свойствами к списку

      m_FtpList.InsertColumn(i, &lv_column);

   }

   // Создаем список из двух изображений размера 16 х 16

   m_ImageList = new CImageList();

   m_ImageList -> Create(16, 16, TRUE, 2, 2);

   // Добавляем в список две пиктограммы -

   // IDI_DIRECTORY (изображение каталога) и

   // IDI_FILE(изображение файла )

   m_ImageList -> Add(AfxGetApp()->LoadIcon(IDI_DIRECTORY));



   m_ImageList -> Add(AfxGetApp()->LoadIcon(IDI_FILE));

   // Выбираем список изображений m_ImageList для

   // использования в списке IDC_FTP_LIST

   m_FtpList.SetImageList(m_ImageList, LVSIL_SMALL);

   //=========================================================

   // Выбираем адрес сервера FTP, который используется по

   // умолчанию

   //=========================================================

   m_FtpAddress = "dials.ccas.ru"; // Сервер FTP “ДиалогНаука”

   // Отображаем адрес на экране

   UpdateData(FALSE);

   //=========================================================

   // Инициализируем сеанс связи с Internet

   //=========================================================

   // Создаем сеанс связи с Internet, указываем в качестве

   // имени программы-клиента название приложения FtpView

   m_InternetSession = new CInternetSession("FtpView");

   // В случае ошибки отображаем сообщение и завершаем

   // приложение

   if(!m_InternetSession)

   {

      AfxMessageBox("New Session Error", MB_OK);

      OnOK();

   }

   // Инициализируем указатель m_FtpConnection

   m_FtpConnection = NULL;

   return TRUE;

}

//============================================================

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

// Отображает на экране пиктограмму в случае минимизации

// главной диалоговой панели приложения

//============================================================

void CFtpViewDlg::OnPaint()

{

   if (IsIconic())

   {

      CPaintDC dc(this);

      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 класса CFtpViewDlg

// Сообщает идентификатор пиктограммы, отображаемой в случае

// минимизации приложения

//============================================================

HCURSOR CFtpViewDlg::OnQueryDragIcon()

{

   return (HCURSOR) m_hIcon;

}

//============================================================

// Метод OnOnTop класса CFtpViewDlg

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

//============================================================

void CFtpViewDlg::OnOnTop()

{

   // Блокируем список IDC_FTP_LIST

   m_FtpList.EnableWindow(FALSE);

   // Изменяем строку текущего каталога sCurentDirectory так,

   // чтобы она показывала на каталог верхнего уровня.

   // Ищем последнее вхождение символа / в строку с именем

   // каталога

   int iNum = sCurentDirectory.ReverseFind('/');

   if(iNum == -1)

   {

      // Если символ / не обнаружен, значит мы находимся в

      // корневом каталоге

      AfxMessageBox("No top directory");

   }

   else

   {

      // Удаляем из строки с именем текущего каталога названия

      // последнего каталога

      sCurentDirectory = sCurentDirectory.Left(iNum);

      // Меняем форму курсора (курсор “ожидание”)

      CWaitCursor wait;  

  

      // Отображаем содержимое каталога верхнего уровня

      DirectoryView();  

   }

   // Снимаем блокировку списка IDC_FTP_LIST

   m_FtpList.EnableWindow(TRUE);

   // Отображаем на диалоговой панели новый путь каталога

   m_Status.SetWindowText(sCurentDirectory);

   return;

}

//============================================================

// Метод OnDblclkFtpList класса CFtpViewDlg

// Переходит в выбранный каталог

//============================================================

void CFtpViewDlg::OnDblclkFtpList(NMHDR* pNMHDR,

   LRESULT* pResult)

{



   int       iTotalNumber; // Количество элементов списка

   CString   sSelItem;     // Название каталога

   CString   sLength_Dir;  // Длина файла или строка Dir

   // Блокируем список IDC_FTP_LIST

   m_FtpList.EnableWindow(FALSE);

   // Определяем количество элементов в списке IDC_FTP_LIST

   iTotalNumber = m_FtpList.GetItemCount();

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

   for(int i = 0; i < iTotalNumber; i++)

   {

      // Атрибут LVIS_SELECTED установлен

      // у выбранного элемента списка

      if(LVIS_SELECTED == m_FtpList.GetItemState( i,

         LVIS_SELECTED ))

      {

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

         // (имя файла или каталога)

         sSelItem = m_FtpList.GetItemText( i, 0 );

         // Считываем данные из колонки Length

         sLength_Dir = m_FtpList.GetItemText( i, 1 );

         if(sLength_Dir == "Dir") // Выбран каталог

            // Переходим в выбранный каталог

            sCurentDirectory  =

               sCurentDirectory + "/" + sSelItem;

         else                     // Выбран файл

            // Отображаем имя файла

            AfxMessageBox("You select file " + sSelItem);

        

         break;

      }

   }

  

   // Меняем форму курсора (курсор “ожидание”)

   CWaitCursor wait;   

   // Отображаем содержимое выбранного каталога

   DirectoryView();

   // Отображаем в диалоговой панели новый путь каталога

   m_Status.SetWindowText(sCurentDirectory);

   // Снимаем блокировку списка IDC_FTP_LIST

   m_FtpList.EnableWindow(TRUE);

   *pResult = 0;

}

//============================================================

// Метод OnConnect класса CFtpViewDlg

// Соединяется с указанным сервером FTP

//============================================================

void CFtpViewDlg::OnConnect()

{

   // Текущий каталог на сервере FTP

   CString  sCurrentFtpDirectory = "";



   // Блокируем кнопки Connect, OK и On Top

   m_Connect.EnableWindow(FALSE);

   m_Ok.EnableWindow(FALSE);

   m_OnTop.EnableWindow(FALSE);

   // Если вы ранее уже соединились с сервером FTP, разрываем

   // эту связь и удаляем объект m_FtpConnection

   if (m_FtpConnection != NULL)

   {

      m_FtpConnection -> Close();

     

      delete m_FtpConnection;  

      m_FtpConnection = NULL;

   }

   // Считываем из диалоговой панели адрес сервера FTP, так

   // как пользователь уже мог его изменить

   UpdateData(TRUE);

   // Пытаемся соединиться с сервером FTP

   try

   {

      // Меняем форму курсора (курсор “ожидание”)

      CWaitCursor wait;  

      // Соединяемся с сервером FTP. Эта операция

      // может вызвать исключение CInternetException

      m_FtpConnection =

         m_InternetSession->GetFtpConnection(m_FtpAddress);

   }

   catch (CInternetException* pEx)

   {

      // Обрабатываем исключение CInternetException

      TCHAR szErr[1024];  // временный буфер для сообщения

      // Выводим сообщение об ошибке

      if (pEx->GetErrorMessage(szErr, 1024))

         AfxMessageBox(szErr);

      else

         AfxMessageBox("GetFtpConnection Error");

      // Удаляем исключение

      pEx->Delete();

      // Обнуляем указатель m_FtpConnection

      m_FtpConnection = NULL;

   }

   // Если соединение не установлено сообщяем об этом

   if( m_FtpConnection == NULL )

      m_Status.SetWindowText("Connect not established");

   // Если соединение установлено, определяем текущий каталог

   // и отображаем его содержимое на экране

   else

   {

      // Определяем текущий каталог сервера FTP

      BOOL fResult=

         m_FtpConnection ->

            GetCurrentDirectory(sCurrentFtpDirectory);

      if(fResult)

         sCurentDirectory = sCurrentFtpDirectory;

      else

         AfxMessageBox("GetCurrentDirectory Error");



      // Меняем форму курсора (курсор “ожидание”)

      CWaitCursor wait;  

      // Отображаем содержимое выбранного каталога

      DirectoryView();

      // Отображаем на диалоговой панели новый путь каталога

      m_Status.SetWindowText(sCurentDirectory);

   }

   // Снимаем блокировку кнопок Connect, OK и On Top

   m_Connect.EnableWindow(TRUE);

   m_Ok.EnableWindow(TRUE);

   m_OnTop.EnableWindow(TRUE);

}

//============================================================

// Метод DirectoryView класса CFtpViewDlg

// Просматривает содержимое каталога и отображает его в

// таблице m_FtpList

//============================================================

BOOL CFtpViewDlg::DirectoryView()

{

   // Переменная, сигнализирующая о получении последнего

   // элемента каталога

   BOOL     fResult;

   // Временная переменная, определяющая тип объекта -

   // файл или каталог

   BOOL     fDirectory;

   // Структура для добавления нового элемента к списку

   LV_ITEM   lv_item;  

   // Удалить все элементы из списка IDC_FTP_LIST

   m_FtpList.DeleteAllItems();

   // Создаем объект класса CFtpFileFind, указывая

   // объект, представляющий уже установленное соединение

   // с сервером FTP

   CFtpFileFind m_FtpFileFind(m_FtpConnection);

   // Получаем имена всех объектов текущего каталога

   if(fResult =

      m_FtpFileFind.FindFile(_T(sCurentDirectory + "/*")))

   {

      for(int n = 0;fResult; n++)

      {

         // Получаем очередной объект из каталога

         fResult = m_FtpFileFind.FindNextFile();

         // Определяем что это - каталог или файл

         fDirectory = m_FtpFileFind.IsDirectory();

         //============= Определяем имя объекта ==============

         // Временные строка для имени каталога или файла

         CString   fileName;

         // Определяем имя объекта

         fileName = m_FtpFileFind.GetFileName();



         // Заполняем структуру lv_item, сведениями об

         // очередном объекте каталога сервера FTP. Указываем,

         // что в список добавляется текст и изображение

         lv_item.mask = LVIF_TEXT | LVIF_IMAGE;

         // Указываем номер строки в списке

         lv_item.iItem = n;

         // Заполняем первую колонку

         lv_item.iSubItem = 0;

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

         // зависимости от типа объекта

         lv_item.iImage = (fDirectory) ? DIRECTORY : FILE;

         // Указываем имя каталога или файла

         lv_item.pszText = fileName.GetBuffer(MIN_LEN_BUF);

         // Добавляем новый элемент к списку IDC_FTP_LIST

         m_FtpList.InsertItem(&lv_item);

         //============= Определяем длину файла =============

         // Длинна файла

         DWORD dwLength = 0;

         // Временные строка для формирования текстового

         // представления длинны файла

         CString sLength;

         // Заполняем колонку Length для новой записи и

         // записываем в нее длинну файла или строку Dir, если

         // новый объект - каталог.

         // Добавляется только текст без пиктограммы

         lv_item.mask = LVIF_TEXT;

         // Указываем номер строки в списке

         lv_item.iItem = n;

         // Заполняем вторую колонку

         lv_item.iSubItem = 1;

         // Если очередной объект является каталогом, то

         // вместо в колонке Length записываем строку Dir

         if(fDirectory)

         {

            lv_item.pszText = "Dir";

         }

         // Если очередной объект является файлом, то

         // записываем его длину в колонку Length

         else

         {

            // Определяем длину файла

            dwLength = m_FtpFileFind.GetLength();

            // Формируем текстовое представление длины файла

            sLength.Format("%d", dwLength);

            lv_item.pszText = sLength.GetBuffer(MIN_LEN_BUF);



         }

       

         // Добавляем запись во второй колонке списка (колонка

         // Length)

         m_FtpList.SetItem(&lv_item);

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

         // Дата и время создания каталога или файла

         CTime mTime; 

         // Временные строки для формирования текстового

         // представления даты и времени

         CString sDate;

         CString sTime;

         // Определяем время изменения файла или каталога

         if(!m_FtpFileFind.GetLastWriteTime(mTime))

            break;

         // Добавляется только текст без пиктограммы

         lv_item.mask = LVIF_TEXT;

         // Указываем номер строки в списке

         lv_item.iItem = n;

         // Заполняем третью колонку

         lv_item.iSubItem = 2;

         // Выделяем из объекта mTime день, месяц и год

         sDate = mTime.Format("%d.%m.%y");

         // Записываем сформированную дату в структуру lv_item

         lv_item.pszText = sDate.GetBuffer(MIN_LEN_BUF);

         // Добавляем запись во второй колонке списка (колонка

         // Date)

         m_FtpList.SetItem(&lv_item);

         // Заполняем четвертую колонку, записываем в нее

         // время последнего изменения файла (каталога)

         lv_item.iSubItem = 3;

         // Выделяем из объекта mTime часы, минуты и секунды

         sTime = mTime.Format("%H:%M:%S");

         // Записываем сформированную строку, содержащую время

         lv_item.pszText = sTime.GetBuffer(MIN_LEN_BUF);

         // Добавляем запись во второй колонке списка (колонка

         // Time)

         m_FtpList.SetItem(&lv_item);

      }

      // Заканчиваем поиск объектов в каталоге, закрываем

      // объект m_FtpFileFind

      m_FtpFileFind.Close();

   }

   // Если каталог не содержит других объектов - каталогов и

   // файлов, выводин соответствующее сообщение

   else

      AfxMessageBox("File's not found or error");



   return TRUE;

}

Кроме уже описанных нами файлов в проект FtpView входят еще два исходных файла, содержащих программный код. Это файлы stdafx.cpp и включаемый файл stdafx.h. Исходный текст файла stdafx.cpp содержится в листинге 2.8. Как видите, он состоит из единственной директивы #include, включающей файл stdafx.h.

Листинг 2.8. Файл stdafx.cpp

// Включаем файл stdafx.h, определенный в нашем приложении

#include “stdafx.h“

Файл stdafx.h задействует часто используемые включаемые системные файлы - afxwin.h, afxext.h, afxcmn.h и afxinet.h.  Эти файлы не изменяются. Поэтому Microsoft Visual C++ компилирует их только один раз. За счет этого значительно сокращается время, затрачиваемое на повторное построение проекта.

Последний включаемый файл afxinet.h содержит описание классов, структур и констант библиотеки MFC, относящихся к программному интерфейсу WinInet (листинг 2.9). MFC AppWizard не включает этот файл по умолчанию. Вы должны добавить соответствующую директиву #include самостоятельно.

#include "stdafx.h"

Листинг 2.9. Файл stdafx.h

// Исключает редко используемые определения при обработке

// файлов заголовков

#define VC_EXTRALEAN

 

// Основные компоненты библиотеки MFC

#include <afxwin.h>

// Расширения MFC

#include <afxext.h>

#ifndef _AFX_NO_AFXCMN_SUPPORT

   // Используется для органов управления Windows

   #include <afxcmn.h>

#endif // _AFX_NO_AFXCMN_SUPPORT

// Включаемый файл для библиотеки WinInet.

// MFC AppWizard не включает этот файл, вы должны сделать это

// самостоятельно

#include "afxinet.h"


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