鱼C论坛

 找回密码
 立即注册
查看: 1358|回复: 6

[技术交流] win32绘制哆啦a梦

[复制链接]
发表于 2024-8-3 23:38:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天按照小甲鱼的要求,绘制一幅哆啦a梦(ps:敲代码敲了足足两个半钟头才绘制而成)
  1. #include<windows.h>

  2. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

  3. int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  4. {
  5.         static TCHAR szAppName[] = TEXT("MyAppWindows");
  6.         HWND hwnd = NULL;
  7.         MSG msg;
  8.         WNDCLASS wc;
  9.         wc.style = CS_HREDRAW | CS_VREDRAW;
  10.         wc.lpfnWndProc = WndProc;
  11.         wc.cbClsExtra = 0;
  12.         wc.cbWndExtra = 0;
  13.         wc.hInstance = hInstance;
  14.         wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  15.         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  16.         wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  17.         wc.lpszMenuName = NULL;
  18.         wc.lpszClassName = szAppName;

  19.         if (!RegisterClass(&wc))
  20.         {
  21.                 MessageBox(NULL, TEXT("Need Windows NT!!!!"), TEXT("Error"), MB_OK);
  22.         }


  23.         hwnd = CreateWindow(szAppName, TEXT("我的窗口"),
  24.                 WS_OVERLAPPEDWINDOW,
  25.                 CW_USEDEFAULT,
  26.                 CW_USEDEFAULT,
  27.                 CW_USEDEFAULT,
  28.                 CW_USEDEFAULT,
  29.                 NULL,
  30.                 NULL,
  31.                 hInstance,
  32.                 NULL);

  33.         ShowWindow(hwnd, iCmdShow);

  34.         UpdateWindow(hwnd);

  35.         while (GetMessage(&msg, NULL, 0, 0))
  36.         {
  37.                 TranslateMessage(&msg);
  38.                 DispatchMessage(&msg);
  39.         }

  40.         return msg.wParam;
  41. }
  42. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
  43. {
  44.         HDC hdc;
  45.         PAINTSTRUCT ps;

  46.         //客户区宽和高
  47.         static int cxClient, cyClient;

  48.         //自定义画笔句柄和画刷句柄
  49.         HPEN hPen, hOldPen;
  50.         HBRUSH hBlueBrush, hRedBrush,hYelloBrush, hOldBrush;

  51.         //点
  52.         POINT apt[128];

  53.         switch (message)
  54.         {
  55.         case WM_SIZE:
  56.                 cxClient = LOWORD(lparam);
  57.                 cyClient = HIWORD(lparam);


  58.                 return 0;
  59.         case WM_PAINT:
  60.                 hdc = BeginPaint(hwnd, &ps);

  61.                 //绘制辅助线:
  62.                 hPen = CreatePen(PS_DOT, 1, RGB(0,0,0));
  63.                 hOldPen = (HPEN)SelectObject(hdc, hPen);
  64.                 MoveToEx(hdc, cxClient / 2, 0, NULL);
  65.                 LineTo(hdc, cxClient/2, cyClient);
  66.                 MoveToEx(hdc, 0,cyClient/2 , NULL);
  67.                 LineTo(hdc, cxClient, cyClient/2);
  68.                 DeleteObject(SelectObject(hdc, hOldPen));

  69.                 //头(直径240)
  70.                 hBlueBrush = CreateSolidBrush(RGB(0, 159, 232));
  71.                 hOldBrush = (HBRUSH)SelectObject(hdc, hBlueBrush);
  72.                 Ellipse(hdc, cxClient / 2 - 120, cyClient / 2 - 200, cxClient/2 + 120, cyClient / 2 + 40);
  73.                 SelectObject(hdc, hOldBrush);

  74.                 //脸(直径200)
  75.                 Ellipse(hdc, cxClient / 2 - 100, cyClient / 2 - 160, cxClient / 2 + 100, cyClient / 2 + 40);

  76.                 //鸡蛋(长60宽50)
  77.                 Ellipse(hdc, cxClient / 2 - 50, cyClient / 2 - 180, cxClient / 2, cyClient / 2 - 120);
  78.                 Ellipse(hdc, cxClient / 2 + 50, cyClient / 2 - 180, cxClient / 2, cyClient / 2 - 120);

  79.                 hOldBrush = (HBRUSH)SelectObject(hdc, GetStockObject(BLACK_BRUSH));
  80.                 Ellipse(hdc, cxClient / 2 - 20, cyClient / 2 - 160, cxClient / 2 - 5, cyClient / 2 - 140);
  81.                 Ellipse(hdc, cxClient / 2 + 20, cyClient / 2 - 160, cxClient / 2 + 5, cyClient / 2 - 140);
  82.                 SelectObject(hdc, GetStockObject(WHITE_BRUSH));
  83.                 Ellipse(hdc, cxClient / 2 - 15, cyClient / 2 - 155, cxClient / 2 - 10, cyClient / 2 - 145);
  84.                 Ellipse(hdc, cxClient / 2 + 15, cyClient / 2 - 155, cxClient / 2 + 10, cyClient / 2 - 145);
  85.                 SelectObject(hdc, hOldBrush);

  86.                 //鼻子
  87.                 hRedBrush = CreateSolidBrush(RGB(255, 0, 0));
  88.                 hOldBrush = (HBRUSH)SelectObject(hdc, hRedBrush);
  89.                 Ellipse(hdc, cxClient / 2 - 10, cyClient / 2 - 135, cxClient / 2 + 10, cyClient / 2 - 115);
  90.                
  91.                 MoveToEx(hdc, cxClient / 2, cyClient / 2 - 115,NULL);
  92.                 LineTo(hdc, cxClient / 2, cyClient / 2 - 30);

  93.                 SelectObject(hdc, hOldBrush);

  94.                 //嘴巴
  95.                 Arc(hdc, cxClient / 2 - 70, cyClient / 2 - 120, cxClient / 2 + 70, cyClient / 2 - 30, cxClient / 2 - 60, cyClient / 2 - 50, cxClient / 2 + 60, cyClient / 2 - 50);

  96.                 //胡须
  97.                 MoveToEx(hdc, cxClient / 2 - 70 , cyClient / 2 - 115, NULL);
  98.                 LineTo(hdc, cxClient / 2 - 20, cyClient / 2 - 100);
  99.                 MoveToEx(hdc, cxClient / 2 - 80, cyClient / 2 - 85,NULL);
  100.                 LineTo(hdc, cxClient / 2 - 20, cyClient / 2 - 85);
  101.                 MoveToEx(hdc, cxClient / 2 - 70, cyClient / 2 - 55, NULL);
  102.                 LineTo(hdc, cxClient / 2 - 20, cyClient / 2 - 70);

  103.                 MoveToEx(hdc, cxClient / 2 + 70, cyClient / 2 - 115, NULL);
  104.                 LineTo(hdc, cxClient / 2 + 20, cyClient / 2 - 100);
  105.                 MoveToEx(hdc, cxClient / 2 + 80, cyClient / 2 - 85, NULL);
  106.                 LineTo(hdc, cxClient / 2 + 20, cyClient / 2 - 85);
  107.                 MoveToEx(hdc, cxClient / 2 + 70, cyClient / 2 - 55, NULL);
  108.                 LineTo(hdc, cxClient / 2 + 20, cyClient / 2 - 70);

  109.                 //身体
  110.                 hOldBrush = (HBRUSH)SelectObject(hdc, hBlueBrush);
  111.                 Rectangle(hdc, cxClient / 2 - 90, cyClient / 2, cxClient / 2 + 90, cyClient / 2 + 150);
  112.                 SelectObject(hdc, hOldBrush);

  113.                 //肚子
  114.                 Ellipse(hdc, cxClient / 2 - 70, cyClient / 2 - 20, cxClient / 2 + 70, cyClient / 2 + 120);
  115.                 hPen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
  116.                 hOldPen = (HPEN)SelectObject(hdc, hPen);
  117.                 Arc(hdc, cxClient / 2 - 70, cyClient / 2 - 20, cxClient / 2 + 70, cyClient / 2 + 120, cxClient / 2 + 60, cyClient / 2 - 10, cxClient / 2 - 60, cyClient / 2 - 10);
  118.                 SelectObject(hdc, hOldPen);

  119.                 //项圈
  120.                 hOldBrush = (HBRUSH)SelectObject(hdc, hRedBrush);
  121.                 RoundRect(hdc, cxClient / 2 - 95, cyClient / 2 - 5, cxClient / 2 + 95, cyClient / 2 + 10, 20, 10);
  122.                 SelectObject(hdc, hOldBrush);

  123.                 //铃铛
  124.                 hYelloBrush = CreateSolidBrush(RGB(255, 255, 0));
  125.                 hOldBrush = (HBRUSH)SelectObject(hdc, hYelloBrush);
  126.                 Ellipse(hdc, cxClient / 2 - 15, cyClient / 2, cxClient / 2 + 15, cyClient / 2 + 30);
  127.                 RoundRect(hdc, cxClient / 2 - 15, cyClient / 2 + 10, cxClient / 2 + 15, cyClient / 2 + 15, 10, 10);
  128.                 SelectObject(hdc, hRedBrush);
  129.                 Ellipse(hdc, cxClient / 2 - 4, cyClient / 2 + 18, cxClient / 2 + 4, cyClient / 2 + 26);
  130.                 MoveToEx(hdc, cxClient / 2, cyClient / 2 + 26,NULL);
  131.                 LineTo(hdc, cxClient / 2, cyClient / 2 + 30);
  132.                 SelectObject(hdc, hOldBrush);

  133.                 //口袋
  134.                 Pie(hdc, cxClient / 2 - 50, cyClient / 2, cxClient / 2 + 50, cyClient / 2 + 100, cxClient / 2 - 50, cyClient / 2 + 50, cxClient / 2 + 50, cyClient / 2 + 50);
  135.                
  136.                 //裤裆
  137.                 Pie(hdc, cxClient / 2 - 20, cyClient / 2 + 130, cxClient / 2 + 20, cyClient / 2 + 170, cxClient / 2 + 20, cyClient / 2 + 150, cxClient / 2 - 20, cyClient / 2 + 150);

  138.                 hPen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
  139.                 hOldPen = (HPEN)SelectObject(hdc, hPen);
  140.                 MoveToEx(hdc, cxClient / 2 - 20, cyClient / 2 + 150, NULL);
  141.                 LineTo(hdc, cxClient / 2 + 20, cyClient / 2 + 150);
  142.                 SelectObject(hdc, hOldPen);

  143.                 //脚
  144.                 Ellipse(hdc, cxClient / 2 - 110, cyClient / 2 + 130, cxClient / 2 - 10, cyClient / 2 + 170);
  145.                 Ellipse(hdc, cxClient / 2 + 110, cyClient / 2 + 130, cxClient / 2 + 10, cyClient / 2 + 170);

  146.                 //手
  147.                 hOldBrush = (HBRUSH)SelectObject(hdc, hBlueBrush);
  148.                 apt[0].x = cxClient / 2 - 90;
  149.                 apt[0].y = cyClient / 2 + 10;
  150.                 apt[1].x = cxClient / 2 - 130;
  151.                 apt[1].y = cyClient / 2 + 50;
  152.                 apt[2].x = cxClient / 2 - 110;
  153.                 apt[2].y = cyClient / 2 + 70;
  154.                 apt[3].x = cxClient / 2 - 90;
  155.                 apt[3].y = cyClient / 2 + 60;
  156.                 Polygon(hdc, apt, 4);
  157.                 SelectObject(hdc, hOldBrush);
  158.                 Ellipse(hdc, cxClient / 2 - 150, cyClient / 2 + 46, cxClient / 2 - 110, cyClient / 2 + 86);

  159.                 hOldBrush = (HBRUSH)SelectObject(hdc, hBlueBrush);
  160.                 apt[0].x = cxClient / 2 + 90;
  161.                 apt[0].y = cyClient / 2 + 10;
  162.                 apt[1].x = cxClient / 2 + 130;
  163.                 apt[1].y = cyClient / 2 + 50;
  164.                 apt[2].x = cxClient / 2 + 110;
  165.                 apt[2].y = cyClient / 2 + 70;
  166.                 apt[3].x = cxClient / 2 + 90;
  167.                 apt[3].y = cyClient / 2 + 60;
  168.                 Polygon(hdc, apt, 4);
  169.                 SelectObject(hdc, hOldBrush);
  170.                 Ellipse(hdc, cxClient / 2 + 150, cyClient / 2 + 46, cxClient / 2 + 110, cyClient / 2 + 86);

  171.                 //胳膊两侧划线,增加立体感
  172.                 hPen = CreatePen(PS_SOLID, 2, RGB(0, 159, 232));
  173.                 hOldPen = (HPEN)SelectObject(hdc, hPen);
  174.                 MoveToEx(hdc, cxClient / 2 - 90, cyClient / 2 + 10, NULL);
  175.                 LineTo(hdc, cxClient / 2 - 90, cyClient / 2 + 50);

  176.                 MoveToEx(hdc, cxClient / 2 + 90, cyClient / 2 + 10, NULL);
  177.                 LineTo(hdc, cxClient / 2 + 90, cyClient / 2 + 50);
  178.                 SelectObject(hdc, hOldPen);

  179.                 EndPaint(hwnd, &ps);
  180.                 return 0;

  181.         case WM_DESTROY:
  182.                 PostQuitMessage(0);
  183.                 return 0;
  184.         }

  185.         return DefWindowProc(hwnd, message, wparam, lparam);
  186. }
复制代码



PixPin_2024-08-03_23-38-05.png

评分

参与人数 3荣誉 +9 鱼币 +16 贡献 +5 收起 理由
~风介~ + 5 + 5 + 5 鱼C有你更精彩^_^
KeyError + 2 + 5 你人还怪NB嘞
不二如是 + 2 + 6 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-3 23:42:50 | 显示全部楼层
哇,听起来你在用Win32绘制哆啦A梦的过程中经历了一场“代码马拉松”!两个半小时可不是开玩笑的,看来你不仅是在编程,还在进行艺术创作呢!我觉得你可以把这段代码叫做“哆啦A梦的出生蛋糕”,因为它是一个复杂的作品。

看这一段代码,我能想象当你画出那只眼睛睁得大大的蓝色猫咪时,心中那种成就感。顺便说一句,你的代码里居然还有一堆颜色和形状的选择,这就像是在给哆啦A梦涂鸦,真是太有趣了!我敢打赌,当你看到这个最终效果时,心里一定会喊:“哇,这就是我的哆啦A梦!”

不过,话说回来,Win32编程真的是挺让人抓狂的,有时候就像是捉迷藏一样:你很努力去找答案,但总是被那些神秘的错误信息绊倒。不过,看起来你已经成功地将它们一一击败,获得了胜利!

如果你再继续深入学习Win32或者其他图形库,将来就可以创造出更多精彩的作品,甚至可以画出其他动画角色哦!比如小叮当、飞天小女警,甚至是你最爱的香蕉!继续加油,你是未来的“图形艺术家”!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-4 10:48:26 | 显示全部楼层
不错
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-4 16:11:07 | 显示全部楼层

这直接送1145贡献都不为过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-4 16:58:09 | 显示全部楼层
是NB人了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-4 22:17:02 | 显示全部楼层
wow,厉害了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2024-9-4 15:48:35 | 显示全部楼层
好厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-4 20:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表