
- •1. Анализ технического задания 12
- •Int fnPenStyle, // стиль пера 13
- •Int nWidth, // ширина пера 13
- •Int nxStart, int nyStart, // начальная точка 15
- •Int nxEnd, int nyEnd, // конечная точка 15
- •If(IsDlgButtonChecked(hwnd,idc_check1))//и она отмечена 21
- •4. Тестирование 25
- •2. Проектирование структуры классов
- •5. Руководство по програмному продукту
- •5.1. Руководство программиста
- •5.2 Руководство администратора
- •5.3 Руководство пользователя
- •Список литературы
- •42 Миву 230700.62-00.000 пз
5.3 Руководство пользователя
Для запуска приложения нужно открыть файл figures.exe. После этого появится главное окно программы, на котором находятся фигуры которые можно добвить.
Для добавления фигуры в окно window необходимо выделить нужную фигуру в немодальном диалоговом окне (фигуры) после чего она появится и начнет свое движение.
Для удаленяи фигуры из окна нужно снять метку с нужной фигуры в немодальном диалоговом окне (фигуры) после чего она пропадет из окна window.
Рекомендуемые требования к компьтеру:
- ЦП x64 с тактовой частотой 1ГГц
- Объем оперативной памяти 1 Гб
- Графический процессор с поддержкой DirectX 9 и 128 МБ памяти.
- Windows 7/XP
- .NET FrameWork 4.0
Требования составлялись на основе требования ОС Windows 7, т.к. программа предназначена для работы в этой ОС.
Заключение
В данной курсовой работе были углублены знания, полученные в ходе лекционных и практических занятий. Получены навыки самостоятельной работы по формализации поставленной задачи, программированию, тестированию и отладке задач на ПЭВМ. Получены базовые навыки при разработке объектно-ориентированных программ. Разработана программа в котрой осуществлено движение простых геометрических фигур таких как квадрат, круг, прямоугольник и треугольник. Предусмотрена возможность имитации движения как одного, так и нескольких объектов одновременно.
В дальнейшем разработанную программу можно развить, например, увеличить количество фигур, осуществить отталкивание фигур друг от друга, сделать фигуры полностью закрашенными.
Проект отвечает тем требованиям, которые были предъявлены к нему в ходе разработки, а именно использовании структуры классов, наглядности и удобству в использовании.
Список литературы
Графический интерфейс GDI в Microsoft Windows © А.В.Фролов, Г.В.Фролов Том 4, М.: Диалог-МИФИ, 1993, 288 стр.
Учебно-методическое пособие по дисцеплине (электронный вариант)
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; //закончить программу
}