@King_Of_Demons
Студент

Как при помощи клавишь перемещения вниз, вверх, влево, вправо, управлять кривой Безье?

Помогите написать программу, которая отображает кривую Безье, используя стандартные функции GDI, и кривую Безье, отображаемую при вычислении формул. Одну из кривых можно перемещать с помощью клавиш ← (влево), ↑ (вверх), → (вправо), ↓ (вниз). Также должны быть предоставлены клавишы для поворота этой кривой. Измените вторую кривую так, чтобы контрольные точки можно было перемещать, изменяя форму кривой в реальном времени.

Программу частично написал, то есть окно создается и выводится кривая Безье используя стандартные функций GDI, так же через switch написал обработчики клавиш. Пробовал до этого прямоугольник перемещать но окно закрывается. Если закомментировать VM_DESTROY то окно остается, но нечего не движется. С остальным я не знаю что делать и как, с WINAPI не знаком, его повесили на шею в универе. Помогите кто может.

#include <algorithm>
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>

static TCHAR szWindowClass[] = _T("DesktopApp");
static TCHAR szTitle[] = _T("Lab2");




LRESULT CALLBACK WindowsProcess(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
	MSG lpMsg;
	WNDCLASS w;

	w.lpszClassName = szTitle;  //program name
	w.hInstance = hInstance; //current app token
	w.lpfnWndProc = WindowsProcess;//windows function pointer
	w.hCursor = LoadCursor(nullptr, IDC_ARROW);
	w.hIcon = nullptr;
	w.lpszMenuName = nullptr;
	w.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
	w.style = CS_HREDRAW | CS_VREDRAW;
	w.cbClsExtra = 0;
	w.cbWndExtra = 0;

	//if can`t register window class - exit
	if (!RegisterClass(&w))
	{
		MessageBox(nullptr,
			_T("Call to RegisterClassEx failed!"),
			_T("Windows Desktop Guided Tour"),
			NULL);
		return 1;
	}

	//create window in memory, fill arg CreateWindow
	const HWND h_wnd = CreateWindow(
		szTitle,
		L"GDI Win32 API", //window title
		WS_OVERLAPPEDWINDOW, //window style
		250, //window position х
		250, //window position y
		640, //width
		640, //high
		// ReSharper disable once CppCStyleCast
		(HWND)NULL, //parent window token
		// ReSharper disable once CppCStyleCast
		(HMENU)NULL, //menu token
		static_cast<HINSTANCE>(hInstance), // program exemplar token
		// ReSharper disable once CppCStyleCast
		(HINSTANCE)NULL); //no other parameter

	//show window from memory
	ShowWindow(h_wnd, nCmdShow);

	//update window content
	UpdateWindow(h_wnd);

	//message loop
	while (GetMessage(&lpMsg, nullptr, 0, 0))
	{
		TranslateMessage(&lpMsg);
		DispatchMessage(&lpMsg);
	}
	UnregisterClass(szWindowClass, hInstance);
	return (int)lpMsg.wParam;
}


//window function
LRESULT CALLBACK WindowsProcess(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)
{
	HDC hdc = nullptr; //create device context
	PAINTSTRUCT ps;  //create exemplar of graphic input struct
	POINT points[4] = { 20, 40, 320, 200, 330, 110, 450, 40 };

	//int a = 100, b = 200, c = 400, d = 400;


	//message loop
	switch (messg)
	{
		//draw message
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		PolyBezier(hdc, points, 4);
		EndPaint(hWnd, &ps);
		break;
	case WM_KEYDOWN:
		switch (wParam)
		{
		case VK_LEFT:
		{
			//Rectangle(hdc, a - 10, b, c - 10, d);
			//InvalidateRect(hWnd, nullptr, TRUE);
		}
			break;

		case VK_RIGHT:
		{
			//Rectangle(hdc, a + 10, b, c + 10, d);
			//InvalidateRect(hWnd, nullptr, TRUE);
		}
			break;

		case VK_UP:
		{
			//Rectangle(hdc, a, b + 10, c, d + 10);
			//InvalidateRect(hWnd, nullptr, TRUE);
		}
			break;

		case VK_DOWN:
		{
			//Rectangle(hdc, a, b - 10, c, d - 10);
			//InvalidateRect(hWnd, nullptr, TRUE);
		}
			break;

		}
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return(DefWindowProc(hWnd, messg, wParam, lParam));
	}
	return 0;
}
  • Вопрос задан
  • 42 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы