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

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),