View difference between Paste ID: Zpe8mC5k and kmf9DWQD
SHOW: | | - or go back to the newest paste.
1
#pragma warning(disable:4996)
2
#undef UNICODE
3
#include <windows.h>
4
#include "KWnd.h"
5
6
#define _USE_MATH_DEFINES
7
#include <cmath>
8
const int WIDTH = 314;
9
const int HEIGHT = 200;
10
11
void updateRegion(HRGN& hRgn, int left, int top, int right, int bottom);
12
13
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
14
15
const int INTERVAL = 50;
16
17
//bool isOdd(int i);
18
19
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
20
{
21
	MSG msg;
22
	KWnd mainWnd("MyWin", hInstance, nCmdShow, WndProc);
23
	while (GetMessage(&msg, NULL, 0, 0))
24
	{
25
		TranslateMessage(&msg);
26
		DispatchMessage(&msg);
27
	}
28
	return (msg.wParam);
29
}
30
31
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
32
{
33
	PAINTSTRUCT ps;
34
	HDC hDC;
35
	//coordinates
36
	static int sx, sy;
37
	static int x_scr, y_scr;
38
	double x;
39
	//ball coord 
40
	//timer t
41
	static bool paused = false;
42
	static int t = 0;
43
	//pens
44
	static HPEN hPenAxis, hPenGraphic;
45
	//brush
46
	static HBRUSH hBrushYellow;
47
	//regions
48
	static HRGN ellipse;
49
	//angle for ball
50
	static double ballAngle = -M_PI;
51
	//direction
52
	static bool forward = true;
53
54
	switch (message) {
55
	case WM_CREATE:
56
		//create pens
57
		hPenAxis = CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
58
		hPenGraphic = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
59
		//create brush
60
		hBrushYellow = CreateSolidBrush(RGB(255, 165, 0));
61
		//create timer
62
		SetTimer(hWnd, 1, INTERVAL, NULL);
63
		//create rgn
64
		ellipse = CreateEllipticRgn(sx, sy, sx, sy);
65
		break;
66
	case WM_SIZE:
67
		sx = LOWORD(lParam);
68
		sy = HIWORD(lParam);
69
		break;
70
	case WM_PAINT:
71
		//begin paint
72
		hDC = BeginPaint(hWnd, &ps);
73
		//set modes
74
		SetMapMode(hDC, MM_ANISOTROPIC);
75
		SetWindowExtEx(hDC, 2 * WIDTH, -2 * HEIGHT, NULL);
76
		SetViewportExtEx(hDC, 3 * sx / 4, 3 * sy / 4, NULL);
77
		SetViewportOrgEx(hDC, sx / 2, sy / 2, NULL);
78
		//draw axis
79
		SelectObject(hDC, hPenAxis);
80
		MoveToEx(hDC, -WIDTH, 0, NULL);
81
		LineTo(hDC, WIDTH, 0);
82
		MoveToEx(hDC, 0, HEIGHT, NULL);
83
		LineTo(hDC, 0, -HEIGHT);
84
		//draw graphic
85
		SelectObject(hDC, hPenGraphic);
86
		MoveToEx(hDC, -WIDTH, 0, NULL);
87
		for (x = -M_PI, x_scr = -WIDTH; x < M_PI; x += 0.02, x_scr += 2)
88
		{
89
			y_scr = HEIGHT * sin(x);
90
			LineTo(hDC, x_scr, y_scr);
91
		}
92
		//draw ball
93
		SelectObject(hDC, hBrushYellow);
94
		x_scr = t - WIDTH;
95
		y_scr = HEIGHT * sin(ballAngle);
96
		updateRegion(ellipse, x_scr - 15, y_scr - 15, x_scr + 15, y_scr + 15);
97
		FillRgn(hDC, ellipse, hBrushYellow);
98
		EndPaint(hWnd, &ps);
99
		break;
100
	case WM_RBUTTONDOWN:
101
		paused = !paused;
102
		break;
103
	case WM_TIMER:
104
		if (!paused)
105
		{
106
			if (forward)
107
			{
108
				t += 3;
109
				ballAngle += 0.03;
110
			}
111
			else if (!forward)
112
			{
113
				t -= 3;
114
				ballAngle -= 0.03;
115
			}
116
			if (t >= 2 * WIDTH) {
117
				forward = false;
118
			}
119
			else if (t <= 0) {
120
				forward = true;
121
			}
122
			InvalidateRgn(hWnd, NULL, true);
123
		}
124
			break;
125
		case WM_DESTROY:
126
			//delete pens
127
			DeleteObject(hPenAxis);
128
			DeleteObject(hPenGraphic);
129
			//delete brush
130
			DeleteObject(hBrushYellow);
131
			//delete timer
132
			KillTimer(hWnd, 1);
133
			//delete rgn
134
			DeleteObject(ellipse);
135
			PostQuitMessage(0);
136
			break;
137
		default: return DefWindowProc(hWnd, message, wParam, lParam);
138
	}
139
	return 0;
140
}
141
142
void updateRegion(HRGN& hRgn, int left, int top, int right, int bottom) {
143
	DeleteObject(hRgn);
144
	hRgn = CreateEllipticRgn(left, top, right, bottom);
145
}