Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Ярославль 2011

Читайте также:
  1. Программа « Ярославль купеческий » - 5 часов , 5 музеев
  2. Ярославль 2011
  3. Ярославль 2011

Цели работы:

 

написать работоспособную программу, попрактиковаться в работе с Windows API, сдать работу.

 

 

Задание:

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

Выполнение:

пришёл, увидел, написал.

Блок-схема:

 
 




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

для получения результата, пользователь должен вызвать программу после чего откроется окно, в котором дользователь может осуществлять действия, а именно:

создавать до десяти фигур — пользователь нажимает на соответствующую фигуре функциональную клавишу на клавиатуре (F1 – равносторонний треугольник, F6 — прямоугольный треугольник, и F8 — равнобедренный треугольник), и кликает мышкой в области окна в том месте где нужно нарисовать фигуру, после чего она появляется, и становится активной.

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

передвигать фигуры — пользователь кликает мышкой в произвольном месте окна, после чего на это место перемещается активная на данный момент фигура, если она существует.

перемещатся между фигурами (менять/выбирать активную фигуру) — пользователь нажимает на стрелки «вправо» и «влево» на клавиатуре, в результате активной становится следующая или предидущая по порядку фигура соответственно, если существует не менее двух фигур.

если существует только одна фигура она всегда будет активной.

Код:

//my figures is 6, 8, 1

 

#include <windows.h>

#include <math.h>

 

int r = 100 /* радиус окружности в которую вписаны фигуры */, n = 10 /* колличество фигур */, figures[10][4] /* массив фигур */, i, k = -1 /* порядковый номер активной фигуры в массиве */;

double pi = 3.1415;

 

LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HDC hDC;

PAINTSTRUCT ps;

RECT rect;

int x, y;

 

 

switch (uMsg)

{

case WM_KEYUP: //обработка нажатий на клавиши

if (wParam == VK_F1) //F1

{

i = k;

do {

k++;

} while (figures[k][0] && k < n);

if (k == n && figures[k][0])

{

k = -1;

do {

k++;

} while (figures[k][0] && k < i);

}

if (!figures[k][0])

figures[k][0] = 1;

}

else if (wParam == VK_F6) //F6

{

i = k;

do {

k++;

} while (figures[k][0] && k < n);

if (k == n && figures[k][0])

{

k = -1;

do {

k++;

} while (figures[k][0] && k < i);

}

if (!figures[k][0])

figures[k][0] = 6;

}

else if (wParam == VK_F8) //F8

{

i = k;

do {

k++;

} while (figures[k][0] && k < n);

if (k == n && figures[k][0])

{

k = -1;

do {

k++;

} while (figures[k][0] && k < i);

}

if (!figures[k][0])

figures[k][0] = 8;

}

 

if (wParam == VK_LEFT) //стрелка курсора «влево»

{

if (k > -1)

{

i = k;

do {

k--;

} while (k > -1 &&!figures[k][0]);

if (k <= -1)

{

k = n;

do {

k--;

} while (k > i &&!figures[k][0]);

}

if (!figures[k][0])

k = -1;

}

}

else if (wParam == VK_RIGHT) //стрелка курсора «враво»

{

if (k > -1)

{

i = k;

do {

k++;

} while (k < n &&!figures[k][0]);

if (k >= n)

{

k = -1;

do {

k++;

} while (k < i &&!figures[k][0]);

}

if (!figures[k][0])

k = -1;

}

}

else if (wParam == VK_DELETE) //delete

if (k > -1)

{

if (figures[k][0])

figures[k][0] = 0;

i = k;

do {

k++;

} while (k < n &&!figures[k][0]);

if (k >= n)

{

k = -1;

do {

k++;

} while (k < i &&!figures[k][0]);

}

if (!figures[k][0])

k = -1;

GetClientRect (hWnd, &rect);

InvalidateRect (hWnd, &rect, -1);

UpdateWindow (hWnd);

}

break;

 

case WM_LBUTTONDOWN: //обработка нажатия на левую кнопку мыши

x = LOWORD (lParam);

y = HIWORD (lParam);

figures[k][2] = y;

figures[k][1] = x;

figures[k][3] = 1;

GetClientRect (hWnd, &rect);

InvalidateRect (hWnd, &rect, -1);

UpdateWindow (hWnd);

break;

case WM_PAINT: //блок рисования

hDC = BeginPaint (hWnd, &ps);

for (i = 0; i < n; i++)

{

if (figures[i][0] == 1 && figures [i][3]) //равнобедренный треугольник

{

MoveToEx (hDC, figures[i][1], figures[i][2] - r, NULL);

LineTo (hDC, figures[i][1] + r*cos(pi/6), figures[i][2] + r*sin(pi/6));

LineTo (hDC, figures[i][1] - r*cos(pi/6), figures[i][2] + r*sin(pi/6));

LineTo (hDC, figures[i][1], figures[i][2] - r);

}

else if (figures[i][0] == 6 && figures [i][3]) //прямоугольный треугольник

{

MoveToEx (hDC, figures[i][1] + r, figures[i][2], NULL);

LineTo (hDC, figures[i][1] - r, figures[i][2]);

LineTo (hDC, figures[i][1] + r*cos(pi/3), figures[i][2] - r*sin(pi/3));

LineTo (hDC, figures[i][1] + r, figures[i][2]);

}

else if (figures[i][0] == 8 && figures [i][3]) //равнобедренный треугольник

{

MoveToEx (hDC, figures[i][1], figures[i][2] - r - r*2/3, NULL);

LineTo (hDC, figures[i][1] - 2*r*sin(pi/12), figures[i][2] + r/6);

LineTo (hDC, figures[i][1] + 2*r*sin(pi/12), figures[i][2] + r/6);

LineTo (hDC, figures[i][1], figures[i][2] - r - r*2/3);

}

}

EndPaint (hWnd, &ps);

break;

case WM_CLOSE:

DestroyWindow (hWnd);

break;

case WM_DESTROY:

PostQuitMessage (0);

break;

default:

return DefWindowProc (hWnd, uMsg, wParam, lParam);

}

return 0;

}

 

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

{

HWND hMainWnd;

char szClassName[] = "mein_class";

MSG msg;

WNDCLASSEX wc;

 

wc.cbSize = sizeof (wc);

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = HBRUSH (COLOR_WINDOW);

wc.lpszMenuName = NULL;

wc.lpszClassName = szClassName;

wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

 

if (!RegisterClassEx(&wc)) //сообщение об ошибке

{

MessageBox (NULL, "Sorry, I didn't can register class^^", "Error", MB_OK);

return 0;

}

 

hMainWnd = CreateWindow

(

szClassName,

"Pib",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

0,

CW_USEDEFAULT,

0,

(HWND)NULL,

(HMENU)NULL,

(HINSTANCE)hInstance,

NULL

);

 

if (!hMainWnd) //сообщение об ошибке

{

MessageBox (NULL, "Sorry, I didn't can create window^^", "Error", MB_OK);

return 0;

}

 

ShowWindow (hMainWnd, nCmdShow);

 

for (i = 0; i < n; i++) //инициализация массива фигур

{

figures[i][0] = 0; //нулевой тип означает отсутствие фигуры

figures[i][1] = 300; //началная координата x

figures[i][2] = 200; //началная координата y

figures[i][3] = 0; //“видимость” (0 не - рисовать, всё остальное - рисовать)

}

 

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

{

TranslateMessage (&msg);

DispatchMessage (&msg);

}

 

return msg.wParam;

}


Дата добавления: 2015-10-21; просмотров: 68 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Ярославль 2011| Финансирование инвестиций

mybiblioteka.su - 2015-2024 год. (0.022 сек.)