Читайте также: |
|
Цели работы:
написать работоспособную программу, попрактиковаться в работе с 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 | | | Финансирование инвестиций |