- •2. Основные понятия объектно-ориентированного программирования 7
- •3. Управляемый и неуправляемый код и данные 17
- •3.3 Управляемый и неуправляемый код и данные 17
- •5. Классы 38
- •6. Наследование классов и интерфейсы 49
- •7. Программа ввода/вывода информации 62
- •8. Управляемые данные и их использование 76
- •Предисловие
- •2.1 Объекты
- •2.Основные понятия объектно-ориентированного программирования
- •2.2Классы
- •Пример 2.2.2. Создание и использование объектов.
- •2.3Объекты, классы и uml
- •2.4Основные свойства объектно-ориентированного программирования
- •Пример 2.4.1. Класс cColBall, наследуемый класс cBall.
- •Пример 2.4.2. Использование функций объектов.
- •2.5Библиотеки классов
- •3.Управляемый и неуправляемый код и данные
- •3.1Виртуальная машина языка Java
- •3.2Общеязыковая среда выполнения clr платформы .Net
- •3.3Управляемый и неуправляемый код и данные
- •3.4Сборщик мусора
- •3.5Ссылочные типы и типы-значения
- •3.6Метаданные
- •3.7Библиотеки, пакеты и пространства имён
- •4.1О типах данных
- •4.2Консольный ввод и вывод
- •Void main (void)
- •Import java.Io.*;
- •Int X; // Целочисленная переменная X
- •4.3Объявление переменных
- •4.4Операторы динамического распределения памяти new и delete
- •Int X; // Выделить память в стеке
- •Пример 4.4.2. Использование оператора new в языках Java и c#.
- •Import java.Io.*;
- •Int X; // Выделить память в стеке для переменной
- •Int X; // Выделить память в стеке для переменной
- •4.5 Массивы
- •Пример 4.5.2. Описание одномерных массивов на изыках Java и c#.
- •Пример 4.5.4. Создание массивов объектов на языке Java.
- •Import java.Io.*;
- •4.6Объявления структур и перечислений
- •4.7Ссылки
- •Пример 4.7.1. Использование ссылочной переменной.
- •Void main()
- •4.8Перегрузка функций
- •Пример 4.8.1. Перегруженные функции swap (int &, int &) и swap (bool &,bool &).
- •Void swap (int &a, int &b) // Целочисленные параметры
- •Void swap (bool &a, bool &b) // Булевские параметры
- •4.9Объявление функций и передача аргументов по умолчанию
- •Void swap (int &, int &);
- •Void swap (char 8t, char &);
- •Пример 4.9.1. Задание значений параметров функции по умолчанию.
- •Void main ( )
- •5.Классы
- •5.1Определение класса
- •Пример 5.1.1. Описание класса и создание его объектов.
- •Int X; // Закрытая переменная X
- •Void Show ( ) // Открытая функция
- •Int X; // Закрытая (по умолчанию) переменная X
- •Void Show ( ) // Открытая функция
- •Пример 5.2.1. Описание функций вне класса.
- •Int X; //Закрытая переменная х
- •Void Set(int m,char n); // 0бъявление функции Set
- •Void Show (); // Объявление функции Show()
- •5.3Некоторые замечания о классах
- •Пример 5.3.1. Области видимости.
- •Int GetK() {return k;} // Функция GetK() видна в файле, классе а и в
- •Int n; // Переменная n закрыта и видна только в классе а
- •Int GetM () {return n;} // Функция GetM() открыта и видна
- •5.4Объекты в объектах
- •Пример 5.4.1. Объект содержит объект другого класса.
- •Void Show ()
- •Void Show ()
- •5.5Специальный вид функций класса - конструкторы и деструкторы
- •Пример 5.5.1. Перегруженные конструкторы.
- •Int GetX() {return X;} // Возвратить значение закрытой переменной
- •Void ShowX () // Вывести значение переменной
- •5.6Статические функции класса
- •Пример 5.6.1. Статические функции.
- •Void f() {Console::WriteLine("f()");} // Обычная функция
- •Int main() // Главная статическая функция Main()
- •6.Наследование классов и интерфейсы
- •6.1Об интерфейсах
- •Пример 6.2.1. Программа, использующая порождение public.
- •Void Show ()
- •Void Show()
- •Int main() // Главная статическая функция
- •6.4Использование конструктора базового класса
- •Java и j#
- •Java и j#
- •Пример 6.4.1. Выполнение конструкторов.
- •Int X; // Закрытая переменная X
- •Int Get() {return X;} // Получить значение X
- •Int main() // Главная статическая функция main()
- •6.5Сокрытые переменные, функции и их использование
- •Пример 6.5.1. Сокрытые переменные и функции.
- •6.6Интерфейсы
- •Interface class имя-интерф [ : public имя-базов-интерф
- •Interface имя-интерф [ : имя-базов-интерф [, имя-базов-интерф ] ... ]
- •Interface имя-интерф [ extends имя-базов-интерф
- •Interface Ipe // Интерфейс, объявляющий свойство p и функцию Hallo
- •Int p {set; get;} //Объявить свойство
- •Void Hallo(); // Объявить функцию
- •6.6.1Определение интерфейса
- •6.6.2Базовые интерфейсы
- •6.7 Упаковка и распаковка типов данных
- •Int main() // Главная статическая функция main()
- •7.Программа ввода/вывода информации
- •7.1Постановка задачи
- •Диаграмма вариантов использования
- •7.2 Диаграмма классов
- •7.3Диаграмма последовательности
- •7.4Диаграмма видов деятельности
- •Пример 7.5.1. Реализация класса cComputer.
- •Пример 7.5.2. Реализация класса cShop.
- •Пример 7.5.3. Реализация класса cData.
- •Void main()
- •Пример 7.5.4. Реализация Inf-приложения.
- •Void main()
- •7.6Реализация Inf-приложения иа языке c# Пример 7.6.1. Реализация Inf-приложения иа языке c#.
- •Int cost; // Стоимость компьютера
- •Int year; // Год изготовления
- •Inf.Enter();
- •Inf.Enter();
- •Inf.Show();
- •8.Управляемые данные и их использование
- •Void set(тип value)
- •Пример 8.1.2. Свойства в Java.
- •Import java.Io.*;
- •Пример 8.2.1. Создание и использование делегата.
- •Void main() // Главная функция программы
- •Пример 8.2.2. Использование делегата как параметра функции.
- •Void r(void) {Console::WriteLine ("r");}
- •Void main () // Главная функция программы
- •Void имя-функции ( void );
- •Пример 8.3.1. Событие и делегат.
- •Void main ()
- •Vold имя-функции-активизации()
- •Пример 8.3.2. Использование события.
- •Void GenerateEv() // Функция-генератор события
- •Void main()
- •Void GenerateEv (String л str) // Функция- генератор события
- •Void main ( )
- •06BeKTfirst клaccaUseEvпoлyчилcoбытиe one
- •Interface iEv
- •IE,HandlerEv (); // Выполнить обработчик
- •Void GenerateEv ( ) // Сгенерировать событие
- •Void main (void)
- •V{ oid FireConnectEvent (object sender, SourceEventArgs e)
- •Void FireConnectEvent (object sender, EventArgs args)
- •8.4. Уведомления и события в Java
- •8.4.1. Уведомления в Java
- •Void notifyObservers () - уведомить всех обозревателей данного наблюдаемого
- •Void notifyObservers (Object obj) - уведомить всех обозревателей данного на-
- •Void update(Observable observable. Object obj) - эта функция данного объекта
- •Import java.Util.*;
- •II Два наблюдателя и один наблюдаемый объект
- •Importjava.Util.*;
- •Importjava.Utll,*;
- •Importjava.Util.*;
- •Int num; // Номер уведомляющего объекта
- •8.4.2. События в Java
- •Import java.Utii.*;
- •Void DatePerformed (DataDate dd); // Обработчик
- •Int n; // Номер объекта-приёмника
- •Int num; // Номер объекта приёмника
- •Import cJHappenListerner.*;
- •Importjava.Uti).*;
- •Void performedHappen (HappenData hD);
- •Import cJHappenListerner.*; | | Импортировать библиотеку
- •9. Потоки и синхронизация их выполнения
- •9.1. Процессы
- •9.3. Потоки в Java
- •Int num; // Номер потокового объекта
- •2. Поскольку объявленному в классе cThread потоковому объекту thr типа
- •9.4. Потоковый объект, выдающий событие
- •If (lllfe) // Если потоковый объект не функционирует,
- •ImportJava,util.*;
- •If (!life) // Если потоковый объект не функционирует,
- •9.5. Поток получил событие из объекта
- •If (!life)
- •If (received)
- •Importjava.Utll.*;
- •If (lllfe)
- •If (received)
- •9.6. Синхронизация выполнения потоков
- •9.6.1. Операторы lock и synchronized
- •Int num; // Номер объекта
- •9.6.2. Связи между потоками
- •9.6.2.1. Связи меяеду потоками в Java
- •If(waiting)
- •9.6.2.2. Связи между потоками в c#
- •If (I moving)
- •9.6.2.1.1 Наязыке Java, отличаясьтолько применением функций монитора
- •10. Библиотека .Net Framework и библиотеки
- •10.1. Приложение
- •10.2. Классы, объекты и элементы приложения
- •Visual Studio .Net как библиотеки .Net Framework, так и пакетов языка Java
- •10.3. Простейшие приложения
- •Import java.Awt.*;
- •Void main ( )
- •10.3.1.1. Оказывается, класс Form сам наследует множество других классов,
- •10.4. Сообщения Windows, события и делегаты
- •X0.4.1. Обработка событий мыши на языке c#
- •Void OurMouseDown (object sender, MouseEventArgs args);
- •Vold maln ()
- •10.4.3. Обработка событий мыши на языке Java с использо-
- •10.4.4. Связь события с несколькими объектами на языке c#
- •10.5. Ещё раз о событиях и уведомлении в языке Java
- •10.5.1. Обработка событий элементов интерфейса пользовате-
- •ItemListener, KeyListener, MouseListener, MouseMotionListener, TextListener
- •10.5.2. Обработка событий мыши на языке Java, используя
- •Importjava.Awt.Event.*;
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •10.5.3. Обработка событий мыши на языке Java, используя классы адап-
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •10.5.4. Обработка событий мыши на языке Java, используя внутренние
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •10.5.5. Обработка события закрытия окна
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •10.6. Графика
- •10.6.1. Графические объекты
- •15, 15, 60, 70); // Нарисовать эллипс
- •Vold maln ()
- •10.7. Событие Paint и его обработчик
- •Int len; // Текущая длина массива points
- •Void OurMouseDown (object sender, MouseEventArgs arg)
- •Invalidate ( ); // Перерисовать
- •Int len; // Текущая длина массива points
- •Import java.Awt.Event.*;
- •10.8. Управляющие элементы
- •1 «Button j 1
- •Import java.Awt,event.*;
- •Int n; // Индекс цвета
- •10.8.4,10.8.5 И 10.8.6, а также программа, поэтапно разрабатываемая в разде-
- •Invalidate ();
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Util.*;
- •10.9. Дочерние окна
- •Int n; // Индекс массива colors
- •IiTipOrt jav'a.Avvt. •)
- •Import java.Awt.Event.*;
- •Int n; // Индекс цвета
- •Virtual void OnPaint (PaintEventArgs л arg) override // Перерисовать область
- •10.10.3, В котором вызываются две функции.
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •It); // Подписать обработчик
- •Void main ( )
- •11.1. Программа с точки зрения пользователя
- •11.2. Объектное представление программы
- •11.3. События, потоки и их синхронизация
- •11.4. Поэтапная разработка программы
- •11.4.1. Первый этап. Разработка класса Warehouse
- •4Cxrt()
- •Int partLoad; // Выгружаемая или загружаемая порция
- •If(full) return false; // Полный грузовик не загружать
- •Invalidate ();
- •Importjava.Awt.*;
- •Importjava,utll.*;
- •Void notifyObs (WarehouseEventArgs arg)
- •Int partLoad; // Получаемая или помещаемая порция груза
- •If (full) return false;
- •If(full) return false; // Полный грузовик не загружать
- •Void Change ( )
- •Invalidate ();
- •Importjava.Awt.*;
- •Importjava.Util.*;
- •Import cjWarehouse.*
- •11.4.2. Второй этап. Разработка классов ContrlRegion и Lorry
- •11.4.2.1, А сам класс представлен в примере 11.4.2.1. Класс ContrlRegion язы-
- •Importjava.Awt.Event.*;
- •Void Work ( ) // Выполнить работу
- •Int number;
- •Int number;
- •Int timePeriod;
- •Int y; // Координата y пути грузовика
- •Invalidate ();
- •11.4.3. Третий этап. Разработка приложения csLorryAndWarehouse
- •4IorryAndWa rho uses()
- •4Main()
- •Int y; // Координата y пути грузовика
- •Invalidate ( );
- •If(lorry.GetFull())
- •If(lorry.GetLeftRight()) g.SetColor(Color.Red);
- •Int numLorry; // Номер грузовика
- •Void But_Run (Object Ло, EventArgs ле)
- •Void main ( )
- •11.4.4. Четвертый этап. Удаление ресурса
- •Int number;
- •If(!lorry.Running)lorry.Run ( );
- •12. Зачетные задачи
- •12.1. Задание 1
- •Importjava.Awt.*;
- •Import Java.Awt.Event.*;
- •Importjava.Util.*;
- •12.2. Задание 2
- •Importjava.Awt.*;
- •Importjava.Awt.Event,*;
- •Importjava.Util.*;
- •Invalidate ( );
- •12.3. Задание 3
- •Importjava.Awt.*;
- •Import java.Awt.Event.*;
- •Importjava.Util.*;
- •If(bool) Start ();
- •If(lrunnlng)
- •Void BallFunc ()
- •Void ThrFunc ( )
- •Vold OnButAdd (object obj, EventArgs arg)
- •Void HandlerEv ( )
- •Invalidate ( );
- •12.4. Задание 4
- •If(reg.R.Contains(p) && !inRect)
- •If(!reg.R,Contains(p) && lnRect)
- •Void OnButAdd (object obj, EventArgs arg)
- •Void HandlerEv ( )
- •Invalidate ();
- •Importjava.Awt.*;
- •Importjava.Awt.Event.*;
- •Importjava.Utll.*;
- •Int w, int h, Color c, Wind wind)
- •If(reg.R.Contains(p) && !lnRect)
- •If(!reg.R.Contains(p) && inRect)
- •If(d.GetDel())
- •13. Ещё о важном в объектно-ориентирован-
- •13.1. Виртуальные функции
- •13.1.1. Преобразование типов
- •Void f ( ) {cout « "ca:: f" « endl;}
- •Void main ( )
- •Void f ()
- •Void main ( )
- •Vold f ( )
- •Vold Do (ca* pCa)
- •Void main ( )
- •13.1.2, Виртуальные функции
- •Virtual void f ( ) {Console::WriteLine ("a:: f");}
- •Void f ( ) {Console::WriteLine ("b:: f");}
- •Void f ( ) {Console::WrlteLlne ("c:: f");}
- •Vold f ( ) {Console::WrlteLlne("b:: f");}
- •Vold Do (a* pA)
- •Void main ()
- •13.1.3. Виртуальные функции, используемые в книге
- •13.2. Абстрактные классы и функции
- •13.2.1. Абстрактные функции
- •13.2.2. Абстрактные классы
- •Void f ( ) {Console::WriteLine ("b:: f");}
- •Vold f ( ) {Console::WriteLine ("d:: f");}
- •Vold main ( )
- •13.2. Нововведения в языке c#
- •13.2.1.Делегаты и события
- •Iorry.Run ( );
- •13.3.2. Статические классы
- •Int partLoad; // Выгружаемая или загружаемая порция
- •If(!full)
- •Invalidate ( );
- •Int number;
- •Int y; // Координата y пути грузовика
- •Iorry.Stop ();
- •If(llorry.Running)lorry.Run ( );
- •Invalidate ( );
- •1) Создать новый проект:
- •Value 28, 30
- •Value type 34
- •Visual Studio .Net и Edipse.
- •420111, Казань, Дзержинского, 3. Тел.: 292-24-76.
Import java.Awt.*;
Import java.Awt.Event.*;
// Класс прикладного окна
class MainClass extends Frame
{
public MalnClass ()
{
this.setSlze (400, 200);
thls.setTltle ("Hello");
// Примененить внутренний анонимный класс
thls.addMouseLlstener (new MouseAdapter ( )
{
public void mousePressed (MouseEvent mE)
{
System.out.println ("Mouse: x= " + mE.getX ( )
+ " y= " + mE.getY ( ));
>
»;
thls.addWindowLlstener (new OurWindowAdapter ());
}
public static vold maln ( ) || Главная функция
{
MainClass mC= new MainClass ();
mC.show ();
>
>
// Класс адаптера окна
class OurWindowAdapter extends WindowAdapter
<
public void windowClosing {WindowEvent wE)
{
System.exit (О);
>
>
///////////////
IIJava и J# Вариант 10
Importjava.awt.*;
Import java.awt.event.*;
II Класс прикладного окна
classMainClassextendsFrame
{
public MainClass ()
{
this.setSlze (400, 200);
this.setTltle ("Hello");
// Примененить внутренний анонимный класс
th!s.addMouseLlstener (new MouseAdapter ( )
{
public void mousePressed (MouseEvent mE)
{
System.out.println ("Mouse: x= " + mE.getX ( ) тl II у.,—- Чт , iМiiЕi. .ЯgА»«Уi Гу \и Л,.
>
»;
// Примененить внутренний анонимный класс
thls.addWindowListener (new WindowAdapter ( )
{
public void windowClosing (WindowEvent wE)
{
System.exlt(0);
>
»;
public static void maln ( ) // Главная функция
{
MainClass mC= new MainClass ();
mC.show ( );
>
/>*
Result:
При каждом нажатии на клавишу мыши в прикладном окне выдаётся на консоль
строка вида
Mouse: x= 10 y= 55, где x, у - координаты носика мыши
При нажатии кнопки закрытия окна прикладное окно исчезает
* /
Для закрьгтия окна в варианте 9 программы примера 10.5.5.1 создан свой
класс OurWindowAdapter адаптера, наследующий класс WindowAdapter
адаптера окна. Объект класса OurWindowAdapter передан функции addWindowListener()
для подписки на событие окна. Вариант 10 программы приме-
няет анонимные класс WindowAdapter адаптера окна и класс MouseAdapter
адаптера мыши.
10.6. Графика
Рассмотрим классы .NET Framework, обеспечивающие рисование и вывод
рисунков в область клиента окон (форм) и соответствующие им классы биб-
лиотеки языка Java. Множество этих классов представляют графический ин-
терфейс устройства GDI+ + (Graphic Device Interface).
10.6.1. Графические объекты
Графический интерфейс использует для рисования такие объекты как
цвет (color), перья {pens), кисти (brushes), изображения (images) и шрифты
(fonts).
Прежде чем рисовать фигуру или линию, надо создать графический
объект класса Graphics. Графический объект связан с конкретным окном
(формой, фреймом) и его функции выполняют рисование в этом окне, вклю-
чая при необходимости в качестве аргументов перья, кисти, шрифты и т.д.
Таким образом, вспомогательные объекты типа Color, Pen, SolidBrush, Image
и Font обеспечивают функционирование объектов класса Graphics, зани-
мающих центральное место в создании графического интерфейса. Объекты
вспомогательных типов хранят необходимую для рисования информацию, а
графический объект её использует.
При рисовании необходимо связать графический объект с контекстом
устройства, на которое отображается информация. Обычно им является дис-
плей или принтер. Может выводиться не только текстовая информация, но и
геометрические фигуры, залитые цветом, и изображения. Объект типа Graphics,
например, на языках C# и C++/CLI связывается с устройством с помо-
щью функции CreateGraphics(), а в языке Java(J#) - getGraphics().
Точка
C# и C++/CLI. Наиболее часто употребляемый тип - это тип Point, исполь-
зуемый для создания объекта - одиночной точки, обычно в области клиента
окна.
Тип Point содержит открытые свойства - X и Y , определяющие координаты
точки, конструктор, функцию Offset(dx, dy) смещения точки с приращениями
dx и dy, операторы, позволяющие сравнивать объекты-точки и присваивать
им значения.
Тип Point имеет конструктор следующего формата:
Point (int X, intY);
Нижеследующие примеры понятны без пояснений:
C++/CLI.
Point *pPl= new Point (1, 2); // Создать в неуправляемой куче
// точку с pPl->X= 1 и pPl->Y= 2
pPl -> Offset (1, 1); // Сдвинуть точку pPl
// pPl->X= 2 и pPl->Y= 3
Point p2 (3, 4); // Создать точку p2 в стеке
// с p2.X= 3 и p2.Y= 4
p2.0ffset (5, 5); // Сдвинуть точку p2
// p2.X= 8 и p2.Y= 9
if (p2 != *pPl) p2= *pPl; // Неравные точки стали одинаковыми
Point ^pP3= gcnew Polnt (10, 20); // Создать точку в управляемой куче
// с pP3->X= 10 и pP3->Y= 20
If (p2 != *pP3) p2= *pP3; // Неравные точки стали одинаковыми
C#.
Point pl= new Pcint (1, 2); // Создать точку р1 с pl.X= 1 и pl.Y= 2
pl.Offset (1, 10); // pl.X= 2 и pl.Y= 12
Point p2= new Point ( ); // Создать точку p2 с p2.X= 0 и p2.Y= 0
p2.X= 30; p2.Y=50;
Java. Точки являются объектами класса Point. Конструктор класса Point име-
ет формат:
Point (int X, intY);
Класс Point включает свойства x и у.
Point p= new Point (10, 20 ); // Создать точку p2 с p2.X= 10 и p2.Y= 20
p.x= 30; p.y=50;
Прямоугольник
C# и C++/CLI. Также часто употребляется тип Rectangle, используе-
мый для создания объекта-прямоугольника с горизонтальными и верти-
кальными сторонами. Этот прямоугольник можно применять для рисования
его пером (pen) или как область, подлежащую заливке некоторым цветом с
помощью кисти (brush), или для указания области, занимаемой окном, и так
далее.
Тип Rectangle содержит одиннадцать свойств и много функций. Свой-
ство Location, включающее координаты левого верхнего угла (X и Y или Left
и Тор), определяет положение прямоугольника в окне или на экране, свойст-
ва Width и Height задают ширину и высоту прямоугольника, а свойства Right
и Bottom - координаты правой нижней точки прямоугольника
Из множества функций нам понадобятся следующие: конструктор Rectangle
, функция Offset() смещения, и функция Contains() выявления вхожде-
ния точки в прямоугольник. Они понятны из нижеследующих примеров:
C++/CLI.
Rectangle rl; // Создать прямоугольник в стеке
rl.X= 1; rl,Y=2; rl.Width= 10; rl.Height= 20;
Rectangle *r2= new Rectangle (21, 22, 210, 220); // Создать прямоугольник
/ / в управляемой куче
r2->Offset (100, 100);
Point ^p= gcnew Point (3, 4); // Создать точку p2 c p2.X= 3 и p2.Y= 4
if (rl.Contalns (*p)) rl=*r2; // Если p2 в rl, то прямоугольник г1
// становится равным прямоугольнику r2
// rl.X= 121 rl.Y= 122 rl.Width= 210 rl.Height= 220;
C#.
Rectangle r l= new Rectangle (1, 2, 4, 5); // rl.X= 1, rl.Y= 2,
// rl.Left= 1, rl.Top= 2, rl.Right= 5, rl.Bottom= 7, rl, Width = 4, rl. Height = 5
rl.Offset (2, 1); // Теперь rl.X= 3, rl.Y= 3,
// rl.Left= 3, rl.Top= 3, rl.Right= 6, rl.Bottom= 8, rl. Width = 4, rl. Height = 5
Point p2= new Point (3, 4): // Создать точку p2 c p2.X= 3 и p2.Y= 4
if (rl.Contains (p2)) { что-либо делаем>; // Если p2 в rl, то что-либо делаем
Java. Прямоугольники представляются объектами класса Rectangle. Конст-
руктор класса Rectangle имеет различные форматы :
Rectangle ();
Rectangle (lnt x, lnt у, int w, int h );
Rectangle (Point p, Dimension d );
где x, у - координаты верхнего левого угла прямоугольника;
w, h - ширина и высота прямоугольника;
d - ссылка на объект класса Dimension, задающий размеры прямоугольни-
ка.
Среди свойств класса Rectangle выделим свойства x и у, определяющие коор-
динаты левого верхнего угла прямоугольника, свойства width и height, опре-
деляющие ширину и высоту прямоугольника.
Цвет
C# и C++/CLI. Типом Color представляется цвет. Среди конструкторов
структуры Color имеется конструктор
Color (int tr, int r, int g, int b);
который создаёт объект с указанной прозрачностью tr (transparency of а color)
и основными составляющими цвета: красный r (red), зелёный g (green) и си-
ний b (blue). Значения прозрачности и составляющих цвета лежат в границах
от 0 до 255. Большее их значение означает более плотный цвет и меньшую
прозрачность.
Структура Color имеет огромный набор предопределённых цветов, пред-
ставленных свойствами, например: Brown, Chocolate, Gold, Gray и т.д. Име-
ется статическая функция FromArgb(), позволяющая получить цвет по значе-
ниям трёх составляющих цвета и его интенсивности:
static Color FromArgb (int tr, int r, int g, int b);
Она создаёт структуру Color из компонентов ARGB цвета: прозрачности tr и
основных цветов - красного r, зелёного g и синего b.
А другая перегруженная статическая функция
static Color FromArgb (lnt r, int g, int b);
создаёт структуру Color из компонентов ARGB цвета: прозрачности tr= 255
(непрозрачный цвет) и основных цветов - красного r, зелёного g и синего b.
Примеры:
C++/CLI.
Color со! (System::Drawing::Co!or::Go!d); // Золотой цвет
Color coll (Color::Gold); // Золотой цвет
Color col2 (Color::FromArgb (0, 0, 255)); // Синий непрозрачный цвет
Color col3;
col3= Color::FromArgb (0, 0, 255); // Синий цвет
Color col4;
col4= Color::Gold; // Золотой цвет
Color col5 (Color::FromArgb (100, 0, 0, 250)); // Синий полупрозрачный цвет
C#.
Color col3;
col3= Color.FromArgb (0, 0, 255); // Синий цвет
Color col4;
col4= Color.Gold; // Золотой цвет
Color col5= Color.Silver; // Серебренный цвет
Java. Цвет является объектом класса Color. Конструктор класса Color имеет
формат:
Color (int r, int g, int b);
Color c= new Color (0, 200, 0);
Color cl=c;
Color c2= new Color (0, 0, 255);
c2= cl;
cl= Color.yellow;
// с - синий цвет
// с1 - тоже синий цвет
// c2 - зелёный цвет
// c2 - теперь синий цвет
// c l - теперь жёлтый цвет
Класс Pen
C# и C++/CLI. Управляемый класс Pen используется для создания объектов-
перьев (pens), определяющих стиль, толщину и цвет линий для рисования
линий и кривых.
Конструкторы класса Pen
Pen (Color color); // C++/CLI и C#
Pen (Color color, float width)); // C++/CLI и C#
Pen ( Brush ^brush, float width, )); // C++/CLI
Pen ( Brush brush, float width, )); // C#
создают перья с заданным цветом color, шириной width (по умолчанию ши-
рина равна 1). Цвет coIor может быть задействован из кисти brush - объекта
класса Brush (Brush - базовый класс для кистей).
Класс Pen имеет ряд свойств, например, Color для установки или получения
цвета пера и Width для установки и получения ширины пера.
Объекты класса Pen широко применяются в качестве аргументов функций
рисования класса Graphics, например, в функции DrawEliipse().
Создать и модифицировать перо можно следующим образом:
C++/CLI
Pen ^pPenl= gcnew Pen (Color::Black); // Создать чёрное перо с шириной 1
pPenl -> Color= Color::Green; // Перо стало зелёным
- П п „ 4 ^ Ш М И ч _ С. 11 iл r~ n n , n i . u A M п э п и л й С
J j r C I I X *^ *VIUl*l~ h/, lt " ^ ш..^.шыг1, f/MUNV.1 J
Pen ^pPen2= gcnew Pen (Color::Green, 5);// Создать зелёное перо с шириной 5
Pen ^pPen3= gcnew Pen (gcnew SolidBrush(Color::Green), 5); // Создать
// зелёное перо с шириной 5
Color color= Color::Red;
Pen ^pPen4= gcnew Pen (color, 5); // Создать красное перо с шириной 5
C#.
Pen penl= new Реп (Color.Black); // Создано чёрное перо с шириной 1
penl.Color= Color.Green; // Перо стало зелёным
penl.Width= 5; // и с шириной, равной 5
Pen pen2= new Pen (Color.Green, 5); // Создать зелёное перо с шириной 5
Класс имеет много свойств и функций.
Java. В языке Java перо не используется.
Класс SolidBrush
C++/CLI и C#. Управляемый класс SolidBrush, порождённый из базового
класса Brush, используется для создания объектов-кистей, применяемых при
закрашивании фона окон или внутри фигур.
Конструктор класса
SolidBrush (Color colorJ;
имеет единственный параметр color типа Color, определяющий цвет создан-
ной кисти.
Класс SolidBrush имеет свойство Color, позволяющее установить и получить
цвет кисти:
C++/CLI.
SolidBrush ^pBrush= gcnew SolidBrush (Color::Black); // Создать чёрную кйсть
pBrush -> Color= Color::Red; // и сделать красной
Pen ^pPen5= gcnew Pen (pBrush, 5); // Создать красное nepo с шириной 5
C#.
SolidBrush brush= new SolidBrush (Color.Black); // Создать чёрную кисть
brush.Color= Color.Red; // и сделать красной
Java. В языке Java кисть не используется.
Класс Font
Объектами класса Font представляются шрифты с указанными назва-
ниями, размерами и стилями.
Класс Font содержит перегруженные конструкторы и, в частности:
C++/CLI. Font (String ^name, float size);
Font (String ^name, float size, FontStyle style);
C#.
Font (string name, float slze);
Font (string name, float slze, FontStyle style);
Java.
Font (String name, int style, int slze);
где
name - название шрифта,
size - размер шрифта,
style - стиль шрифта ( Bold -жирный, Italic— курсив и др.)
Шрифт можно задать так:
C++/CLI.
Font ^pFont= gcnew Font ("Verdana", 15);
C#.
Font font— new Font ("Ariel", 20, FontStyle.Italic);
Java.
Font f l= new Font ("Courier", Font.BOLD, 50);
Замечание: Обратите внимание на отличия в списке аргументов конструкто-
ров языков C# (C++/CLI) и Java.
Класс Graphics
C++/CLI и C#. Объект класса Graphics является контекстом рисования,
связанным с конкретным контекстом устройства и чаще всего с окном (фор-
мой). Класс Graphics предоставляет множество функций для рисования в
этом окне строк (strings), прямоугольников (rectangles), эллипсов (ellipses) и
т.д. Например:
C++/CLI.
vold DrawString (String ^pS, Font ^pF, Brush ЛрВ, float x, float у);
void DrawRectangle (Pen ^pP, Rectangle r);
void FillE!lipse (Brush лрВ, Rectangle r);
C#.
void DrawString (string s, Font f, Brush b, float x, float y);
void DrawRectangle (Pen p, Rectangle r);
void FIIIEIItpse (Brush b, Rectangle r);
Можно создать графический объект класса Graphics непосредственно, ис-
пользуя функцию CreateGraphics().
Graphics granhics= CreateGrapMcs ( };
Но чаще всего используют параметр функции перерисовки OnPaint(). Это
параметр типа структуры PaintEventArgs, которая одним из своих элементов
содержит свойство Graphics.
C#.
Graphics gr= this.CreateGraphics ( ); // Непосредственное использование
gr.DrawStrlng ("Drawing", Font, new SolidBrush (Color.Blue), 10, 10);
C++/CLI.
protected:
virtual void OnPaint (PaintEventArgs ^arg) override // Использование через
// аргумент arg
{
Color col (Color::FromArgb (250, 0, 250, 250));
Drawing::Font ^pFont=gcnewDrawlng::Font("Verdana",20,
FontStyle: :Italic);
arg ->Graphics ->DrawStrlng ("Drawing", pFont, gcnew SolidBrush (col),
10, 30);
>
Java. Язык Java использует пакет AWT, который содержит множество гра-
фических классов и функций. Среди классов есть и класс Graphics, содер-
жащий, например, такие функции рисования как
void drawLine (int xl, lnt yl, lnt x2, lnt y2); // Рисовать линию
void drawOval (lnt x, lnty, int w, int h); // Рисовать овал (эллипс)
void drawRect (int x, int у, lnt w, int h); // Рисовать прямоугольник
void drawString (String str, lnt x, int у); // Рисовать строку
void fillOval (int x, lnty, lnt w, int h); // Залить овал (эллипс) цветом
vold fillRect (int x, int у, int w, int h); // Залить прямоугольник цветом
void setColor (Color color); // Установить цвет
void setFont (Font font); // Установить шрифт
На языке Java также можно создать графический объект с помощью функции
getGraphics() и затем воспользоваться функциями рисования, но рисование
обычно осуществляется в теле предопределённой функции paint(), аргумент
которой является ссылкой на объект графического класса Graphics.
Java.
public void paint (Graphics g) // Использование через аргумент arg
{
g.setColor(Color.magenta);
Font font— new Font ("Verdana", Font.rTALIC, 30);
g.setFont(font);
g.drawString ("Drawing", 10, 70);
>
Пример 10.6.1 иллюстрирует применение графики на языках C#,
C++/CLI и Java(J#). В программах на языках C# и C++/CLI использовано
пространство имён System.Drawing (System::Drawing), включающее графиче-
ские классы. Прикладное окно программы представлено на рис. 10.6.1. Про-
грамма на языке Java(J#) применяет naKeTjava.awt.
Пример 10.6.1. Использование графического объекта.
////////////////////
/ / C #
using System;
using System.Drawing;
using System,Windows.Forms;
class MainClass : Form
{
public MainClass ()
{
Text= "Drawing"; // Заголовок прикладного окна
Show ( ); // Показать окно
Graphics gr= this.CreateGraphlcs (); // Создать графический объект
gr.DrawString ("Drawing", Font, // Нарисовать строку
new SolidBrush (Color.Blue), 10, 50);
gr.DrawString ("Drawing", new Font ("Arial", 25), // Нарис-ть строку
new SolidBrush (Color.FromArgb (100, 255, 0, 0)), 5, 40);
String drawStr = "Drawing"; // Создать строку
Font drawFnt = new Font ("AriaF, 30);// Создать шрифт
SolidBrush drawBr = new SolidBrush (Color.Green);// и кисть
float x= 10.0F; // Координаты начала строки
float y= 40.0F;
gr.DrawString (drawStr, drawFnt, drawBr, x, у); // Нарис-ть строку
gr.DrawEllipse (new Pen(new SolidBrush (Color.DarkViolet), 2),
