Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая. Отчет. Богданов 4205..docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
553.16 Кб
Скачать

5.3.3. Этап 3. Разработка прикладного и дочернего окон, кнопки добавления шаров.

Наступил этап разработки, когда появится прикладное окно приложения с перемещающимися шарами. А также прикладное окно с кнопкой добавления машин.

Наследовав класс Form или Frame, класс Avtos существенно расширит свою функциональность. Теперь можно создать прикладное окно (основную форму) и дочернее окно (дочернюю форму). Реализация этого этапа представлены в примерах 5.3.3.1 и 5.3.3.2 и 5.3.3.3.

Пример 5.3.3.1. Реализация третьего этапа разработки Avtos–приложения на языке С#.

using System;

using System.Drawing;

using System.Windows.Forms;

using System.Threading;

using System.Collections;

public delegate void delEv();

public class Avto

{

public int num; //номер объекта

public event delEv evSpecial;

public int x, y;//координаты машины

public double fi = 0.1;

public int dx1, dy1, dx2, dy2;//приращения машин

public int speed;//скорость машины

Thread thread;

public bool dvig = true;

public bool life;//признак жизни потока

public bool run = true;

public int N { get { return num; } }//номер машины

public int X { get { return x; } set { x = value; } }//координата X

public int Y { get { return y; } set { y = value; } }//координата Y

public Avto(int N, int X, int Y, int Speed)

{

num = N;

x = X; y = Y;

speed = Speed;

life = true;

//создать и запустить поток

thread = new Thread(new ThreadStart(AvtoFunc));

thread.Start();

}

public void Finish()//завершить поток

{

//Resume();

life = false;

}

void AvtoFunc()

{

while (life)

{

if (run)

{

Thread.Sleep(speed);

if (dvig)

{

//уравнение движения по окр-ти

dx1 = (int)(19 * Math.Sin(fi));

dy1 = (int)(19 * Math.Cos(fi));

x += dx1;

y += dy1;

}

else

{

dx2 = (int)(28 * Math.Sin(fi));

dy2 = (int)(28 * Math.Cos(fi));

y -= dx2;

x -= dy2;

}

fi += 0.1;

}

evSpecial();

}

}

public void Suspend()//приостановить поток

{

if (run)

{

run = false;

}

}

public void Resume()//возобновить поток

{

if (!run)

{

run = true;

}

}

}

class Avtos : Form

{

ArrayList al; //ссылка на список машин

private int num = 0;//номер объекта машины

private Form f;// ссылка на дочернее окно управления

private Button add;// ссылки на кнопки

public bool run = true;//признак движения машин

public Avtos()//конструктор

{

al = new ArrayList();

run = true;//машины двигаются

Size = new Size(770, 770);//установить размер прикладного окна

Text = "Шоссе";//установить заголовок прикладного окна

f = new Form();//создать объект дочернего окна

f.Text = "Control";//установить заголовок дочернего окна

f.Size = new Size(300, 150);//установить размеры дочернего окна

f.Show();//показать дочернее окно

add = new Button();//создать кнопку добавления машин

add.Text = "Add";//именовать кнопку

add.Size = new Size(45, 30);//размеры кнопки

add.Location = new Point(5, 50);//поместить кнопку в окне

add.Click += new EventHandler(ADD);//подписать обработчик

f.Controls.Add(add);//поместить объект add в контейнер окна

}

//создать автомобиль

public void ADD(Object obj, EventArgs arg)

{

num++;

Avto b;

Random r = new Random();

if (num % 2 == 0)

{

Avto a = new Avto(num, 385, 660, r.Next(50, 100));

Console.WriteLine("Добавлен автомобиль " + num);

a.dvig = false;

b = a;

}

else

{

Avto a = new Avto(num, 195, 400, r.Next(50, 100));

Console.WriteLine("Добавлен автомобиль " + num);

a.dvig = true;

b = a;

}

al.Add(b);

IEnumerator inum = al.GetEnumerator();

while (inum.MoveNext())

{

Avto q = (Avto)inum.Current;

q.evSpecial += new delEv(this.HandlerEvSpecial);

}

}

public void HandlerEvSpecial()

{

Invalidate();

}

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

protected override void OnPaint(PaintEventArgs arg)

{

arg.Graphics.FillEllipse(new SolidBrush(Color.Gray), 100, 100, 604, 604);//внешнее кольцо

arg.Graphics.FillEllipse(new SolidBrush(Color.White), 173, 173, 454, 454);//разделительная полоса

arg.Graphics.FillEllipse(new SolidBrush(Color.Gray), 175, 175, 450, 450);//внутреннее кольцо

arg.Graphics.FillEllipse(new SolidBrush(Color.YellowGreen), 245, 245, 300, 300);

this.BackColor = Color.YellowGreen; // Закрасить фон зеленым

this.FormBorderStyle = FormBorderStyle.FixedSingle; // Запрет изменения размера окна

this.MaximizeBox = false; // Убрать кнопку "Развернуть окно"

this.DoubleBuffered = true; // Включить буферизацию изображения

IEnumerator inum = al.GetEnumerator();

while (inum.MoveNext())

{

Avto a = (Avto)inum.Current;

arg.Graphics.FillEllipse(new SolidBrush(Color.Red), a.x, a.y, 25, 25);//машина

arg.Graphics.DrawString(a.N.ToString(), new Font("Comic Sans MS", 9), new SolidBrush(Color.White), a.x + 5, a.y + 5);//номера машин

}

}

static void Main()

{

Application.Run(new Avtos());

}

}

Результат:

Пример 5.3.3.2. Реализация третьего этапа разработки Avtos–приложения на языке С++/CLI.

// kurs.cc.cpp : main project file.

#include "stdafx.h"

#using <System.Drawing.dll>

#using <System.Windows.Forms.dll>

using namespace System;

using namespace System::Threading;

using namespace System::Collections;

using namespace System::Drawing;

using namespace System::Windows::Forms;

delegate void delEv();

ref class Avto

{

public:

int num;

event delEv ^evSpecial;

int x, y;

double fi;

int dx1, dy1, dx2, dy2;

int speed;

Thread ^thread;

bool dvig;

bool life;

bool run;

property int N { int get() { return num; } }

property int X { int get() { return x; } }

property int Y { int get() { return y; } }

Avto(int N, int X, int Y, int Speed)

{

fi = 0.1;

num = N;

dvig = true;

run = true;

x = X; y = Y;

speed = Speed;

life = true;

thread = gcnew Thread(gcnew ThreadStart(this,&Avto::AvtoFunc));

thread->Start();

}

void Finish()

{

//Resume();

life = false;

}

void AvtoFunc()

{

while (life)

{

if (run)

{

Thread::Sleep(speed);

if (dvig)

{

dx1 = (int)(19 * System::Math::Sin(fi));

dy1 = (int)(19 * System::Math::Cos(fi));

x += dx1;

y += dy1;

}

else

{

dx2 = (int)(28 * System::Math::Sin(fi));

dy2 = (int)(28 * System::Math::Cos(fi));

y -= dx2;

x -= dy2;

}

fi += 0.1;

}

evSpecial();

}

}

void Suspend()

{

if (run)

{

run = false;

}

}

void Resume()

{

if (!run)

{

run = true;

}

}

};

ref class Avtos : public Form

{

private:

ArrayList ^al; //ссылка на список машин

int num;// = 0;//номер объекта машины

Form ^f;// ссылка на дочернее окно управления

Button ^add;// ссылки на кнопки

bool run;// = true;//признак движения машин

public:

Avtos()

{

num=0;

al = gcnew ArrayList();

run = true;

Size = Drawing::Size(770, 770);

Text = "Шоссе";

f = gcnew Form();

f->Text = "Control";

f->Size = Drawing::Size(300, 150);

f->Show();

add = gcnew Button();

add->Text = "Add";

add->Size = Drawing::Size(45, 30);

add->Location = Point(5, 50);

add->Click += gcnew EventHandler(this, &Avtos::ADD);

f->Controls->Add(add);

}

public:

void ADD(Object ^obj, EventArgs ^arg)

{

num++;

Avto ^b;

Random ^r = gcnew Random();

//Random rand = new Random();

if (num % 2 == 0)

{

Avto ^a = gcnew Avto(num, 385, 660, r->Next(50, 100));

System::Console::WriteLine("Добавлен автомобиль"+num);

a->dvig = false;

b = a;

}

else

{

Avto ^a = gcnew Avto(num, 195, 400, r->Next(50, 100));

System::Console::WriteLine("Добавлен автомобиль"+num);

a->dvig = true;

// a.ev += new Del(this.Handlerev);

b = a;

}

al->Add(b);

IEnumerator ^inum = al->GetEnumerator();

while (inum->MoveNext())

{

Avto ^q = (Avto^)inum->Current;

q->evSpecial += gcnew delEv(this, &Avtos::HandlerEvSpecial);

}

}

public:

void HandlerEvSpecial()

{

Invalidate();

}

protected:

virtual void OnPaint(PaintEventArgs ^arg) override

{

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::Gray), 100, 100, 604, 604);//внешнее кольцо

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::White), 173, 173, 454, 454);//разделительная полоса

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::Gray), 175, 175, 450, 450);//внутреннее кольцо

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::YellowGreen), 245, 245, 300, 300);

this->BackColor = Color::YellowGreen; // Закрасить фон зеленым

this->MaximizeBox = false; // Убрать кнопку "Развернуть окно"

this->DoubleBuffered = true; // Включить буферизацию изображения

IEnumerator ^inum = al->GetEnumerator();

while (inum->MoveNext())

{

Avto ^a = (Avto^)inum->Current;

arg->Graphics->FillEllipse(gcnew SolidBrush(Color::Red), a->X, a->Y, 25, 25);//машина

arg->Graphics->DrawString(a->N.ToString(), gcnew Drawing::Font("Comic Sans MS", 10), gcnew SolidBrush(Color::White), a->X + 5, a->Y + 5);//номера машин

}

}

};

static void main()

{

Application::Run(gcnew Avtos());

}

Результат:

Пример 5.3.3.3. Реализация третьего этапа разработки Avtos–приложения на языке Java.

import java.util.*;

import java.awt.*;

import java.awt.event.*;

import java.io.*;

public class Avto extends Observable implements Runnable

{

public int num;

public int x, y;

public double fi = 0.1;

public int dx1, dy1, dx2, dy2;

Thread thr;

public boolean dvig = true, run = true;

boolean life;

public int speed;

public int N() { return num; }

public int X() { return x; }

public int Y() { return y; }

public Avto(int N, int X, int Y, int Speed)

{

num = N;

x = X; y = Y;

speed = Speed;

life = true;

thr = new Thread(this);

thr.start();

}

public void report()

{

setChanged();

notifyObservers();

}

public void Finish()

{

Resume();

life = false;

}

public void run()

{

while (life)

{

if (run)

{

try

{

Thread.sleep(speed);

}

catch (InterruptedException e) { }

if (dvig)

{

x += dx1;

y += dy1;

dx1 = (int)(19 * Math.sin(fi));

dy1 = (int)(19 * Math.cos(fi));

}

else

{

y -= dx2;

x -= dy2;

dx2 = (int)(28 * Math.sin(fi));

dy2 = (int)(28 * Math.cos(fi));

}

fi += 0.1;

report();

}

}

}

public void Suspend()

{

if (run)

{

run = false;

}

}

public void Resume()

{

if (!run)

{

run = true;

}

}

}

public class Autos extends Frame implements Observer, ActionListener, ItemListener

{

public ArrayList al;

private boolean run;

private Frame f;

private Button add;

private int num = 0;

private Random r;

public Autos()

{

al = new ArrayList();

r = new Random();

this.addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent wE)

{

for (int n = 0; n < al.size(); n++)

{

Avto a = (Avto)al.get(n);

a.Suspend();

}

System.exit(0);

}

});

setTitle("Шоссе");

setLocation(new Point(600, 0));

setBackground(Color.green);

run = true;

f = new Frame();

f.setSize(300, 100);

f.setTitle("Control");

f.setLocation(new Point(150,150));

f.setLayout(new FlowLayout());

add = new Button("Add");

add.setActionCommand("ADD");

add.addActionListener(this);

f.add(add);

f.setVisible(true);

}

//обработать уведомдение

public void update(Observable obj, Object arg)

{

repaint();

}

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

public void paint(Graphics g)

{

g.setColor(Color.gray);

g.fillOval(100, 100, 604, 604);

g.fillOval(175, 175, 450, 450);

g.setColor(Color.white);

g.fillOval(173, 173, 454, 454);

g.setColor(Color.gray);

g.fillOval(175, 175, 450, 450);

g.fillOval(175, 175, 450, 450);

g.setColor(Color.green);

g.fillOval(245, 245, 300, 300);

for (int i = 0; i < al.size(); i++)

{

g.setColor(Color.red);

Avto a = (Avto)al.get(i);

g.fillOval(a.X(), a.Y(), 25, 25);

g.setColor(Color.white);

g.drawString(Integer.toString(a.num), a.X() + 5, a.Y() + 15);

}

}

//выполнить команды для нажатия кнопок

public void actionPerformed(ActionEvent aE)

{

String str = aE.getActionCommand();

if (str.equals("ADD"))

{

num++;

Avto b;

r = new Random();

if (num % 2 == 0)

{

Avto a = new Avto(num, 385, 666, r.nextInt(100)+50);

System.out.println("Dobavlen avto " + num);

a.dvig = false;

b = a;

}

else

{

Avto a = new Avto(num, 195, 400, r.nextInt(100)+50);

System.out.println("Dobavlen avto " + num);

a.dvig = true;

b = a;

}

b.addObserver(this);

al.add(b);

}

repaint();

}

public void itemStateChanged(ItemEvent e)

{

repaint();

}

public static void main(String[] args)

{

Autos auto = new Autos();

auto.setSize(750, 750);

auto.setVisible(true);

}

}

Результат: