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

5.3 Руководство пользователя

Для запуска приложения нужно открыть файл figures.exe. После этого появится главное окно программы, на котором находятся фигуры которые можно добвить.

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

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

Рекомендуемые требования к компьтеру:

- ЦП x64 с тактовой частотой 1ГГц

- Объем оперативной памяти 1 Гб

- Графический процессор с поддержкой DirectX 9 и 128 МБ памяти.

- Windows 7/XP

- .NET FrameWork 4.0

Требования составлялись на основе требования ОС Windows 7, т.к. программа предназначена для работы в этой ОС.

Заключение

В данной курсовой работе были углублены знания, полученные в ходе лекционных и практических занятий. Получены навыки самостоятельной работы по формализации поставленной задачи, программированию, тестированию и отладке задач на ПЭВМ. Получены базовые навыки при разработке объектно-ориентированных программ. Разработана программа в котрой осуществлено движение простых геометрических фигур таких как квадрат, круг, прямоугольник и треугольник. Предусмотрена возможность имитации движения как одного, так и нескольких объектов одновременно.

В дальнейшем разработанную программу можно развить, например, увеличить количество фигур, осуществить отталкивание фигур друг от друга, сделать фигуры полностью закрашенными.

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

Список литературы

  1. Графический интерфейс GDI в Microsoft Windows © А.В.Фролов, Г.В.Фролов Том 4, М.: Диалог-МИФИ, 1993, 288 стр.

  2. Учебно-методическое пособие по дисцеплине (электронный вариант)

  3. MSDN msdn.microsoft.com

Приложение

Листинг программы

figure.h

#include <windows.h>

//Базовый абстрактный класс фигуры

class Figure

{

DWORD thid; //идентификатор потока

HANDLE thread; //Хэндл потока

public:

Figure(HWND hwnd,COLORREF c, int); //конструктор

void Run(void); //двигато фигуру

void Stop(void); //остановить фигуру

virtual void Drawer(Figure *lp,COLORREF col)=0; //вирутальная функция вывода фигуры.

HWND window; //хэндл окна в котором двигается фигура

COLORREF color; //цвет фигуры

int x,y; //координаты верхнего левого угла

int w,h; //размеры фигуры

int dx,dy; //приращения при движении

int delay; //задержка при движении

};

//класс-наследник окружность

class Circle:public Figure

{

void Drawer(Figure *lp,COLORREF col); //функция рисованеия фигуры

public:

Circle(HWND hwnd,COLORREF c, int size=100):Figure(hwnd,c,size){} //наследование конструктора

};

//класс-наследник прямоугольник

class Rect:public Figure

{

void Drawer(Figure *lp,COLORREF col); //функция рисованеия фигуры

public:

Rect(HWND hwnd,COLORREF c, int size=100):Figure(hwnd,c,size){h/=2;} //наследование конструктора У прямоугольника уменьшить высоту в 2 раза

};

//класс-наследник квадрат

class Square:public Figure

{

void Drawer(Figure *lp,COLORREF col); //функция рисованеия фигуры

public:

Square(HWND hwnd,COLORREF c, int size=100):Figure(hwnd,c,size){} //наследование конструктора

};

//класс-наследник треугольник

class Triangle:public Figure

{

void Drawer(Figure *lp,COLORREF col); //функция рисованеия фигуры

public:

Triangle(HWND hwnd,COLORREF c, int size=100):Figure(hwnd,c,size){} //наследование конструктора

};

resource.h

//{{NO_DEPENDENCIES}}

// Microsoft Visual C++ generated include file.

// Used by res.rc

//

#define IDD_DIALOG1 101

#define IDC_CHECK1 1001

#define IDC_CHECK2 1002

#define IDC_CHECK3 1003

#define IDC_CHECK4 1004

// Next default values for new objects

//

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE 102

#define _APS_NEXT_COMMAND_VALUE 40001

#define _APS_NEXT_CONTROL_VALUE 1002

#define _APS_NEXT_SYMED_VALUE 101

#endif

#endif

figure.cpp

#include "figure.h"

#include <stdlib.h>

#include <time.h>

DWORD WINAPI workthread(LPVOID param);

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

Figure::Figure(HWND hwnd,COLORREF c, int size=100)

{

window=hwnd; //Инициализация членов класса

w=size;

h=size;

x=0;

y=0;

dx=rand()%20-10;

dy=rand()%20-10;

delay=50;

color=c;

}

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

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); //освободить контект окна

}

//вывод прямоугольника

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

{

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

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

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

Rectangle(hdc,lp->x,lp->y,lp->x+lp->w,lp->y+lp->h); //рисование прямоугольника

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

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

}

//вывод квадрата

void Square::Drawer(Figure *lp,COLORREF col) //получить контекст окна

{ //создать кисть нужного цвета

HDC hdc=GetDC(lp->window); //выбрать кисть в контекст

HPEN pen=CreatePen(PS_SOLID,5,col); //рисование квадрата

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

Rectangle(hdc,lp->x,lp->y,lp->x+lp->w,lp->y+lp->h); //освободить контект окна

DeleteObject(pen);

ReleaseDC(lp->window,hdc);

}

//вывод треугольника

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

{

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

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

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

MoveToEx(hdc,lp->x,lp->y+lp->h,NULL); //рисование треугольника

LineTo(hdc,lp->x+lp->w,lp->y+lp->w);

LineTo(hdc,lp->x+lp->w/2,lp->y);

LineTo(hdc,lp->x,lp->y+lp->h);

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

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

}

main.cpp

#include <windows.h>

#include <stdlib.h>

#include <time.h>

#include "resource.h"

#include "figure.h"

HWND dlg; //Хэндлы дочерних окон

HINSTANCE hinst; //Инстанция программы

Figure *c,*r,*t,*s; //указатели на фигуры

//Оконная процедура

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;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)

{

switch (Message) //проверяем сообщения

{

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

{

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

ShowWindow(dlg,SW_SHOWNORMAL); //показать его

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

}

case WM_CLOSE: //Уничтожение окна

{

PostQuitMessage(0); //Закрываем окно

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

}

}

return DefWindowProc(hwnd,Message,wparam,lparam);//для других сообщений стандартный обработчик

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)

{

HWND hwnd; //Хэндл окна

MSG msg; //сруктура для очереди сообщений

WNDCLASS w; //класс окна

hinst=hInstance;

srand((unsigned)time(NULL)); //инициализация генератора случайных чисел

memset(&w,0,sizeof(WNDCLASS)); //очищаем класс окна

w.style = CS_HREDRAW | CS_VREDRAW; //стиль окна

w.lpfnWndProc = WndProc; //оконная процедура

w.hInstance = hInstance; //Инстанция программы

w.hbrBackground = (HBRUSH)(HBRUSH)GetStockObject(WHITE_BRUSH); //фон окна

w.hCursor=LoadCursor(NULL,IDC_ARROW); //стандартный курсор

w.lpszClassName = L"C Windows"; //Название класса

RegisterClass(&w); //Регистрация класса окна

hwnd = CreateWindowEx(NULL,L"C Windows",L"Window", WS_OVERLAPPEDWINDOW,//создать стандартное окно

CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);//в центре экрана

//создание объектов фигур

c= new Circle(hwnd,RGB(255,0,0));

r= new Rect(hwnd,RGB(0,255,0));

s= new Square(hwnd,RGB(0,0,255));

t= new Triangle(hwnd,RGB(255,255,0));

ShowWindow(hwnd,SW_SHOWNORMAL); //показать окно

UpdateWindow(hwnd); //обновить окно

//стандартная очередь сообщений

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam; //закончить программу

}