• 利用 GDI+ 绘制旋转的太极


      1 // TaiJi.cpp : 定义应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include "TaiJi.h"
      6 
      7 /*
      8 * 由于需要用GDI+进行绘图,所以需要先含GDI+库
      9 * 首先,包含Gdiplus.h头文件, 引入Gdiplus命名空间, 包含gdiplus.lib库
     10 * 在stdafx.h头文件中,取消 WIN32_LEAN_AND_MEAN 宏的定义,如果不取消这个宏定义,编译时会报错.
     11 */
     12 #include <GdiPlus.h>
     13 using namespace Gdiplus;
     14 #pragma comment(lib, "gdiplus.lib")
     15 
     16 #define MAX_LOADSTRING 100
     17 
     18 // 全局变量:
     19 HINSTANCE hInst;                                // 当前实例
     20 TCHAR szTitle[MAX_LOADSTRING] = TEXT("旋转的太极");                    // 标题栏文本
     21 TCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名
     22 
     23 ULONG_PTR GdiplusToken;
     24 
     25 // 此代码模块中包含的函数的前向声明:
     26 ATOM                MyRegisterClass(HINSTANCE hInstance);
     27 BOOL                InitInstance(HINSTANCE, int);
     28 LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
     29 INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
     30 
     31 int APIENTRY _tWinMain(HINSTANCE hInstance,
     32                      HINSTANCE hPrevInstance,
     33                      LPTSTR    lpCmdLine,
     34                      int       nCmdShow)
     35 {
     36     UNREFERENCED_PARAMETER(hPrevInstance);
     37     UNREFERENCED_PARAMETER(lpCmdLine);
     38 
     39      // TODO: 在此放置代码。
     40     MSG msg;
     41     HACCEL hAccelTable;
     42 
     43     // 初始化全局字符串
     44     LoadString(hInstance, IDC_TAIJI, szWindowClass, MAX_LOADSTRING);
     45     MyRegisterClass(hInstance);
     46 
     47     // 执行应用程序初始化:
     48     if (!InitInstance (hInstance, nCmdShow))
     49     {
     50         return FALSE;
     51     }
     52 
     53     hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TAIJI));
     54 
     55     // 主消息循环:
     56     while (GetMessage(&msg, NULL, 00))
     57     {
     58         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
     59         {
     60             TranslateMessage(&msg);
     61             DispatchMessage(&msg);
     62         }
     63     }
     64 
     65     return (int) msg.wParam;
     66 }
     67 
     68 
     69 ATOM MyRegisterClass(HINSTANCE hInstance)
     70 {
     71     WNDCLASSEX wcex;
     72 
     73     wcex.cbSize = sizeof(WNDCLASSEX);
     74 
     75     wcex.style            = CS_HREDRAW | CS_VREDRAW;
     76     wcex.lpfnWndProc    = WndProc;
     77     wcex.cbClsExtra        = 0;
     78     wcex.cbWndExtra        = 0;
     79     wcex.hInstance        = hInstance;
     80     wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TAIJI));
     81     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
     82     wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
     83     wcex.lpszMenuName    = NULL;
     84     wcex.lpszClassName    = szWindowClass;
     85     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
     86 
     87     return RegisterClassEx(&wcex);
     88 }
     89 
     90 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
     91 {
     92    HWND hWnd;
     93 
     94    hInst = hInstance; // 将实例句柄存储在全局变量中
     95 
     96    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
     97       CW_USEDEFAULT, 0600400, NULL, NULL, hInstance, NULL);
     98 
     99    if (!hWnd)
    100    {
    101       return FALSE;
    102    }
    103 
    104    ShowWindow(hWnd, nCmdShow);
    105    UpdateWindow(hWnd);
    106 
    107    return TRUE;
    108 }
    109 
    110 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    111 {
    112     PAINTSTRUCT ps;
    113     HDC hdc;
    114     
    115     GdiplusStartupInput gdiplusStartupInput;
    116 
    117     const int width = 300;
    118     const int height = 300;
    119 
    120     static RECT rect;
    121 
    122     static Bitmap *pBufferBmp;
    123     static Graphics *pGrphBmp;
    124     static SolidBrush* pBrsh1;
    125     static SolidBrush* pBrsh2;
    126     
    127     switch (message)
    128     {
    129     case WM_CREATE:
    130         //初始化GDI+
    131         GdiplusStartup(&GdiplusToken, &gdiplusStartupInput, NULL);
    132         
    133         //获取客户区的大小,计算位图在客户区居中显示的位置
    134         GetClientRect(hWnd, &rect);
    135         rect.left = (rect.right - width) / 2;
    136         rect.right = rect.left + width;
    137         rect.top = (rect.bottom - height) / 2;
    138         rect.bottom = rect.top + height;
    139 
    140         //创建一个黑色画刷
    141         pBrsh1 = new SolidBrush(Color::Black);
    142         //创建一个白色画刷
    143         pBrsh2 = new SolidBrush(Color::White);
    144 
    145         //创建一个宽高300像素的正方形位图
    146         pBufferBmp = new Bitmap(width, height);
    147         pGrphBmp = Graphics::FromImage(pBufferBmp);
    148 
    149         //设置绘制图形时消除锯齿
    150         pGrphBmp->SetSmoothingMode(SmoothingModeAntiAlias);
    151 
    152         //设置坐标原点位于位图的中心
    153         pGrphBmp->TranslateTransform(float(width/2), float(height/2));
    154 
    155         SetTimer(hWnd, 130, NULL);
    156         break;
    157     case WM_TIMER:
    158                 
    159         //逆时针每次旋转坐标5度
    160         pGrphBmp->RotateTransform(-5);
    161 
    162         //用黄绿色填充位图背景
    163         pGrphBmp->Clear(Color::YellowGreen);
    164 
    165         //用黑色画刷绘制左侧的黑色半圆
    166         pGrphBmp->FillPie(pBrsh1, -100, -10020020090180);
    167         
    168         //用白色画刷绘制右侧的白色半圆
    169         pGrphBmp->FillPie(pBrsh2, -100, -10020020090, -180);
    170 
    171         //绘制黑色阴阳鱼的鱼头
    172         pGrphBmp->FillPie(pBrsh1, -51010010090, -180);
    173 
    174         //绘制白色阴阳鱼的鱼头
    175         pGrphBmp->FillPie(pBrsh2, -49, -10010010090180);
    176 
    177         //绘制黑色阴阳鱼的眼睛
    178         pGrphBmp->FillEllipse(pBrsh1, -10, -602020);
    179 
    180         //绘制白色阴阳鱼的眼睛
    181         pGrphBmp->FillEllipse(pBrsh2, -10402020);
    182 
    183         
    184         InvalidateRect(hWnd, &rect, FALSE);
    185         break;
    186     
    187     case WM_PAINT:
    188     {
    189         hdc = BeginPaint(hWnd, &ps);
    190 
    191         Graphics *pGrph = Graphics::FromHDC(hdc);
    192         pGrph->DrawImage(pBufferBmp, rect.left, rect.top);
    193 
    194         EndPaint(hWnd, &ps);
    195         break;
    196     }
    197 
    198     case WM_DESTROY:
    199         KillTimer(hWnd, 1);
    200         delete pBrsh1;
    201         delete pBrsh2;
    202         delete pGrphBmp;
    203         delete pBufferBmp;
    204 
    205         //释放GDI+
    206         GdiplusShutdown(GdiplusToken);
    207         PostQuitMessage(0);
    208         break;
    209     default:
    210         return DefWindowProc(hWnd, message, wParam, lParam);
    211     }
    212     return 0;
    213 }

    源码: http://pan.baidu.com/share/link?shareid=535102&uk=1678089569 

  • 相关阅读:
    关于开发 Web AI 的思考(kendryte K210)
    怪不得我说,这几个月的代码数据都跑哪里去了....
    在 Android 上使用蓝牙作为主机进行一对多从机传输数据的实测,理论 5
    写了一下 micropython 的文件系统单元测试
    mark 自己未来要写一下,蓝牙主机一对多从机和 K210 的网络通信优化过程。
    VUE实现Studio管理后台(五):手风琴式折叠组件(Accordion)
    VUE实现Studio管理后台(四):状态模式实现窗口停靠,灵动、自由
    VUE实现Studio管理后台(三):支持多语言国际化(vue-i18n)
    VUE实现Studio管理后台(二):Slot实现选项卡tab切换效果,可自由填装内容
    VUE实现Studio管理后台(一):鼠标拖放改变窗口大小
  • 原文地址:https://www.cnblogs.com/wuliqv/p/3096850.html
Copyright © 2020-2023  润新知