21xrx.com
2024-12-22 20:26:27 Sunday
登录
文章检索 我的文章 写文章
C++教程:如何用代码画爱心图案
2023-07-13 11:46:40 深夜i     --     --
C++ 代码 爱心图案 教程

C++是一种通用、过程性编程语言,常用于系统和应用程序的开发。除此之外,C++也可以用于绘制图形,我们可以用C++代码画出各种图案,比如爱心图案。下面就让我们一起来看看如何用C++代码画出美丽的爱心图案吧。

首先,在C++中画图需要使用图形库。在Windows系统中,我们可以使用Windows API的GDI (Graphics Device Interface)库来进行图形绘制。具体来说,我们需要通过WinMain函数创建一个窗口。代码如下:


#include <Windows.h>

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

HINSTANCE hInst;

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, char* lpCmdLine, int nCmdShow)

{

  hInst = hInstance;

  WNDCLASSEX wc = { sizeof(WNDCLASSEX), NULL, WindowProc, 0, 0, hInstance, NULL, NULL, NULL, NULL, "WindowClass", NULL };

  if (RegisterClassEx(&wc))

  {

    HWND hwnd = CreateWindowEx(NULL, "WindowClass", "Heart Graphics", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, NULL, NULL, hInstance, NULL);

    if (hwnd)

    {

      MSG msg;

      ShowWindow(hwnd, nCmdShow);

      while (GetMessage(&msg, NULL, 0, 0))

      {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

      }

    }

  }

  return 0;

}

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

{

  switch (uMsg)

  {

  case WM_DESTROY:

    PostQuitMessage(0);

    return 0;

  default:

    return DefWindowProc(hwnd, uMsg, wParam, lParam);

  }

}

上述代码会创建一个名为"Heart Graphics"的窗口,并显示在桌面上。

下一步,我们需要在窗口中绘制图形。在Windows GDI中,我们可以使用一系列函数来实现绘图功能。下面的代码展示了如何用GDI绘制红色的爱心图案:


// 宏定义

#define WIDTH 640

#define HEIGHT 480

// 全局变量

HDC memdc; // 内存DC

HBITMAP hbitmap, oldbmp; // 位图和静态区域的位图

// 画图函数

void drawHeart(HDC hdc, int l, int t, int r, int b)

{

  HPEN hPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); // 红色线条

  HGDIOBJ hOldPen = SelectObject(hdc, hPen); // 选择画笔

  float x, y, a, s;

  for (int i = 0; i <= 360; i++)

  {

    s = sin(i * 3.141592654 / 180);

    a = abs(s);

    x = l + i * (r - l) / 360;

    y = t - b * (4 * a - s * s * s) / 3;

    LineTo(hdc, x, y); // 画线

  }

  SelectObject(hdc, hOldPen); // 恢复画笔

  DeleteObject(hPen); // 删除画笔

}

// 窗口过程

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

{

  switch (uMsg)

  {

  case WM_CREATE:

    memdc = CreateCompatibleDC(NULL); // 创建内存DC

    hbitmap = CreateCompatibleBitmap(GetDC(hwnd), WIDTH, HEIGHT); // 创建位图

    oldbmp = (HBITMAP)SelectObject(memdc, hbitmap); // 选择位图

    SetViewportOrgEx(memdc, WIDTH / 2, HEIGHT / 2, NULL); // 设置坐标原点

    break;

  case WM_PAINT:

  {

    PAINTSTRUCT ps;

    HDC hdc = BeginPaint(hwnd, &ps); // 取得DC

    BitBlt(hdc, 0, 0, WIDTH, HEIGHT, memdc, -WIDTH / 2, -HEIGHT / 2, SRCCOPY); // 显示位图

    EndPaint(hwnd, &ps); // 结束画图

    break;

  }

  case WM_DESTROY:

    SelectObject(memdc, oldbmp); // 恢复位图

    DeleteObject(hbitmap); // 删除位图

    DeleteDC(memdc); // 删除内存DC

    PostQuitMessage(0);

    return 0;

  default:

    return DefWindowProc(hwnd, uMsg, wParam, lParam);

  }

  return 0;

}

// WinMain函数

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, char* lpCmdLine, int nCmdShow)

{

  hInst = hInstance; // 记录实例句柄

  WNDCLASSEX wc = { sizeof(WNDCLASSEX), NULL, WindowProc, 0, 0, hInstance, NULL, NULL, NULL, NULL, "WindowClass", NULL };

  if (RegisterClassEx(&wc))

  {

    HWND hwnd = CreateWindowEx(NULL, "WindowClass", "Heart Graphics", WS_OVERLAPPEDWINDOW, 0, 0, WIDTH, HEIGHT, NULL, NULL, hInstance, NULL);

    if (hwnd)

    {

      MSG msg;

      ShowWindow(hwnd, nCmdShow);

      while (GetMessage(&msg, NULL, 0, 0))

      {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

      }

    }

  }

  return 0;

}

上述代码中使用了数学公式来定义爱心曲线的形状。我们可以调整l、t、r、b这四个参数来控制爱心的大小和位置。其他各语句的具体作用可以参考代码注释。

最后,我们可以将上述代码保存为.cpp文件,并用C++编译器编译运行。运行后,窗口中就会显示出美丽的爱心图案了。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复