- •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.Event.*;
10.8. Управляющие элементы
C# и C++/CLI. Управляющие элементы составляют основу при фор-
мировании пользовательского интерфейса приложения. Библиотека NET.
Framework и пакеты языка Java включают десятки классов, используемых
для создания объектов управления, а из них - элементов управления
(controls). Элементы управления, такие как нажимаемые или селективные
кнопки, панели списков, панели редактирования и другие, широко исполь-
зуются разработчиками оконных приложений. Они значительно облегчают
интерфейс между пользователем и приложением.
В библиотеке NET. Framework все классы управляющих элементов по-
рождаются из общего базового класса Control и поэтому позволяют однооб-
разное их использование. Имеется специальный класс ControlCollection,
обеспечивающий объединение управляющих элементов в одной коллекции.
Для связи управляющих элементов с конкретной коллекцией (т.е. объ-
ектом класса ControlCollection) используется свойство Controls управляющих
элементов, наследуемое из класса Control. Получив посредством свойства
Controls ссылку на коллекцию, можно воспользоваться его функциями
(функциями класса ControlCollection), чтобы конкретный управляющий эле-
мент добавить (Add) или удалить (Remove) из коллекции, или удалить все
элементы (Clear) из коллекции, или же выявить (Contains) наличие указанно-
го элемента в коллекции.
Из множества классов управляющих элементов библиотеки NET.
Framework мы рассмотрим классы Button и TextBox.
Из класса Button создаётся так называемая нажимаемая кнопка.
Из класса TextBox создаётся панель редактирования, которая представляет
собой простейший редактор с возможностью ввода и редактирования текста.
Java. В языке Java классы управляющих интерфейсных элементов по-
рождаются из класса Component, содержащего их общие свойства и функции.
Кнопка и панель редактирования создаются из классов Button и TextFicld.
Эти и другие управляющие элементы добавляются в контейнер окна посред-
ством функции add().
Рис.10.8 1 и 10.8.2 иллюстрируют наследование базовых классов клас-
сами Button, TextBox и TextField.
I +TgxtBqy | t>bTwffln;flaa&J ^
I +B"tton I fc| +ButtonBase 1 И •Control ;—Й+СдтндпвпД
1 *Oblect Й l+MarshalflvRefObiBct К]
Рис. 10.8.1. Наследование базовых классов классами TextBox и Button в C# и
C++/CLI
I +TextField~b—fcH+TextCnmnnnent I fcH+Conwonent I D>l +Qbiect 1
1 «Button j 1
Рис. 10.8.2. Наследование базовых классов классами TextFieId и Button в Java
Позднее будут рассмотрены ещё классы UserControl и Panel, используемые
для получения интересного интерфейсного элемента, представляющего в
прикладном окне полотно-окно с богатой функциональностью.
Класс Button
C# и C++/CL1. Объект класса Button представляет нажимаемую кноп-
ку. Объект создаётся конструктором:
Button ();
В классе Control библиотеки .NET Framework среди более 50 событий
объявлено событие Click:
C#.
public event EventHandler Click;
C++.NET.
public: event EventHandler^ Click;
На это событие мы будем подписывать обработчик, реагирующий на нажатие
кнопки.
При применении класса Button, кроме его собственных свойств, можно вос-
пользоваться наследуемыми свойствами класса Controi. Наследуемое свойст-
во Text, например, позволяет поместить текст в кнопку, а свойства Size и Location
- определить размеры кнопки и координаты её верхнего левого угла.
Обратите внимание, что делегатом события кнопки является делегат
EventHandler, определённый в библиотеке .NET Framework для различных
событий. Об этом делегате, рекомендованном фирмой Microsoft для упоря-
дочивания применения событий, упоминалось в разделе 8.5, а в примере 8.5.6
иллюстрировалось его применение.
Java. Добавление к кнопке предопределённого обработчика actionPerformedO
класса ActionListener осуществляет функция addActionListener() класса Button.
К кнопке можно применить множество свойств, наследуемых из класса
Component, например, setLocation() и getLocation() при размещении кнопки и
setSize() для установки размера.
Классы TextBox и TextField
C# и C++/CLI. Объектом класса TextBox представляется поле ввода
информации, являющееся простейшим редактором текста. Объект создаётся
конструктором:
TextBox ( );
При применении класса TextBox кроме его собственных свойств можно вос-
пользоваться наследуемыми свойствами Text для помещения и извлечения
текста, BackColor для установки и получения цвета фона, Multiline для указа-
ния многострочности, TextLength для получения длины текста и так далее. А
свойства Size и Location, как и в случае кнопки, позволяют определить раз-
меры панели редактирования и координаты её верхнего левого угла.
Java. Для размещения редактора класса TextField в области клиента окна
применяются свойства setLocation() и getLocation(), для установки размера -
setSize(). Имеется ещё много свойств, наследуемых из класса Component.
ПримерЮ.8.1. Программа с управляющими элементами на языке C#.
Приложение имеет прикладное окно с кнопкой и редактором текста. В окне
рисуется российский трехцветный флаг. Цвета флага - белый, синий и крас-
ный - применяются и при рисовании строки, введенной в редактор. Строка
рисуется при нажатии на клавишу мыши, начиная с носика курсора мыши.
Нажатие на кнопку меняет белый цвет строки циклически на синий, красный,
а затем на белый цвет..
Прикладное окно изображено нарис. 10.8.3.
////////////////////
nc#
using System;
using System.Drawing;
using System.Windows.Forms;
class CTextBox_Button : Form // Класс прикладного окна
<
TextBox ourTextBox; // Редактор
Button ourButton; // Кнопка
Point point; // Начальные координаты строки
Color [] colors; // Массив цветов флага
lnt n; // Индекс массива цветов colors
public CTextBox_Button() // Конструктор
{
Text= "Russian fiag"; // Установить заголовок прикладного окна
ourTextBox= new TextBox (); // Создать редактор
ourTextBox.Location= new Polnt (10, 120); // Установить позицию
ourTextBox.Size= new Size(150,20); //Установитьразмер
ourTextBox.Text= "Russia"; // Установить текст в редакторе
Controls.Add (ourTextBox); // Добавить редактор в форму
ourButton= new Button (); // Создать кнопку
ourButton.Location= new Point (170, 10); // Установить позицию
ourButton.Slze= new Size (40, 20); // Установить размер
ourButton.Text= "OK"; // Установить текст в кнопке
Controls.Add (ourButton); // Добавить кнопку к форме
// Подписать обработчик на событие Click кнопки
ourButton.Cllck += new EventHandler (OurButtonClick);
// Подписать обработчик на событие MouseDown мыши
MouseDown += new MouseEventHandler (OurMouseDown);
n= 0;
point= new Polnt (100, 100);
colors= new Color [3]; // Создать массив цветов
colors [0]= Color.FromArgb (255, 255, 255); // Белый цвет
colors [1]= Color.FromArgb (0, 0, 255); // Синий цвет
colors [2]= Color.FromArgb (255, 0, 0); // Красный цвет >
// Перерисовать область клиента окна
protected override void OnPalnt (PaintEventArgs arg)
{
base.OnPaint (arg);
Rectangle rect= new Rectangle (10, 10, 130, 30);
for(int i= 0; i < 3; i++) // Нарисовать флаг
{
arg.Graphlcs.FIIIRectangle // Нарисовать прямоугольник
(new SolidBrush (colors [i]), rect);
rect.Offset (0, 30); // Переместить прямоугольник вниз >
// Нарисовать строку от носика курсора мыши
arg.Graphics.DrawString (ourTextBox.Text,
new Font ("Arial", 16), new SolidBrush (colors [n]), point);
}
// Обработать событие MouseDown мыши
void OurMouseDown (object sender, MouseEventArgs arg)
{
point.X= arg.X; // Сохранить координату X носика курсора мыши
point.Y= arg.Y; // Сохранить координату Y носика курсора мыши
Invalidate ( ); // Перерисовать область клиента окна
>
// Обработать событие Click кнопки
vold OurButtonClick (object sender, EventArgs arg)
{
п++; // К следующему цвету флага
if (n >= 3) n= 0;
Invalidate (); // Перерисовать область клиента окна
>
static vold Main ( ) // Главная функция
{
Appllcation.Run (new CTextBox_Button ( )); // Выполнить
// приложение
>
>
C#. Выполнение приложения начинает функция Main(), которая вызывает
функцию Run(), передав ей в качестве аргумента объект класса CText-
Box_Button прикладного окна. Прикладное окно с изображенным флагом,
кнопкой и редактором появляется на экране.
При создании объекта класса CTextBox_Button выполняется конструк-
тор CTextBox_Button().
Вначале конструктор, используя свойство Text объекта окна, присваивает за-
головку окна название Russian flag. Затем создаются редактор текста и кноп-
ка. Свойства Location и Size редактора и кнопки размещают их в области
клиента окна и устанавливают размеры. Функция Add() включает объекты
редактора и кнопки в коллекцию прикладного окна. Если не сделать этого, то
окно не будет считать редактор и кнопку своими объектами и не отобразит
их в окне.
Теперь осуществляется подписка обработчика OurMouseDown() на событие
MouseDown мыши: создаётся объект делегата EventHandler и этот объект до-
бавляется к объекту события MouseDown. Затем на событие Click кнопки
подписывается её обработчик OurButtonClick().
Перед завершением конструктор создаёт объект point точки для фиксации
координат носика мыши, необходимых при рисовании строки функцией On-
Paint().
Наконец, создается и инициализируется массив colors цветов.
Обработчик OurMouseDown() события MouseDown мыши прост. При
каждом нажатии на клавишу мыши точке point присваиваются координаты
носика мыши и вызывается функция Invalidate(), которая инициирует выпол-
нение функции перерисовки OnPaint().
функция OnPaint() вначале изображает флаг, трижды рисуя со смеше-
нием прямоугольник rect с требуемыми цветами. Используемая при этом
функция FillRectangle() закрашивает прямоугольник кистью нужного цвета.
Затем функция DrawString() рисует строку, извлечённую из редактора с по-
мощью свойства Text.
Обработчик OurButtonClick() кнопки меняет цвет рисуемой строки, из-
менив индекс n элемента массива colors цветов и вызвав функцию Invalidate().
Функция Invalidate() инициирует перерисовку окна с объектом кисти
очередного цвета. Этот объект кисти класса SolidBrush применяет функция
DrawString() рисования строки.
номшв
Рис. 10.8.3. Прикладное окно приложения примера 10.8.1 суправляющими
элементами
Пример 10.8.2. Программа с управляющими элементами на языке Java.
////////////////////
// Java и J #
lmportjava,awt.*;
