首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 純 API 繪圖小程式:旋轉風車動畫 (Win32 SDK 風格)

     編輯:關於VC++

專案簡介

不使用 MFC,純 Win32 API + GDI 繪製一個持續旋轉的三葉風車動畫。展示 WM_PAINT、InvalidateRect、Sleep 簡易動畫迴圈、三角函數計算葉片座標、Pie 繪製扇形等基礎技術。

完整原始碼 (單一 .cpp 即可編譯)


#include 
#include 
#include 
#include 

#define PI 3.1415926
int nNum = 0, nMaxNum = 20;

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) {
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = _T("WindmillClass");
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClass(&wc);

    HWND hwnd = CreateWindow(_T("WindmillClass"), _T("旋轉的風車"),
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 600, 450, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    MSG msg;
    while (GetMessage(&msg, hwnd, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    static HDC hdc;
    static HBRUSH hBrush;
    static HPEN hp;
    PAINTSTRUCT ps;
    int nCenterX, nCenterY;
    double fAngle;

    switch (uMsg) {
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        // 設定各向異性映射模式:邏輯座標 400x300 對應用戶區 600x450,原點置中
        SetMapMode(hdc, MM_ANISOTROPIC);
        SetWindowExtEx(hdc, 400, 300, NULL);
        SetViewportExtEx(hdc, 600, 450, NULL);
        SetViewportOrgEx(hdc, 300, 200, NULL);

        // 外圓
        hp = CreatePen(PS_SOLID, 1, RGB(255,0,255));
        SelectObject(hdc, hp);
        Ellipse(hdc, -100, -100, 100, 100);

        // 葉片 1 (紅)
        hBrush = CreateSolidBrush(RGB(255,0,0));
        SelectObject(hdc, hBrush);
        fAngle = 2*PI/nMaxNum*nNum;
        nCenterX = (int)(50*cos(fAngle));
        nCenterY = (int)(50*sin(fAngle));
        Pie(hdc, nCenterX-50, nCenterY-50, nCenterX+50, nCenterY+50,
            (int)(nCenterX+50*cos(fAngle)), (int)(nCenterY+50*sin(fAngle)),
            (int)(nCenterX+50*cos(fAngle+PI)), (int)(nCenterY+50*sin(fAngle+PI)));

        // 葉片 2 (藍) - 相位差 120°
        hBrush = CreateSolidBrush(RGB(0,0,255));
        SelectObject(hdc, hBrush);
        nCenterX = (int)(50*cos(fAngle+2*PI/3));
        nCenterY = (int)(50*sin(fAngle+2*PI/3));
        Pie(hdc, nCenterX-50, nCenterY-50, nCenterX+50, nCenterY+50,
            (int)(nCenterX+50*cos(fAngle+2*PI/3)), (int)(nCenterY+50*sin(fAngle+2*PI/3)),
            (int)(nCenterX+50*cos(fAngle+PI+2*PI/3)), (int)(nCenterY+50*sin(fAngle+PI+2*PI/3)));

        // 葉片 3 (青) - 相位差 240°
        hBrush = CreateSolidBrush(RGB(0,255,255));
        SelectObject(hdc, hBrush);
        nCenterX = (int)(50*cos(fAngle+4*PI/3));
        nCenterY = (int)(50*sin(fAngle+4*PI/3));
        Pie(hdc, nCenterX-50, nCenterY-50, nCenterX+50, nCenterY+50,
            (int)(nCenterX+50*cos(fAngle+4*PI/3)), (int)(nCenterY+50*sin(fAngle+4*PI/3)),
            (int)(nCenterX+50*cos(fAngle+PI+4*PI/3)), (int)(nCenterY+50*sin(fAngle+PI+4*PI/3)));

        nNum++;
        Sleep(100);               // 簡易幀率控制 (10 FPS)
        InvalidateRect(hwnd, NULL, TRUE); // 觸發下一幀
        EndPaint(hwnd, &ps);
        return 0;

    case WM_CLOSE:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

關鍵技術點

  • MM_ANISOTROPIC 映射模式:邏輯座標系固定 (400x300),自動適應視窗大小變化
  • SetViewportOrgEx 將原點移至視窗中心,繪圖座標以中心為基準
  • Pie 函數繪製扇形:由中心點、外接矩形、起始/結束射線決定
  • sin/cos 計算葉片中心點軌跡 (半徑 50)
  • Sleep(100) + InvalidateRect 形成簡易動畫迴圈 (生產環境建議用 SetTimer 或獨立渲染執行緒)

編譯與執行

  1. Visual Studio 新建 Win32 專案 → Windows 應用程式 → 空白專案
  2. 加入上述 .cpp,設定字元集:多位元組 (或保留 Unicode 並將字串加 _T())
  3. 編譯執行 (Ctrl+F5)

進階擴充建議

  • 雙緩衝 (CreateCompatibleDC + BitBlt) 消除閃爍
  • 使用 SetTimer / WM_TIMER 替代 Sleep,不阻塞訊息迴圈
  • 加入鍵盤控制:空白鍵暫停/繼續,方向鍵調整轉速
  • 改用 GDI+ (Graphics, Matrix 旋轉) 簡化座標變換
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved