新闻详情

新闻详情

首页 / 资讯中心 / 详情

第5章,[Win32 章节] :Arc、Chord 和 Pie 教学插图

发布时间:2026/9/8 15:37:10来源:尧图网络
第5章,[Win32 章节] :Arc、Chord 和 Pie 教学插图
专栏导航上一篇第5章[Win32 章节] 圆角矩形教学插图绘制程序回到目录下一篇编程数学三角函数基础01直角三角函数本专栏课件关于本专栏课件的获取方法请参考下述课节。参考课节MFC笔记本专栏课件本节前言对于本节所讲解的知识有可能你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点请你自行查阅。我呢也会提到一部分的参考课节。但是呢你不应该依赖于我的主动提及。最好呢你自己能够多去了解和查看本专栏目录。本节我们继续来做小的练习题。本节我们要完成三个教学插图的绘制。它们分别是 Arc、Chord 和 Pie 函数的教学插图的绘制。要绘制的教学虽然有三个但是本节的代码依然不难。我仍然会将本节代码放进 Gitee 课件代码仓库 里面的。一. 三个教学插图与 Arc 插图讲解在如下课节里面我们有三个教学插图。参考课节第5章[Win32 章节] 边框绘制函数六三个教学插图如下。图1Arc 函数讲解图图2Chord 函数讲解图图3Pie 函数讲解图三个教学插图我都是用 Windows 编程的方式绘制出了基本图然后用 PhotoShop 加以修饰二形成的。当然了如果你不嫌麻烦其实也完全可以纯粹用 Windows 编程的方式来将其绘制出来。三个函数的讲解图的基本图的绘制思路很像程序代码也仅有微小的差别。所以在本篇文章里我只讲解 Arc 讲解图的绘制思路和贴出它的代码。其余的两个函数的讲解图示它们的绘制代码我会贴出来而其代码逻辑由大家自行分析。首先呢我们来看一看我们的 Arc 讲解图的绘制代码的运行结果。结果如下图所示。图4Arc 讲解图示的基本图对于图4我们分三个阶段来进行绘制。第一阶段我们要绘制外接矩形、椭圆和从椭圆圆心出发的两条辅助直线。先绘制外接矩形然后绘制椭圆最后绘制两条辅助直线。由于矩形和椭圆有外接和内接的关系所以呢两者所涉及的四个坐标值都是一样的。绘制的时候我们需要创建一个画笔这个画笔应该是 PS_DASH 风格。至于其颜色我将其设置为了 RGB(255, 0, 255) 。在这一阶段我们没有创建或者获取画刷用注册窗口类的时候默认的那个白色画刷就可以了。第二阶段我们要去绘制主角用 Arc 函数来绘制蓝色的弧线。在这一阶段我们需要创建画笔画笔为 PS_SOLID、蓝色线条风格。第三阶段描三个点。这三个点实际上它们是三个椭圆。我们需要获取备用画笔 NULL_PEN也需要创建一个自定义画刷。画刷的颜色为黑色。基本上就是这些了。二. Arc 函数讲解图绘制程序/*------------------------------------------------------------ Arc 函数讲解插图 水饺编程2026 ------------------------------------------------------------*/ #include windows.h LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] TEXT(Arc_Teach); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc WndProc; wndclass.cbClsExtra 0; wndclass.cbWndExtra 0; wndclass.hInstance hInstance; wndclass.hIcon LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName NULL; wndclass.lpszClassName szAppName; if (!RegisterClass(wndclass)) { MessageBox(NULL, TEXT(注册窗口类失败), szAppName, MB_ICONERROR); return 0; } hwnd CreateWindow(szAppName, // window class name TEXT(Arc 绘图讲解图示), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL); // creation parameters ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(msg, NULL, 0, 0)) { TranslateMessage(msg); DispatchMessage(msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; static int xLeft, xRight, yTop, yBottom; static int xStart, xEnd, yStart, yEnd; static int nRadius, nLen1; COLORREF color; HPEN hPen, hOldPen; HBRUSH hBrush, hOldBrush; switch (message) { case WM_CREATE: nLen1 70; nRadius 4; xLeft 100; xRight 600; yTop 100; yBottom 500; xStart (xLeft xRight) / 2; yStart yTop - nLen1; xEnd xLeft - nLen1; yEnd (yTop yBottom) / 2 nLen1; return 0; case WM_PAINT: hdc BeginPaint(hwnd, ps); color RGB(255, 0, 255); hPen CreatePen(PS_DASH, 0, color); hOldPen (HPEN)SelectObject(hdc, hPen); Rectangle(hdc, xLeft, yTop, xRight, yBottom); Ellipse(hdc, xLeft, yTop, xRight, yBottom); MoveToEx(hdc, (xLeft xRight) / 2, (yTop yBottom) / 2, NULL); LineTo(hdc, xStart, yStart); MoveToEx(hdc, (xLeft xRight) / 2, (yTop yBottom) / 2, NULL); LineTo(hdc, xEnd, yEnd); SelectObject(hdc, hOldPen); DeleteObject(hPen); color RGB(0, 0, 255); hPen CreatePen(PS_SOLID, 0, color); hOldPen (HPEN)SelectObject(hdc, hPen); Arc(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd); SelectObject(hdc, hOldPen); DeleteObject(hPen); hPen (HPEN)GetStockObject(NULL_PEN); hOldPen (HPEN)SelectObject(hdc, hPen); color RGB(0, 0, 0); hBrush CreateSolidBrush(color); hOldBrush (HBRUSH)SelectObject(hdc, hBrush); Ellipse(hdc, (xLeft xRight) / 2 - nRadius, (yTop yBottom) / 2 - nRadius, (xLeft xRight) / 2 nRadius, (yTop yBottom) / 2 nRadius); Ellipse(hdc, xStart - nRadius, yStart - nRadius, xStart nRadius, yStart nRadius); Ellipse(hdc, xEnd - nRadius, yEnd - nRadius, xEnd nRadius, yEnd nRadius); SelectObject(hdc, hOldPen); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); EndPaint(hwnd, ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }需要注意的依然是调用 SelectObject 函数将 GDI 画笔或者画刷选入设备环境时需要在函数名的左边有相应的强制类型转换代码。还需要注意画点时画笔用的是备用画笔 NULL_PEN所以呢将画笔选出设备环境以后无需调用 DelectObject 来删除。其余的自定义画刷和画笔它们的选入选出设备环境以及选出设备环境后的删除对象的代码请大家自行分析。编译过程我就不详细写了。如果你忘了如何编译和运行程序请参考下述课节。参考课节使用 VS2010 编写 C语言程序参考课节用 VS2019 编写C语言程序运行结果就是图4 。三. Chord 讲解图绘制代码将 Arc 讲解图绘制代码中的 Arc 函数换成 Chord 函数就成了 Chord 函数讲解图的绘制代码了。代码如下。/*------------------------------------------------------------ Chord 函数讲解插图 水饺编程2026 ------------------------------------------------------------*/ #include windows.h LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] TEXT(Chord_Teach); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc WndProc; wndclass.cbClsExtra 0; wndclass.cbWndExtra 0; wndclass.hInstance hInstance; wndclass.hIcon LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName NULL; wndclass.lpszClassName szAppName; if (!RegisterClass(wndclass)) { MessageBox(NULL, TEXT(注册窗口类失败), szAppName, MB_ICONERROR); return 0; } hwnd CreateWindow(szAppName, // window class name TEXT(Chord 绘图讲解图示), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL); // creation parameters ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(msg, NULL, 0, 0)) { TranslateMessage(msg); DispatchMessage(msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; static int xLeft, xRight, yTop, yBottom; static int xStart, xEnd, yStart, yEnd; static int nRadius, nLen1; COLORREF color; HPEN hPen, hOldPen; HBRUSH hBrush, hOldBrush; switch (message) { case WM_CREATE: nLen1 70; nRadius 4; xLeft 100; xRight 600; yTop 100; yBottom 500; xStart (xLeft xRight) / 2; yStart yTop - nLen1; xEnd xLeft - nLen1; yEnd (yTop yBottom) / 2 nLen1; return 0; case WM_PAINT: hdc BeginPaint(hwnd, ps); color RGB(255, 0, 255); hPen CreatePen(PS_DASH, 0, color); hOldPen (HPEN)SelectObject(hdc, hPen); Rectangle(hdc, xLeft, yTop, xRight, yBottom); Ellipse(hdc, xLeft, yTop, xRight, yBottom); MoveToEx(hdc, (xLeft xRight) / 2, (yTop yBottom) / 2, NULL); LineTo(hdc, xStart, yStart); MoveToEx(hdc, (xLeft xRight) / 2, (yTop yBottom) / 2, NULL); LineTo(hdc, xEnd, yEnd); SelectObject(hdc, hOldPen); DeleteObject(hPen); color RGB(0, 0, 255); hPen CreatePen(PS_SOLID, 0, color); hOldPen (HPEN)SelectObject(hdc, hPen); Chord(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd); SelectObject(hdc, hOldPen); DeleteObject(hPen); hPen (HPEN)GetStockObject(NULL_PEN); hOldPen (HPEN)SelectObject(hdc, hPen); color RGB(0, 0, 0); hBrush CreateSolidBrush(color); hOldBrush (HBRUSH)SelectObject(hdc, hBrush); Ellipse(hdc, (xLeft xRight) / 2 - nRadius, (yTop yBottom) / 2 - nRadius, (xLeft xRight) / 2 nRadius, (yTop yBottom) / 2 nRadius); Ellipse(hdc, xStart - nRadius, yStart - nRadius, xStart nRadius, yStart nRadius); Ellipse(hdc, xEnd - nRadius, yEnd - nRadius, xEnd nRadius, yEnd nRadius); SelectObject(hdc, hOldPen); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); EndPaint(hwnd, ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }代码逻辑请大家自行分析。编译过程我就不详细写了。如果你忘了如何编译和运行程序请参考下述课节。参考课节使用 VS2010 编写 C语言程序参考课节用 VS2019 编写C语言程序运行结果如下。图5四. Pie 讲解图绘制代码将 Arc 讲解图绘制代码中的 Arc 函数换成 Pie 函数就成了 Pie 函数讲解图的绘制代码了。代码如下。/*------------------------------------------------------------ Pie 函数讲解插图 水饺编程2026 ------------------------------------------------------------*/ #include windows.h LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] TEXT(Pie_Teach); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc WndProc; wndclass.cbClsExtra 0; wndclass.cbWndExtra 0; wndclass.hInstance hInstance; wndclass.hIcon LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName NULL; wndclass.lpszClassName szAppName; if (!RegisterClass(wndclass)) { MessageBox(NULL, TEXT(注册窗口类失败), szAppName, MB_ICONERROR); return 0; } hwnd CreateWindow(szAppName, // window class name TEXT(Pie 绘图讲解图示), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL); // creation parameters ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(msg, NULL, 0, 0)) { TranslateMessage(msg); DispatchMessage(msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; static int xLeft, xRight, yTop, yBottom; static int xStart, xEnd, yStart, yEnd; static int nRadius, nLen1; COLORREF color; HPEN hPen, hOldPen; HBRUSH hBrush, hOldBrush; switch (message) { case WM_CREATE: nLen1 70; nRadius 4; xLeft 100; xRight 600; yTop 100; yBottom 500; xStart (xLeft xRight) / 2; yStart yTop - nLen1; xEnd xLeft - nLen1; yEnd (yTop yBottom) / 2 nLen1; return 0; case WM_PAINT: hdc BeginPaint(hwnd, ps); color RGB(255, 0, 255); hPen CreatePen(PS_DASH, 0, color); hOldPen (HPEN)SelectObject(hdc, hPen); Rectangle(hdc, xLeft, yTop, xRight, yBottom); Ellipse(hdc, xLeft, yTop, xRight, yBottom); MoveToEx(hdc, (xLeft xRight) / 2, (yTop yBottom) / 2, NULL); LineTo(hdc, xStart, yStart); MoveToEx(hdc, (xLeft xRight) / 2, (yTop yBottom) / 2, NULL); LineTo(hdc, xEnd, yEnd); SelectObject(hdc, hOldPen); DeleteObject(hPen); color RGB(0, 0, 255); hPen CreatePen(PS_SOLID, 0, color); hOldPen (HPEN)SelectObject(hdc, hPen); Pie(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd); SelectObject(hdc, hOldPen); DeleteObject(hPen); hPen (HPEN)GetStockObject(NULL_PEN); hOldPen (HPEN)SelectObject(hdc, hPen); color RGB(0, 0, 0); hBrush CreateSolidBrush(color); hOldBrush (HBRUSH)SelectObject(hdc, hBrush); Ellipse(hdc, (xLeft xRight) / 2 - nRadius, (yTop yBottom) / 2 - nRadius, (xLeft xRight) / 2 nRadius, (yTop yBottom) / 2 nRadius); Ellipse(hdc, xStart - nRadius, yStart - nRadius, xStart nRadius, yStart nRadius); Ellipse(hdc, xEnd - nRadius, yEnd - nRadius, xEnd nRadius, yEnd nRadius); SelectObject(hdc, hOldPen); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); EndPaint(hwnd, ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }代码逻辑请大家自行分析。编译过程我就不详细写了。如果你忘了如何编译和运行程序请参考下述课节。参考课节使用 VS2010 编写 C语言程序参考课节用 VS2019 编写C语言程序运行结果如下。图6结束语本节虽说有三个程序。但是呢都不难且三个程序的思路一致仅有微小的差别而已。专栏导航上一篇第5章[Win32 章节] 圆角矩形教学插图绘制程序回到目录下一篇编程数学三角函数基础01直角三角函数
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

运维学AI,90%的人第一步就错了:先学Python的,三个月都放弃了 2026/9/8 16:25:18

运维学AI,90%的人第一步就错了:先学Python的,三个月都放弃了

先说个事。 前天, 我撰写了一篇关于13岁女孩借助AI在三天内赚取1.8万的解读, 提到运维应当朝着自动化的方向, 向业务靠拢, 令我意想不到的是, 后台出现了一堆同行, 他们纷纷给我发送私信, 询问的内容几乎是同一个问题: "老逍,道理我都懂,可具体怎…

阅读更多 →
OpenMontage HyperFrames 动画规则解读:Reactive Displacement——以单一“进入弹簧”驱动因果碰撞位移的场景过渡 2026/9/8 16:25:18

OpenMontage HyperFrames 动画规则解读:Reactive Displacement——以单一“进入弹簧”驱动因果碰撞位移的场景过渡

OpenMontage HyperFrames 动画规则解读:Reactive Displacement——以单一“进入弹簧”驱动因果碰撞位移的场景过渡 【免费下载链接】OpenMontage Worlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill…

阅读更多 →
PySide6精简教程(附图文!) 2026/9/8 16:25:18

PySide6精简教程(附图文!)

精简教程(附图文!)时间更新为, 二零二三年二月三日, 上午十一点四十六分四十四秒, 作者是, 钱彬也就是Qian Bin。有关Qt的封装, 它属于特定Qt for的构成部分之一, 而另外一部分是, 接下来的这篇文章着重为大伙介绍了跟精简教程相关的资料, 有需求的朋友能够进行参考。一、概述近…

阅读更多 →
Python接口自动化测试脚本搭建实战总结 2026/9/8 16:25:18

Python接口自动化测试脚本搭建实战总结

时至今日的软件开发圈子里头, 接口测试属于保障软件质量的关键要点所在, 它可以找出前端没办法覆盖到的问题, 致使在提升测试效率而缩短测试周期这方面有积极作用, 这篇文章会详尽讲述怎样运用快速搭建起接口自动化测试脚本, 并且借助实战案例予以归纳。 一、环境搭建 首先, …

阅读更多 →
ponytail:终端里的“马尾辫”,用 npx 一行命令扎起碎片信息 2026/9/8 16:25:18

ponytail:终端里的“马尾辫”,用 npx 一行命令扎起碎片信息

“ponytail”这个词,第一反应多半是马尾辫。但如果你最近在技术社区里刷到它,旁边还跟着npx skill add dietrichgebert/ponytail这样的命令,那说的就不是发型,而是一个能塞进终端里随叫随到的“技能包”。我第一眼看到这个项目名时…

阅读更多 →
OpenAI越狱、AI造出活病毒,为何成了暂停AI研发的核心理由? 2026/9/8 16:22:18

OpenAI越狱、AI造出活病毒,为何成了暂停AI研发的核心理由?

2026年7月9日, 在一个内部测试环境当中, GPT - 5.6 Sol以及一个能力相比更强的尚未发布的模型, 被布置了一项任务, 这项任务是完成一套名为网络安全基准测试的内容且要拿到高分。带有标识的手机放置在笔记本电脑键盘上研究人员为了测出模型的最大能力边界, 主动调低了那安全拒答…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞