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

2. Проектирование структуры классов

При рассмотрении исходных данных создается структура иерархии классов.

Созданы следующие классы:

  • Figure (базовый абстрактный класс фигуры);

  • Circle (класс-наследник окружность);

  • Rect (класс-наследник прямоугольник);

  • Square (класс-наследник квадрат);

  • Triangle (класс-наследник треугольник).

Иерархия классов показана на рисунке 3.

Figure

Circle

Triangle

Rect

Square

Рисунок 3 – Иерархия классов.

Базовым классом в иерархии является абстрактный класс Figure. Классы Circle, Rect, Square и Triangle являются клаввами наследниками. Суть наследования заключается в том, что один класс поглощает другой. То есть - это использование одного класса в другом.

В данной курсовой работе от абстрактного класса Figure наследуются классы Circle, Rect, Square и Triangle.

На основе иерархии классов строится алгоритм работы программы:

  1. Для того что бы какая либо фигура начала свое движение её нужно выбрать в немодальном диалоговом окне Фигуры (можно выбрать как одну фигуру, так и две, три, четыри).

  2. После выбора нужной фигуры она появится и начнет двигаться в окне Window.

  3. Для прекращения движения какой либо фигуры следует снять с нужной фигуры метку в немодальном диалоговом окне Фигуры и соответствующая фигура прекратит свое движение (исчезнет).

  4. Для завершения приложения нужно закрыть программу.

3. Программная реализация

Для реализации было создано окно window (в котором осуществлено движение фигур) и немодальное диалоговое окно выбора фигуры (в нем нужно выбрать фигуру которая должна двигаться, а также можно прекратить движение какой либо фигуры) .

В немодальном диалоговом окне находятся 4 фигуры (круг, квадрат, прямоугольник, треугольник). Для того что бы нужная фигура начала свое движение её нужно отметить, для того что бы она прекратила движение метку нужно снять.

Создание немоданьгого окна.

case WM_CREATE: //создание окна

{

dlg=CreateDialogParam(hinst,MAKEINTRESOURCE(IDD_DIALOG1),hwnd,(DLGPROC)dlgproc,0); //создать немодальное окно с чекбоксами

ShowWindow(dlg,SW_SHOWNORMAL);

//показать его

return 0; //конец обработки сообщения

}

Проверка какая фигура отмечена, а какая нет осуществляется следующим кодом.

LRESULT CALLBACK dlgproc(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)

{

switch(uMessage)

{

case WM_COMMAND: //нажатие кнопок

{

if(LOWORD(wparam)==IDC_CHECK1) //если нажата кнопка окружности

{

if(IsDlgButtonChecked(hwnd,IDC_CHECK1))//и она отмечена

{

c->Run(); //то запустить движение окружности

}

else

{

c->Stop(); //иначе остановить движение окружности

}

}

if(LOWORD(wparam)==IDC_CHECK2) //если нажата кнопка прямоугольника

{

if(IsDlgButtonChecked(hwnd,IDC_CHECK2)) //и она отмечена

{

r->Run();//то запустить движение прямоугольника

}

else

{

r->Stop(); //иначе остановить движение прямоугольника

}

}

if(LOWORD(wparam)==IDC_CHECK3) //если нажата кнопка квадрата

{

if(IsDlgButtonChecked(hwnd,IDC_CHECK3)) //и она отмечена

{ s->Run(); //то запустить движение квадрата

}

else

{

s->Stop(); //иначе остановить движение квадрата

}

}

if(LOWORD(wparam)==IDC_CHECK4) //если нажата кнопка треугольника

{ if(IsDlgButtonChecked(hwnd,IDC_CHECK4)) //и она отмечена

{ t->Run(); //то запустить движение треугольника

} else

{ t->Stop();//иначе остановить движение треугольника

}

}

}

}

return FALSE;

}

Движение реализовано следующим кодом.

//Начало движения

void Figure::Run()

{

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

thread=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)workthread,this,NULL,&thid); //Создание нового потока

}

//остановка движения

void Figure::Stop()

{

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

TerminateThread(thread,0);

Drawer(this,RGB(255,255,255)); //убрать с окна фигуру

}

//Поток осуществляющий движение фигуры

DWORD WINAPI workthread(LPVOID param)

{

RECT rc;

Figure *lp=(Figure*)param; //Идентификатор this объекта

while(1)

{

Sleep(lp->delay); //пауза

lp->Drawer(lp,RGB(255,255,255)); //очистить старую фигуру

lp->y+=lp->dy; //приращение движения

lp->x+=lp->dx;

GetClientRect(lp->window,&rc); //получить границы окна

if(lp->x>rc.right-lp->w||lp->x<0) //если вышли за границы окна по горизонтали

{

lp->dx=-lp->dx; //то отразить

lp->x+=lp->dx;

}

if(lp->y>rc.bottom-lp->h||lp->y<0) //если вышли за границы окна по вертикали

{

lp->dy=-lp->dy; //то отразить

lp->y+=lp->dy;

}

lp->Drawer(lp,lp->color); //вывести новое изображение фигуры

}

return 0;

}

Рисование фигуры.

void Circle::Drawer(Figure *lp,COLORREF col)

{

HDC hdc=GetDC(lp->window); //получить контекст окна

HPEN pen=CreatePen(PS_SOLID,5,col); //создать кисть нужного цвета

SelectObject(hdc,pen); //выбрать кисть в контекст

Ellipse(hdc,lp->x,lp->y,lp->x+lp->w,lp->y+lp->h); //рисование фигуры

DeleteObject(pen); //удаление созданной кисти

ReleaseDC(lp->window,hdc); //освободить контект окна

}

4. Тестирование

Последним этапом создания программного продукта является его тестирование и отладка. В ходе тестирования программы выявляются все ее недостатки и особенности работы. Обнаруженные недостатки устраняются в ходе отладки.

Рис. 4 Стартовое окно программы.

Рис.5 Немодальное диалоговое окно выбора фигуры.

В данном окне пользователь должен отметить фигуры, которые должны двигаться. Так же в этом окне можно снять метки с фигур, тем самым прекаратить их движение.

Рис. 6 Движение только круга.

Рис. 7 Движение круга и прямоугольника.

Рис. 8 Движение круга, прямоугольника и квадрата.

Рис. 9 Движение круга, прямоугольника, квадрата и треугольника.

Рис. 10 Движение круга, прямоугольника, квадрата и треугольника.

Рис. 11 Движение круга, квадрата и треугольника.

Показана возможность удаления одной фигуры.

Рис. 12 Движение квадрата и треугольника.

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

Результат тестирования: в ходе тестирования программы недостатков, влияющих на правильную работу приложения, не выявлено.

Данная программа тестировалась на компьютере следующей конфигурации:

Процессор: AMD A6-3420M APU with Radeon(tm) HD Graphics 1.50 GHz

Установленная память (ОЗУ): 4,00 ГБ

Тип системы: 64-разрядная операционная система

ОС Windows 7 x86 с поддержкой x64 приложений.