yamakawa 发表于 2017-7-23 15:15:45

一段代码求c转au3-关于gdi+的【已解决】【自己搞定】

本帖最后由 yamakawa 于 2017-7-24 19:22 编辑

// TaiJi.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "TaiJi.h"

/*
* 由于需要用GDI+进行绘图,所以需要先含GDI+库
* 首先,包含Gdiplus.h头文件, 引入Gdiplus命名空间, 包含gdiplus.lib库
* 在stdafx.h头文件中,取消 WIN32_LEAN_AND_MEAN 宏的定义,如果不取消这个宏定义,编译时会报错.
*/
#include <GdiPlus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst;                              // 当前实例
TCHAR szTitle = TEXT("旋转的太极");                  // 标题栏文本
TCHAR szWindowClass;            // 主窗口类名

ULONG_PTR GdiplusToken;

// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

   // TODO: 在此放置代码。
    MSG msg;
    HACCEL hAccelTable;

    // 初始化全局字符串
    LoadString(hInstance, IDC_TAIJI, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
      return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TAIJI));

    // 主消息循环:
    while (GetMessage(&msg, NULL, 0, 0))
    {
      if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
      {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
      }
    }

    return (int) msg.wParam;
}


ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    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, MAKEINTRESOURCE(IDI_TAIJI));
    wcex.hCursor      = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = NULL;
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm      = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, 600, 400, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
   
    GdiplusStartupInput gdiplusStartupInput;

    const int width = 300;
    const int height = 300;

    static RECT rect;

    static Bitmap *pBufferBmp;
    static Graphics *pGrphBmp;
    static SolidBrush* pBrsh1;
    static SolidBrush* pBrsh2;
   
    switch (message)
    {
    case WM_CREATE:
      //初始化GDI+
      GdiplusStartup(&GdiplusToken, &gdiplusStartupInput, NULL);
      
      //获取客户区的大小,计算位图在客户区居中显示的位置
      GetClientRect(hWnd, &rect);
      rect.left = (rect.right - width) / 2;
      rect.right = rect.left + width;
      rect.top = (rect.bottom - height) / 2;
      rect.bottom = rect.top + height;

      //创建一个黑色画刷
      pBrsh1 = new SolidBrush(Color::Black);
      //创建一个白色画刷
      pBrsh2 = new SolidBrush(Color::White);

      //创建一个宽高300像素的正方形位图
      pBufferBmp = new Bitmap(width, height);
      pGrphBmp = Graphics::FromImage(pBufferBmp);

      //设置绘制图形时消除锯齿
      pGrphBmp->SetSmoothingMode(SmoothingModeAntiAlias);

      //设置坐标原点位于位图的中心
      pGrphBmp->TranslateTransform(float(width/2), float(height/2));

      SetTimer(hWnd, 1, 30, NULL);
      break;
    case WM_TIMER:
               
      //逆时针每次旋转坐标5度
      pGrphBmp->RotateTransform(-5);

      //用黄绿色填充位图背景
      pGrphBmp->Clear(Color::YellowGreen);

      //用黑色画刷绘制左侧的黑色半圆
      pGrphBmp->FillPie(pBrsh1, -100, -100, 200, 200, 90, 180);
      
      //用白色画刷绘制右侧的白色半圆
      pGrphBmp->FillPie(pBrsh2, -100, -100, 200, 200, 90, -180);

      //绘制黑色阴阳鱼的鱼头
      pGrphBmp->FillPie(pBrsh1, -51, 0, 100, 100, 90, -180);

      //绘制白色阴阳鱼的鱼头
      pGrphBmp->FillPie(pBrsh2, -49, -100, 100, 100, 90, 180);

      //绘制黑色阴阳鱼的眼睛
      pGrphBmp->FillEllipse(pBrsh1, -10, -60, 20, 20);

      //绘制白色阴阳鱼的眼睛
      pGrphBmp->FillEllipse(pBrsh2, -10, 40, 20, 20);

      
      InvalidateRect(hWnd, &rect, FALSE);
      break;
   
    case WM_PAINT:
    {
      hdc = BeginPaint(hWnd, &ps);

      Graphics *pGrph = Graphics::FromHDC(hdc);
      pGrph->DrawImage(pBufferBmp, rect.left, rect.top);

      EndPaint(hWnd, &ps);
      break;
    }

    case WM_DESTROY:
      KillTimer(hWnd, 1);
      delete pBrsh1;
      delete pBrsh2;
      delete pGrphBmp;
      delete pBufferBmp;

      //释放GDI+
      GdiplusShutdown(GdiplusToken);
      PostQuitMessage(0);
      break;
    default:
      return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}


源码: http://pan.baidu.com/share/link?shareid=535102&uk=1678089569网上看的一段代码,感觉挺有意思的。哪位高人能帮我转成au3么

yamakawa 发表于 2017-7-23 15:16:48

      pGrphBmp->TranslateTransform(float(width/2), float(height/2));
      pGrphBmp->RotateTransform(-5);
主要是这两个。。。。额。。不知道为嘛写的总不对
页: [1]
查看完整版本: 一段代码求c转au3-关于gdi+的【已解决】【自己搞定】