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

Int len; // Текущая длина массива points

public CLine( ) // Конструктор

{

// Привязать к событию MouseDown функцию OurMouseDown

MouseDown += new MouseEventHandler (OurMouseDown);

Text= "Line"; // Заголовок прикладного окна

points= new Point [20]; // Создать массив polnts в куче

len= 0; // Инициализировать len >

// Перерисовать область клиента окна

protected override void OnPaint (PaintEventArgs arg)

{

base.OnPaint (arg);

for (int i=0; i < len-1; i++) // Перебрать массив точек

arg.Graphics.DrawLine // Нарисовать отрезок линии

(new Pen (Color.Blue), points[i], points[i+l]);

// Обработать событие MouseDown мыши

Void OurMouseDown (object sender, MouseEventArgs arg)

{

// Реагировать только на левую клавишу мыши

if (arg.Button == MouseButtons.Right) return;

If (len < 20) // Если есть место в массиве polnts, то

{ // поместить в массив точку

points[len].X= arg.X; // Координата X носика курсора мыши

points[len].Y= arg.Y; // Координата Y носика курсора мыши

len++;

>

Invalidate ( ); // Перерисовать

static void Main ( ) // Главная функция

{

Application.Run (new CLine ( )); // Выполнить приложение

шишшшшш

// C + + / C L I

*inciude "stdafx,h"

#using <System.Drawing,dll>

#using <System.Windows.Forms.dll>

using namespace System;

using namespace System::Drawing;

using namespace System::Wlndows::Forms;

ref class CLine : Form // Класс прикладного окна

/

array<Point^> ^points; // Массив точек носика курсора мыши

Int len; // Текущая длина массива points

public:

CLine() // Конструктор

{

// Привязать к событию MouseDown функцию OurMouseDown

MouseDown += gcnew MouseEventHandler (this,

&CLine::OurMouseDown);

Text= "Line"; // Заголовок прикладного окна

points= gcnew array<Point^> (20); // Создать массив points в куче

len= 0; // Инициализировать len >

protected:

// Перерисовать область клиента окна

virtual void OnPaint (PaintEventArgs ^arg) override

{

Form: :OnPaint (arg);

for (int i=0; i < len-1; i++) // Перебрать массив точек

arg->Graphics->DrawLine // Нарисовать отрезок линии

(gcnew Pen (Color::Blue), *points[i], *points[i+l]);

}

// Обработать событие MouseDown мыши

void OurMouseDown (Object ^sender, MouseEventArgs ^arg)

{

if (len < 20) // Если есть место в массиве points, то

{

polnts[len]=gcnew Point (arg->X, arg->Y); // поместить в массив

len++; >

Invalidate ( ); // Перерисовать

>

>;

void main ( )

{

Application:: Run (gcnew CLine ( ));

}

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

// Java и J#

import java.awt.*;

import java.awt.event,*;

class CLine extends Frame // Класс прикладного окна

{

Point [ ] points; // Массив точек носика курсора мыш»

int len; // Текущая длина массива polnts

public CUne() // Конструктор

{

setTitle ("Llne"); // Установить заголовок прикладного <

setSize (400, 200); // Установить размер окна

//this.setBackground (Color.lightGray);

points= new Point [20]; // Создать массив po/nts точек в куче

len= 0; // Инициализировать len

// Реализовать обработчик события мыши, применив

// внутренний анонимный класс

this.addMouseListener (new MouseAdapter ()

{

public void mousePressed (MouseEvent mE)

{

|| Реагировать только на левую клавишу мыши

if((mE.getModifiers()&Event.META_MASK)>0) return;

if (len < 20) // Если есть место в массиве points

{

points[len]= mE.getPoint (); // Координаты

U носика курсора мыши

leri++;

У

repaint ( );

>

»;

thls.addWindowListener (new OurWindowAdapter());

>

// Перерисовать область клиента окна

public void paint (Graphics g)

{

g.setColor (Color.blue);

for (int i=0; i < points.length-l; I++) // Перебрать массив точек

{

g.drawLine( // Нарисовать отрезок линии

points[i].x, points[().y ,polnt5[i+l].x, points[i+l].y);

У

>

public static void main ( ) // Главная функция

{

CLIne line= new CLIne ( );

line.show ( ); >

>

// Класс а д а п т е р а окна

class OurWindowAdapter extends WindowAdapter

{

public void windowClosing (WindowEvent wE)

{

System.exit (0);

>

>

C#. Класс CLine прикладного окна, порождённый из базового класса Form,

содержит закрытый массив точек points, соответствующих координатам но-

сика мыши нажатых клавиш, и текущую длину ien этого массива.

При создании объекта-окна конструктор инициализирует данные клас-

са CLine, создав массив points из 20 точек в куче и присвоив его текущей дли-

не len значение 0. Кроме этого конструктор подписывает обработчик Our-

MouseDown() на событие MouseDown клавиши мыши и посредством свойст-

ва Text формы определяет заголовок "Line" прикладного окна.

Рассмотрим работу приложения. После запуска приложения появилось

прикладное окно. При создании окна конструктор класса Cline, создав массив

из 20 точек, присвоит длине массива len начальное значение и подпишет об-

работчик OurMouseDown() на событие MouseDown. При появлении окна cre-

нерируется событие Paint и, как следствие, выполнится наш переопределён-

ный обработчик OnPaint(), который в виду нулевого значения переменной len

не рисует ломаную линию в области клиента, Таким образом, при появлении

прикладного окна его область клиента пуста. Приложение ждёт события

MouseDown от нажатия левой клавиши мыши и события от закрытия при-

кладного окна. При нажатии левой клавиши мыши выполнится обработчик

OurMouseDown(). Обработчик OurMouseDown(), воспользовавшись парамет-

ром arg типа MouseEventArgs, извлекает значения координат носика курсора

нажатоЙ клавиши мыши и присваивает их текущему элементу массива points

точек. Затем продвигается индекс len массива. Если индекс len выходит за

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

завершением обработчик OurMouseDown() вызывает функцию Invalidate(),

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

функции OnPaint(). Ломаная линия перерисовывается в окне.

Функция OnPaint() использует графический объект класса Graphics, из-

влекая его из структуры PaintEventArgs с помощью свойства Graphics и обра-

тившись к функции DrawLine() рисования линии. В качестве аргумента

функция DrawLine() использует объект-перо синего цвета.

Ломаная линия рисуется циклически, при этом в каждом цикле рисует-

ся только один отрезок линии синего цвета.

C++/CLI. Программа на языке C++/CLI схожа с программой на языке C#,

поскольку применяются те же классы библиотеки .NET Framework. Обраща-

ет на себя внимание иное описание и использование массива точек. В управ-

ляемом классе CLine применён управляемый массив points, который описан

с применением слова array и является массивом дескрипторов на объекты то-

чек, размещенных в управляемой куче. При нажатии на клавишу мыши обра-

ботчик присваивает очередному дескриптору массива ссылку на созданный в

куче объект точки, содержащей координаты носика мыши. А функция paint()

перерисовки использует через дескриптор эти объекты при рисовании лома-

ной линии.

Обратите внимание, что заголовок функции OnPaint() языка C++/CLI отлича-

ется от заголовка функции OnPaint() языка C#: используется ключевые сло-

во virtual, а слово override стоит в конце заголовка.

Java. Так же, как и в программе на C#, программа на языке Java использует

графический класс Graphics в предопределённой функции перерисовки, ко-

торая называется paint(). Функция рисования линии drawLine() не содержит

объект пера, как в соответствующей функции DrawLine() библиотеки .NET

Framework. Цвет пера устанавливается с помощью свойства setColor(). От-

лично от программы языка C# реализуется и обработка события мыши, в со-

ответствии с одним из вариантов, изложенных в разделе 10.5. Вместо функ-

ции Invalidate() языка C# применена функция repaint(). Эти функции иниции-

руют появление события Paint. Использованию различных классов позволило

их импортирование с помощью

lmportjava.awt.*;