📜  使用 CC++ 中的计算机图形编程绘制移动循环(1)

📅  最后修改于: 2023-12-03 15:36:26.869000             🧑  作者: Mango

使用 CC++ 中的计算机图形编程绘制移动循环

如果你想用 C++ 中的计算机图形编程来绘制一个移动循环,你可以使用基于图形设备接口 (GDI) 的 WinAPI 来实现。下面是一个简单的代码示例来演示如何使用 GDI 绘制一个移动循环。

#include <Windows.h>
#include <cmath>

#define Pi 3.1415926

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wcex;
    HWND hWnd;
    MSG msg;

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "Win32Project1";
    wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);

    if (!RegisterClassEx(&wcex))
        return 0;

    hWnd = CreateWindowEx(0, "Win32Project1", "Moving Loop",
        WS_SYSMENU | WS_MINIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT,
        800, 600,
        NULL, NULL,
        hInstance,
        NULL);

    if (!hWnd)
        return 0;

    ShowWindow(hWnd, nCmdShow);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    static int x = 0, y = 300, r = 60;

    switch (message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);

        // 绘制移动循环
        Ellipse(hdc, x - r, y - r, x + r, y + r);

        EndPaint(hWnd, &ps);
        break;

    case WM_TIMER:
        x += 10 * cos(Pi / 4);
        y -= 10 * sin(Pi / 4);
        InvalidateRect(hWnd, NULL, TRUE);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}

这个代码示例使用一个窗口来绘制移动循环。在窗口的 WM_PAINT 消息处理中,它通过 GDI 绘制 Ellipse 来绘制一个圆。

在 WM_TIMER 消息处理中,代码对圆的 x 和 y 坐标进行了更改,并且使用 InvalidateRect 函数来通知系统重绘窗口。由于 WM_TIMER 消息被设置为每隔一定时间就发送给窗口,因此在此消息处理函数中对圆的坐标进行更改,就会让圆像在屏幕上移动。

最后,当窗口被销毁时,我们通过 WM_DESTROY 消息发送一个退出应用程序的消息。

这个代码示例只是一个简单的演示,当然你可以根据实际需求来扩展它。如果你想了解更多关于 GDI 和 WinAPI 的知识,可以参考 Microsoft 的官方文档。