Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

Int n; // Индекс цвета

public:

CTextBox Button ( ) // Конструктор {

// Подписать обработчик на событие MouseDown мыши

MouseDown += gcnew MouseEventHandler (this,

&CTextBox_Button:: Ou rMouseDow n);

Text= "Russian flag"; // Установить заголовок окна

n= 0;

BackColor= Color::Gold;

colors= gcnew array<Color^> (3); //Создатьмассивструктур

colors [0]= Color::White;

colors [1]= Color::Blue;

colors [2]= Color::Red;

pTextBox= gcnew TextBox (); // Создать объект редактора

pTextBox -> Location= Drawing::Point (10,120); // Разместить

pTextBox-> Size= Drawing::Size (150, 20); // Размер

pTextBox -> Text= "Russia"; // Поместить текст в редактор

Controls -> Add (pTextBox); // Добавить редактор к форме

pButton= gcnew Button; // Создать объект кнопки

pButton -> Location= Point (170,10); // Разместить

pButton -> Size= Drawing::Size (40, 20); // Размер

pButton -> Text= "OK"; // Поместить текст в кнопку

Controls -> Add (pButton); // Добавить кнопку к форме

// Подписать обработчик на событие Click кнопки

pButton -> Click += gcnew EventHandler (this,

&CTextBox_Button::OurButtonClick); >

protected:

virtual void OnPaint (PaintEventArgs ^ arg) override // Перерисовать область

{

Form: :OnPalnt (arg);

Rectangle rect (10, 10, 130, 30); // Прямоугольник третьей части флага

for(int i=0; i < 3; i++) // Нарисовать флаг

<

arg->Graphics->FillRectangle(gcnew SolidBrush (*colors[i]),

rect.X, rect.Y, rect.Width, rect.Helght);

rect.Offset (0, 30); // Сместить прямоугольник rect вниз

>

// Написать строку от координат носика курсора мыши

arg -> Graphics -> DrawString (pTextBox ->Text,

gcnew Drawing::Font ("Arial", 16),

gcnew SolidBrush (*colors [n]), point);

void OurMouseDown (Object ^pSender, MouseEventArgs ^arg)

{

polnt,X= arg - > X; // Сохранить координату X носика курсора мыши

polnt.Y= arg - > Y; // Сохранить координату Y курсора мыши

Invalidate ( ) ; // Перерисовать область клиента окна

>

/ / Обработать щелчок на кнопке

voiu OurButtonCiick (Object *-sender, EventAi'yS Ае)

<

n++; // К следующему цвету массива цветов colors

if (n > = 3) n= 0;

Invalidate ( ) ; // Перерисовать область клиента окна

>

>;

vold main ( )

{

Application::Run (gcnew CTextBox_Button ( )); // Выполнить

}

C++/CLI. В отличии от программы на языке Java в программе на языке

C++/CLI появилась глобальная главная функция main(), операторы #using до-

бавляют требуемые библиотеки. Трансформировалась грамматика - появи-

лось слово ref перед управляемым классом, операторы new заменены на

gcnew, появились дескрипторы и стрелки. Иначе получены объекты делега-

тов событий, аргументы конструкторов которых содержат ссылку this на

объект-окно, содержащий обработчик, и ссылку на сам обработчик. В заго-

ловке функции OnPaint() появились ключевые слова virtual и override.

Пример 10.8.3 программы на языке C++/CLI иллюстрирует некоторые осо-

бенности этого языка, которые удивят программистов, знающих предшест-

вующую версию C++,NET. Они, наверняка, обратят внимание на создание и

использование массива цветов, присвоение значений свойствам кнопки и ре-

дактора, а также на неожиданное появление в заголовке функции OnPaint()

после слова OnPaint ключевого слова override, что совершенно не согласуется

с принятыми описаниями функций в предшествующем языке C++.NET.

Рис. 10.8.5. Прикладное окно приложения примера 10.8.3 с управляющими

элементами на языке C++/CLI

Классы UserControl и Panel

Объекты класса UserControl языка C# и объекты класса Panel языка

Java своеобразны, поскольку представляют соответствующие управляющие

элементы в окне в виде прямоугольных областей, каждая из которых облада-

ет функциональностью окна. То есть в этой прямоугольной области можно

выводить графическую информацию, применять свои потоки и события. Так

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

функционирующие. Эти области (точнее, эти управляющие элементы) раз-

мещаются в окне так же, как и любые другие управляющие элементы - кноп-

ки, редакторы и т.д. Обычно на базе классов UserControl и Panel создаются

порождённые классы, в которых, воспользовавшись свойствами управляю-

щего элемента, легко получаются координаты его левой верхней точки, раз-

мер элемента и другие свойства, а также многие функции базовых классов

UserControl и Panel, включая функции OnPaint() или paint() и Invalidate() или

repaint(). Такое необычное применение в порождённом классе свойств, уста-

новленных вне управляющего элемента, иллюстрируют программы примеров