Новичок
Джуниор
Регистрация: 05.07.2016
Сообщений: 1
|
Написать программу, проверяющую умение оператора пользоваться манипулятором "мышь" - C++ WinAPI
Помогите пожалуйста советом. У меня задание написать программу, проверяющую умение оператора пользоваться манипулятором "мышь". Содержание программы: на экране расположена дорожка, по которой необходимо провести шар - курсор "мыши". Выход за пределы дорожки от старта до финиша считается проигрышем. Предусмотреть несколько уровней сложности программы, отличающиеся друг от друга шириной и извилистостью дорожки.
Вот то что есть, посмотрите пожалуйста. Есть вопрос, как сделать чтобы программа работала только после нажатия на кнопку старт?
Код:
#include <Windows.h>
#include <gdiplus.h>
#include <iostream>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;
using namespace std;
#define widht 800 //по иксу
#define height 600 //по игреку
#define ID_BUTTON_1 3000
HWND hBtn;
HWND hWnd;
VOID OnPaint(HDC hdc) //функциия для вывода текста
{
Graphics graphics(hdc);
SolidBrush brush(Color::White);
FontFamily fontFamily(L"Times New Roman");
Font font(&fontFamily, 24, FontStyleRegular, UnitPixel);
Font font1(&fontFamily, 20, FontStyleRegular, UnitPixel);
PointF pointF(300.0f, 0.0f);
PointF pointF1(5.0f,535.0f);
graphics.DrawString(L"Maze Mouse", -1, &font, pointF, &brush);
graphics.DrawString(L"Esc - exit", -1, &font1, pointF1, &brush);
}
VOID DrawRectangle(HDC hdc) // функция прорисовки лабиринта
{
Graphics graphics(hdc);
GraphicsPath path;
Pen pen(Color::Black, 2);
SolidBrush brush(Color::White);
path.AddRectangle(Rect(0, 50, 150, 200));
path.AddRectangle(Rect(150, 70, 500, 60));
path.AddRectangle(Rect(650, 70, 30, 400));
path.AddRectangle(Rect(350, 400, 300, 70));
path.AddRectangle(Rect(310, 180, 40, 290));
path.AddEllipse(321,198,20,20);
graphics.DrawPath(&pen, &path);
graphics.FillPath(&brush, &path);
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
WORD move(WORD a, WORD b);
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) // главная функция, аналог main
{
WNDCLASSEX windowClass;
MSG uMsg;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
memset(&windowClass, 0, sizeof(WNDCLASSEX));
windowClass.cbSize = sizeof(WNDCLASSEX); //размер окна
windowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //цвет фона
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // вид курсора
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //иконка окна
windowClass.hInstance = hInstance;
windowClass.lpfnWndProc = WindowProc;
windowClass.lpszClassName = "Maze Mouse";
RegisterClassEx(&windowClass);
//Основное мен
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
hWnd = CreateWindow(windowClass.lpszClassName, "Maze Mouse", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
(GetSystemMetrics(SM_CXSCREEN) - widht) / 2, (GetSystemMetrics(SM_CYSCREEN) - height) / 2, widht, height, NULL, NULL, NULL, NULL);
ShowWindow(hWnd, nCmdShow);
while (GetMessage(&uMsg, hWnd,NULL,NULL))
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
GdiplusShutdown(gdiplusToken);
DestroyWindow(hWnd); // Уничтожаем основное окно
//UnregisterClass(windowClass, NULL); // Освобождаем память, отменяя регистрацию класса основного окна.
return uMsg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
switch (uMsg)
{
case WM_CLOSE:
ExitProcess(0);
break;
case WM_PAINT://Рисование и надписи
hDC = BeginPaint(hWnd, &ps);
OnPaint(hDC);
DrawRectangle(hDC);
EndPaint(hWnd, &ps);
break;
case WM_KEYDOWN://закрытие программы Esc
switch (wParam)
{
case VK_ESCAPE:
exit(0);
break;
}
return 0;
case WM_SIZE:
case WM_EXITSIZEMOVE:
{
break;
}
case WM_LBUTTONDOWN://координаты курсора мыши
{
WORD xPos, yPos, nSize;
TCHAR szBuf[80];
// Сохраняем координаты курсора мыши
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
hDC = GetDC(hWnd);
// Подготавливаем текстовую строку, содержащую
// координаты курсора мыши
nSize = wsprintf(szBuf, TEXT("(%d, %d)"), xPos, yPos);
// Выводим координаты курсора мыши
// в точке, соответствующей положению
// курсора мыши
TextOut(hDC, xPos, yPos, szBuf, nSize);
ReleaseDC(hWnd, hDC);
return 0;
}
case WM_CREATE:
hBtn = CreateWindowEx(NULL, "button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 33, 205, 70, 30, hWnd, (HMENU)1, NULL, NULL);
break;
case WM_MOUSEMOVE:
{
WORD xMousePos, yMousePos;
xMousePos = LOWORD(lParam);
yMousePos = HIWORD(lParam);
//move(xMousePos, yMousePos);
hDC = GetDC(hWnd);
if (((((((((((((xMousePos > 0.0 && xMousePos < 150.0) && yMousePos == 50.0)) || ((xMousePos == 150.0 && (yMousePos > 50.0 && yMousePos < 70.0))) || ((xMousePos > 150.0 && xMousePos < 680.0) && yMousePos == 70.0)) ||
((xMousePos == 680.0 && (yMousePos > 70.0 && yMousePos < 470.0))) || ((xMousePos > 310.0 && xMousePos < 680.0) && yMousePos == 470.0)) || ((xMousePos == 310.0 && (yMousePos > 180.0 && yMousePos < 470.0)))) ||
(((xMousePos > 310.0 && xMousePos < 350.0) && yMousePos == 180.0))) || ((xMousePos == 350.0 && (yMousePos > 180.0 && yMousePos < 400.0)))) ||
(((xMousePos > 350.0 && xMousePos < 650.0) && yMousePos == 400.0))) || ((xMousePos == 650.0 && (yMousePos > 130.0 && yMousePos < 400.0)))) ||
(((xMousePos > 150.0 && xMousePos < 650.0) && yMousePos == 130.0))) || ((xMousePos == 150.0 && (yMousePos > 130.0 && yMousePos < 250.0)))) ||
(((xMousePos > 0.0 && xMousePos < 150.0) && yMousePos == 250.0)))
{
MessageBox(hWnd, "\t Lose! Restart?", "Game over", MB_OKCANCEL);
}
if ((xMousePos >310.0 && xMousePos <350.0) && yMousePos == 220.0)
{
MessageBox(hWnd, "YOU WIN", "Win", MB_OK);
}
ReleaseDC(hWnd, hDC);
break;
InvalidateRect(hWnd, NULL, true); // перерисовываем окно
return 0;
}
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}
|