Member 13118935 Ответов: 1

Пожалуйста, позвольте мне исправить ug в программе


Вот в этой программе когда я меняюсь
bar[19].y - 20
к
bar[19].y + 20
прямоугольник теперь меняется на белый лист, движущийся вверх, а не на прямоугольник, движущийся вверх.В чем ошибка в коде, пожалуйста, дайте мне знать?Спасибо.

Что я уже пробовал:

#ifndef UNICODE
#define UNICODE
#endif 

#include<windows.h>
#include<string.h>
int px = 100, py = 100,i = 0;
POINT m;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void check();
struct box { int x; int y; int width; }bar[20];
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
	// Register the window class.
	const wchar_t CLASS_NAME[] = L"Game";

	WNDCLASS wc = {};

	wc.lpfnWndProc = WindowProc;
	wc.hInstance = hInstance;
	wc.lpszClassName = CLASS_NAME;
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	RegisterClass(&wc);

	// Create the window.

	HWND hwnd = CreateWindowEx(
		0,                              // Optional window styles.
		CLASS_NAME,                     // Window class
		L"Catch Me If You Can",    // Window text
		WS_OVERLAPPEDWINDOW,            // Window style

										// Size and position
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

		NULL,       // Parent window    
		NULL,       // Menu
		hInstance,  // Instance handle
		NULL        // Additional application data
	);

	if (hwnd == NULL)
	{
		return 0;
	}

	ShowWindow(hwnd, nCmdShow);

	// Run the message loop.
	MSG msg = {};
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 0;
}
void check()
{
	GetCursorPos(&m);
	if (m.x <10 && m.y <10) { px = 250; py = 250; }
	
}


LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	HBRUSH cr = CreateSolidBrush(RGB(250, 125, 50));
	HBRUSH wr = CreateSolidBrush(RGB(255,255,255));
	HBRUSH bkfill = CreateSolidBrush(RGB(230, 230, 230));
	HANDLE hold;
	HPEN pen = CreatePen(PS_NULL, 0, 1);
	switch (uMsg)
	{
	//case WM_CREATE:
		
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	case WM_PAINT:
	{
		//InvalidateRect(hwnd, 0, TRUE);
		//px = 100, py = 100,i=0;
		
		hdc = BeginPaint(hwnd, &ps);
		SendMessage(hwnd, WM_CREATE, NULL, NULL);
		FillRect(hdc, &ps.rcPaint, cr);
		SelectObject(hdc, pen);
		for (i = 0; i < 20; i++)
		{
			bar[i].y = 100 + i * 20;
			bar[i].width = 2 * (i + 1) * 150 / 20;
			bar[i].x = 250-bar[i].width/2;         //or we could use  bar[i].x = 350-(i+1)*150/20;
		}
		SelectObject(hdc, wr);
		Rectangle(hdc, bar[1].x, bar[1].y, bar[1].x + bar[1].width, bar[1].y - 20);
		while (bar[19].y != 30)
		{
			SelectObject(hdc, cr);
			Rectangle(hdc, bar[19].x, bar[19].y--, bar[19].x + bar[19].width, bar[19].y - 20);
			SelectObject(hdc, wr);
			Rectangle(hdc, bar[19].x, bar[19].y, bar[19].x + bar[19].width, bar[19].y - 20);
			Sleep(4);
		}
		/*for (i = 0; i < 20; i++)
			Rectangle(hdc, bar[i].x, bar[i].y, bar[i].x + bar[i].width, bar[i].y + 20);*/
		EndPaint(hwnd, &ps);
	}
   
	}
	
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

1 Ответов

Рейтинг:
0

KarstenK

С этим изменением вы придаете прямоугольнику другой вид подписанный высота и так нижняя линия рисуется с другой стороны.

Если вы хотите переместить прямоугольник, вы должны изменить координату y начала координат, а не высоту.

Поиграйте немного с функцией прямоугольника, чтобы лучше визуализировать изменения.