Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 72

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 66 67 68 69 70 71 < 72 > 73 74 75 76 77 78 .. 173 >> Следующая

fiasic colors:
Custom colors:
rrrrrrrr
гггггггг
Define Custom Colors >>
OK ] Cancel

Рис. 19.16. Общее диалоговое окно Color, отображенное программой MiniDraw
Определение классов для фигур
Откройте файл Mini Draw Doc. h заголовков для класса документа и удалите текущее определение класса CLine. Затем добавьте следующие определения.
// иерархия классов фигур:
class CFigure: public CObject {
protected:
COLORREF m_Color;
DWOAD m_Xl, m Yl, m X2, m Y2;
CFlgure () {} DECLARE_SERIAL (CFigure)
public:
virtual void Draw (CDC *PDG) (} CRect GetDimRect ();
virtual void Serialize (CArchiveS ar);
>;
class CLine : public CFigure {
protected:
DWORD m_Thickness,-CLine () (}
DECLARE_SERIAL (CLine) public:
CLine (int XI, int Yl, int X2, int Y2, COLORREF Color,
int Thickness); virtual void Draw (CDC *PDC); virtual void Serialize (CArchiveS ar);
>;
class CRectangle : public CFigure {
protected:
DWORD m_Thickness; CRectangle () () DECLARE_SERIAL (CRectangle)
public:
CRectangle (int XI, int Yl, int X2, int Y2, COLORREF Color,
int Thickness); virtual void Draw (CDC *PDC); virtual void Serialize (CArchiveS ar);
>;
class CRectFill : public Cfigure {
protected:
CRectFill () {) DECLARE_SERIAL (CRectFill)
public:
CRectFill (int XI, int Yl, int X2, int Y2, COLORREF Color); virtual void Draw (CDC *PDC);
);
class CRectRound : public CFigure {
protected:
DWORD m_Thickness;
CRectRound () {} DECLARE_SER1AL (CRectRound)
public:
CRectRound (int XI, int Yl, int X2, int Y2, COLORREF Color,
int Thickness); virtual void Draw (CDC *PDC); virtual void Serialize (CArchiveS ar);
};
class CRectRoundFill : public CFigure {
protected:
CRectRoundFill () {} DECLARE_SERIAL (CRectRoundFill)
public:
CRectRoundFill (int XI, int Yl, int X2, int Y2,
COLORREF Color); virtual void Draw (CDC *PDC);
) ;
class CCircle : public CFigure
{
protected:
DWORD m_Thickness;
CCircle () (} DECLARE_SER1AL (CCircle)
public:
CCircle (int XI, int Yl, int X2, int Y2, COLORREF Color,
int Thickness); virtual void Draw (CDC *PDC); virtual void Serialize (CArchiveS ar);
};
class CCircleFill : public Cfigure {
protected:
CCircleFill () {} DECLARE_SERIAL (CCircleFill)
public:
CCircleFill (int XI, int Yl, int X2, int Y2,
COLORREF Color); virtual void Draw (CDC *PDC);
Обратите внимание: в иерархии определенных классов есть единый базовый класс сПдиге, порожденный от соЪзесх, и класс, порожденный от Сг"1диге, для каждой фигуры, которую можно нарисовать (рис. 19.17). Класс СПдиге содержит переменные и функции, используемые для всех типов фигур, а порожденный класс фигуры — переменные и функции, используемые для фигуры конкретного типа.
Рис. 19.17. Иерархия классов для рисования и хранения фигур в программе MiniDraw
В частности, класс CFigure содержит переменную m_Color для хранения цвета, поскольку все типы фигур имеют цвет. Аналогично, класс CFigure содержит координаты (m_Xl, m_Yl, m_X2, m_Y2), потому что положение и размер всех типов фигур задается с использованием четырех координат. Напротив, только линии и незамкнутые фигуры имеют толщину линии (закрашенные фигуры ее не имеют). Следовательно, переменная m_ Thickness для хранения толщины содержится только в классах для незамкнутых фигур и линий. Каждый порожденный класс имеет собственный конструктор для инициализации переменных.
Класс CFigure также предоставляет функцию, вычисляющую размеры прямоугольника, ограничивающего фигуру (GetDimRect). Этот класс содержит виртуальную функцию Serialize для чтения с диска и записи на диск переменных класса CFigure. Классы, которые не имеют переменной m_Thickness, могут полагаться на функцию CFigure::Serialize. Однако каждый класс, имеющий эту переменную, должен иметь собственную функцию Serialize для чтения и записи значения m_Thickness. Каждая из функций Serialize явно вызывает функцию CFigure::Serialize для чтения и записи переменных, определенных в классе CFigure.
Класс CFigure содержит виртуальную функцию Draw.
virtual void Draw (CDC *PDC) {}
Определение этой функции позволяет программе использовать единственный указатель класса CFigure для вызова функции Draw применительно к фигуре любого типа. Класс фигуры каждого типа содержит переопределенную функцию Draw, выполняющую рисование с помощью подпрограммы, соответствующей определенному типу фигуры. Как видно, такое применение полиморфизма намного упрощает код в классе представления, управляющий рисованием фигур. Объяснение порождения классов, наследования, виртуальных функций и полиморфизма см. в гл. 5.
Совет
Заметим, что можно (но не обязательно) определить функцию CFigure: :Draw как чисто виртуальную функцию, сделав класс CFigure абстрактным базовым классом. Однако, поскольку чисто виртуальные функции не рассматриваются в части II этой книги, Draw просто сделана как обыкновенная виртуальная функция.
Откройте файл MiniDrawDoc.cpp и удалите код реализации класса CLine. IMPLEMENT_SERIAL (CLine, CObject, 1) //удалите эту строку
Предыдущая << 1 .. 66 67 68 69 70 71 < 72 > 73 74 75 76 77 78 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100