Microsoft Visual C++ и MFC. Программирование для Win95 и WinNT

Создание нового класса


Из любой страницы ClassWizard можно добавить в приложение новый класс, созданный на основе базовых классов. В качестве базового класса можно использовать классы, наследованные от класса CCmdTarget или класса CRecordset. Если требуется создать класс, не наследуемый от базовых классов CCmdTarget или CRecordset, использовать средства ClassWizard нельзя. Такие классы надо создавать вручную, непосредственно в текстовом редакторе.

Объекты порожденные от класса CCmdTarget могут обрабатывать сообщения Windows и команды, поступающие от меню, кнопок, акселераторов. Класс CCmdTarget и другие наследованные от него классы имеют таблицу сообщений (Message map) - набор макрокоманд, позволяющий сопоставить сообщениям Windows и командам методы класса

Чтобы создать класс, нажмите кнопку Add Class из любой страницы главной диалоговой панели ClassWizard. Откроется временное меню, содержащее три строки: New, From a file, From an OLE TypeLib. Для создания нового класса выберите из этого меню строку New. Если вы уже имеете исходные тексты класса и их просто требуется подключить к проекту, выберите из меню строку From a file. Последняя строка меню From an OLE TypeLib используется для подключения классов из библиотеки OLE.

Когда вы создаете новый класс, на экране появляется диалоговая панель Create New Class. В поле Name введите имя создаваемого класса. Рекомендуется начинать названия классов с символа “C”. Для создаваемого класса организуются два файла реализации класса, имеющие расширения CPP и H. В них будут помещаться объявления класса, а также определения его методов и данных. Имя файлов реализации отображается в левой части группы File. По умолчанию файлы реализации имеют имена, соответствующие имени класса. Однако их можно изменить, воспользовавшись кнопкой Change из группы File.

Теперь выберите из списка Base Class имя базового класса. Список Base Class достаточно велик. В нем содержатся не только основополагающие классы типа CCmdTarget, CDialog, CDocument, CFrameWnd, CView, CWinThread, CWnd. Список базовых классов включает классы большинства органов управления, например CAnimateCtrl, CButton, CColorDialog, CComboBox, CDragListBox, CEdit, CEditView, CFileDialog, CFontDialog, CHeaderCtrl, CHotKeyCtrl, CListBox, CListCtrl, CListView, CProgressCtrl, CStatic и многие многие другие. Доступны также базовые классы, предназначенные для работы с базами данных: CDaoRecordSet, CDaoRecordView, CRecordset, CRecordView, классы обеспечивающие технологию OLE: COleDocument, COleLinkingDoc, COleServerDoc.


Так, например, вы можете создать новый класс CNewClass, наследованный от базового класса окна просмотра CEditView. Определение класса помещается во включаемый файл NewClass.h (листинг 4.7).

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

// Класс окна просмотра CNewClass

class CNewClass : public CEditView

{

protected:

      CNewClass();      



      DECLARE_DYNCREATE(CNewClass)

// Attributes

public:

// Operations

public:

// Overrides

      //{{AFX_VIRTUAL(CNewClass)

protected:

      virtual void OnDraw(CDC* pDC);

      //}}AFX_VIRTUAL

// Implementation

protected:

      virtual ~CNewClass();

#ifdef _DEBUG

      virtual void AssertValid() const;

      virtual void Dump(CDumpContext& dc) const;

#endif

// Методы, предназначенные для обработки сообщений

protected:

      //{{AFX_MSG(CNewClass)

      //}}AFX_MSG

      DECLARE_MESSAGE_MAP()

};

Определение методов класса размещается в другом файле, имеющем расширение CPP (листинг 4.8).

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

#include "stdafx.h"

#include "Single.h"

#include "NewClass.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// Реализация класса CNewClass

IMPLEMENT_DYNCREATE(CNewClass, CEditView)

CNewClass::CNewClass()

{

}

CNewClass::~CNewClass()

{

}

BEGIN_MESSAGE_MAP(CNewClass, CEditView)

      //{{AFX_MSG_MAP(CNewClass)

            

      //}}AFX_MSG_MAP

END_MESSAGE_MAP()

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

// Метод OnDraw класса CNewClass

void CNewClass::OnDraw(CDC* pDC)

{

      CDocument* pDoc = GetDocument();

      // TODO: здесь можно расположить код, выполняющий вывод в

      // окно

}

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

// Диагностические методы класса CNewClass

#ifdef _DEBUG

void CNewClass::AssertValid() const

{

      CEditView::AssertValid();

}

void CNewClass::Dump(CDumpContext& dc) const

{

      CEditView::Dump(dc);

}

#endif //_DEBUG

Полученная заготовка класса полностью работоспособна. Ее можно дополнить по своему усмотрению новыми методами и данными. Эту работу можно выполнить вручную, но гораздо лучше и проще воспользоваться услугами предоставляемыми ClassWizard. За счет использования ClassWizard процедура создания собственного класса значительно ускоряется и уменьшается вероятность совершить ошибку во время объявления методов.


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