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

Void ThrFunc ( )

{

d= 4; // Нарисовать шар толстым пером

Thread.Sleep (200);

d= 1; // Нарисовать шар тонким пером

run= false;

>

// Создать и стартовать поток для утолщения пера рисования шара

public void Start ( )

{

if(!run)

{

run= true;

t= newThread (newThreadStart(ThrFunc));

t.Start ( );

// Класс прикладного окна

class Wlnd : Form

{

public SpecialBall speclalBall;// Ссылка на спец.объект

Button butAdd; // Ссылка на кнопку

ArrayList aL; // Ссылка на список

Random r; // Ссылка на объект случайного числа

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

{

specialBall= new SpeclalBall (30, 30); // Создать спец.объект

aL= new ArrayList ( ); // Создать список

r= new Random ( ); // Создать объект случайного числа

butAdd= new Button ( ); // Создать кнопку

butAdd.Location = new Point (100, 24); // Разместить кнопку

// Задать размер кнопки в области клиента дочерней формы

butAdd.Size = new Size (32, 24);

butAdd.Text = "Add"; // Поместить текст в кнопку

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

butAdd.Click += new EventHandler (OnButAdd);

Controls.Add (butAdd);

// Обработать событие кнопки

Vold OnButAdd (object obj, EventArgs arg)

i

Ball b= new Ball ( r.Next(this.Width),r.Next(this.Height),

r.Next(5, 10),r.Next(5, 15),

this.ClientSize.Width, this.aientSize.Height);

b.ev += new delEv (HandlerEv );

b.evSpecial += new delEv (specialBall.HandlerEvSpedal);

aL.Add (b);

>

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

protected override vold OnPalnt (PaintEventArgs arg)

{

for (int i= 0; i < aL.Count; i++)

{

Ball b= (Ball) aL[l];

arg .Graphics.DrawEllipse (new Pen (Color.Blue),

b.X, b.Y, 20, 20);

>

arg .Graphics.DrawEllipse (new Pen (Color.Yellow, speclalBall.D),

specialBall.X, spec!alBall.Y, 20, 20);

// Обработать событие перерисовки из шара

Void HandlerEv ( )

<

Invalidate ( );

}

// Обработать событие закрытия окна

protected override void OnClosed (EventArgs e)

{

base.OnClosed (e);

for (int i= 0; i < aL.Count; i++)

{

Ball b= (Ball) aL[i];

b.Finish ( );

>

}

// Выполнить основной поток

static void Main ( )

{

Wind w= new Wind ( );

Application.Run (w);

>

>

12.4. Задание 4

Программа содержит прикладное окно с кнопкой и особой областью,

представленной прямоугольником. При нажатиях на кнопку в окне появля-

ются перемещающиеся разноцветные шары, отталкиваясь от границ окна.

При вхождении шара в особую область от него отделяются три шара мень-

шего размера и того же цвета, которые исчезают через 2 сек. В особой облас-

ти может перемещаться только один шар (со своими небольшими шарами).

Мелкие шары продолжают перемещаться в течении 2 сек в том же направле-

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

тающиеся войти в особую область шары выстраиваются в очередь у границы

области.

Примечание. Объекты больших шаров создаются из класса, содержащего поток, переме-

щающий эти шары в окие. Также этот поток генерирует событие (уведомление), обработчик кото-

рого осуществляют перерисовку окна. При входе в особую область поток создает три объекта не-

больших шаров с запуском их потоков. Небольшие шары помещаются в соответствующий список,

который применяется при рисовании шаров в окне. Объекты небольших шаров создаются из сво-

его класса, содержащего поток, перемещающий небольшой шар в течение 2 сек. При своем завер-

шении поток небольшого шара генерирует событие (уведомление), обработчик которого осущест-

вляют удаление соответствующего объекта шара из списка небольших шаров. Удобно хранить

объекты шаров в списке, что облегчает их совместную обработку.

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

// C# Большие шары создают небольшие шары в особой области

using System;

using System.Drawlng;

using System.Windows.Forms;

using System.Threading;

using System.Collections;

// Класс особой области

class Region

{

public Rectangle r= new Rectangle (50, 50, 200, 100);

public void Waiting ()

{

Thread.Sleep(1000); I4 >

delegate void delEv ( ); // Делегат события перерисовки окна

delegate void delEvS (SmallBall sm); // Делегат удаления небольшого шара

// Класс небольших шаров

class SmallBall

{

private int x, у; // Координаты шара

private int w, h; // Ширина и высота области клиента

private int dx, dy; // Приращения координат шара

private Thread t; // Ссылка на поток

private bool life; // Признак существования потока

private Color с; // Ссылка на объект цвета

private int count; // Число циклов жизни небольшого шара

public event delEvS evS; // Ссылка на событие удаления небольшого

// шара

// Свойство X

public int X

{get{return х ; »

// Свойство Y

public int Y

{get{return у ; »

// Свойство Color

public Color Color

{get{return с ; »

// Конструктор

public SmallBall (int X, int Y, int Dx, int Dy, int W, int H, Color С, Wind wind)

{

w= W; h= H; x= X; y= Y; dx= Dx; dy= Dy; c= С;

this.evS+= new delEvS (wind.HandierEvS);

// Создать и стартовать поток

llfe= true;

t= new Thread (new ThreadStart (BallFunc));

t.Start ();

// Завершить поток

public vold Finish ()

{

life= false;

t>Joln ( );

>

// Выполнить поток небольшого шара

protected vold BallFunc ( )

{

while (llfe)

r V

x += dx; у += dy;

If (x>w || x<0) dx= -dx;

lf(y>h || y<0) dy= -dy;

Thread.Sleep (100);

count+= 1;

lock(this)

{

// Завершить поток через 20 * 100 секунд

if(count==20)

{

life= false;

// Сгенерировать событие удаления шара

if (evS != null)

{

evS (this);

>

>

>

>

>

>

// Класс объектов больших шаров

class BigBall

{

public int x, у;

public int w, h;

public int dx, dy;

public event delEv ev;

private Region reg;

private bool inRect;

private ArrayList aL;

public Thread t;

public bool life;

public Color с;

Wind wind;

// Координаты шара

// Ширина и высота области клиента

// Приращения координат шара

// Объявление события перерисовки

// Ссылка на особую область

// Признак нахождения шара в особой области

// Ссылка на список небольших шаров

// Ссылка на поток

// Признак существования потока

// Ссылка на цвет шара

// Ссылка на прикладное окно

// Свойство X

pubiic int X

{get{return х ; »

// Свойство Y

public int Y

{get{return у ; »

// Свойство Color

public Color Color

{get{return c ; »

|| Конструктор

public BigBall (int X, lnt Y, int Dx, int Dy, lnt W, int H, Region R, Color C,

ref ArrayList aL, Wind wind)

{ 4 1 . V ' • •— * , . J . . _ r > . . . ^ , . _ r s . . .

VY— VV, tl — I I , А — Л , y — 1 , U A - UAf U y — L > y ,

reg= R; this.aL= aL; reg= new Region ();

inRect= false; c= C; this.wlnd= wind;

// Создать и стартовать поток

life= true;

t= newThread (newThreadStart (BallFunc));

t.Start ( );

>

// Выполнить поток большого шара

public void BallFunc ( )

{

while (llfe)

{

x += dx; у += dy;

if(x>w||x<0) dx=-dx;

if(y>h || y<0) dy= -dy;

Point p= new Point(x, у);

// Синхронизовать параллельное выполнение потоков

lock(this)

{