c++windows编程:设计程序使 “圆心沿正弦曲线轨迹移动的实心圆”能够循环 往复地不断运动。圆圈到达正弦曲线的尾部,可以自动往回移动,半径改为由大变小的模式,颜色模式和先前的一样。2)点击鼠标左键,圆圈停止移动,再点击一次,圆圈继续按照上一次的方向移动。3)点击鼠标右键,圆圈可以向反方向移动,比如,原来方向向左,点击一次右键,则变为向右移动,再次点击右键,则变为向左移动
时间: 2024-02-28 20:55:17 浏览: 30
这个程序可以使用 C++ 和 Win32 API 来实现。以下是示例代码:
```c++
#include <windows.h>
#include <cmath>
// 定义程序窗口类名和标题
const char* g_szClassName = "MyWindowClass";
const char* g_szWindowTitle = "Moving Circle";
// 定义正弦曲线的参数
const int g_amplitude = 200;
const double g_frequency = 0.02;
// 定义圆心的移动速度
const int g_speed = 2;
// 定义圆心的初始位置、半径、颜色和方向
int g_x = 0;
int g_y = 0;
int g_r = 50;
COLORREF g_color = RGB(255, 255, 0);
int g_direction = 1;
// 定义标志位,表示圆圈是否在移动
bool g_moving = true;
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
// 创建窗口时初始化圆心位置
g_x = 0;
g_y = (HIWORD(lParam) - g_r) / 2;
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 绘制圆形
HBRUSH hBrush = CreateSolidBrush(g_color);
SelectObject(hdc, hBrush);
Ellipse(hdc, g_x - g_r, g_y - g_r, g_x + g_r, g_y + g_r);
DeleteObject(hBrush);
EndPaint(hwnd, &ps);
break;
}
case WM_TIMER:
// 定时器消息,更新圆心位置
if (g_moving)
{
g_x += g_speed * g_direction;
g_y = (HIWORD(lParam) - g_r) / 2 + g_amplitude * sin(g_frequency * g_x);
if (g_x > LOWORD(lParam) + g_r)
{
g_x = 0;
g_r = 50;
}
else if (g_x < -g_r)
{
g_x = LOWORD(lParam);
g_r = 50;
}
}
else
{
KillTimer(hwnd, 1);
}
InvalidateRect(hwnd, NULL, TRUE);
break;
case WM_LBUTTONDOWN:
// 左键点击,切换移动状态
g_moving = !g_moving;
if (g_moving)
{
SetTimer(hwnd, 1, 10, NULL);
}
break;
case WM_RBUTTONDOWN:
// 右键点击,切换方向
g_direction *= -1;
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
// 程序入口函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 注册窗口类
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(wc));
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszClassName = g_szClassName;
if (!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error", MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// 创建主窗口
HWND hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
g_szWindowTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
NULL, NULL, hInstance, NULL);
if (hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error", MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// 显示窗口并进入消息循环
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
```
该程序使用 Win32 API 创建了一个窗口,并在窗口中绘制了一个圆形。圆心的位置沿着正弦曲线移动,速度和方向可以通过鼠标点击进行控制。当圆心到达曲线的尾部时,它会自动往回移动,并且半径会由大变小。要停止圆心的移动,只需点击鼠标左键,再次点击即可恢复移动。要改变圆心的移动方向,只需点击鼠标右键即可。