ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

第5章,[Win32 章节] :边框绘制函数(四)

2026/8/15 22:59:11 拓冰建站 浏览量
第5章,[Win32 章节] :边框绘制函数(四) 专栏导航上一篇第5章[Win32 章节] 边框绘制函数三回到目录下一篇第5章[Win32 章节] 边框绘制函数五本节前言对于本节所讲解的知识有可能你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点请你自行查阅。我呢也会提到一部分的参考课节。但是呢你不应该依赖于我的主动提及。最好呢你自己能够多去了解和查看本专栏目录。之前的三节我们讲了矩形的绘制。这三节应该成为本节的先修课节。参考课节第5章[Win32 章节] 边框绘制函数一参考课节第5章[Win32 章节] 边框绘制函数二参考课节第5章[Win32 章节] 边框绘制函数三本节呢我们来学习椭圆的绘制。圆形我们将其看成是一种特殊的椭圆。也就是本节讲解椭圆的绘制实际上它也涵盖了圆形的绘制。一. Ellipse 函数讲解绘制椭圆和圆形使用的函数叫做 Ellipse 。它的使用方法如下Ellipse (hdc, xLeft, yTop, xRight, yBottom);绘制椭圆的 Ellipse 函数与绘制矩形的 Rectangle 函数它们的参数数量与参数含义都是一样的只是函数名不一样而已。绘制椭圆的示意图如下。图1在图1 里面我们所绘制出来的椭圆实际上是红色虚线所示的矩形的内接椭圆。相对地红色虚线的矩形它实际上就是蓝色的椭圆的外接矩形。既然是说红色虚线的矩形是蓝色线条的椭圆的外接矩形那么整个的一个椭圆它实际上它是可以由外接矩形来进行定位的。也就是说外接矩形的 x 坐标的范围若是 [x1, x2]则内接椭圆的 x 坐标的范围也是 [x1, x2] 。同理外接矩形的 y 坐标的范围若是 [y1, y2]则内接椭圆的 y 坐标的范围也是 [y1, y2] 。椭圆函数 Ellipse 的使用方法我们再来看一看如下所示Ellipse (hdc, xLeft, yTop, xRight, yBottom);在上面的公式中hdc 是设备环境句柄。我们若以客户区内部的最左侧的一列像素为 0 列像素再往右一列是 1 号列像素再往右一列是 2 号列像素等等。在这种规定之下则 xLeft 是椭圆所在的外接矩形的左边的起始像素的列号xRight 是椭圆所在的外接矩形的右边的结束像素的右边一列像素的列号。也就是椭圆所在的外接矩形的 x 坐标的范围是 xLeft x (xRight - 1)xRight 是椭圆所在的外接矩形达不到的像素列号。讲完了xLeft 和 xRight我们再来看一看 yTop 和 yBottom 。我们若以客户区内部最上边的一行像素为 0 行像素则此行像素再往下一行为 1 号行像素再往下一行为 2 号行像素等等。在这种规定之下则 yTop 是椭圆所在外接矩形的上边的起始像素的行号而 yBottom 是椭圆所在的外接矩形的下边的结束像素的下一行像素的行号。也就是椭圆所在的外接矩形的 y 坐标的范围是 yTop y (yBottom - 1)yBottom 是椭圆所在的外接矩形达不到的像素行号。如果所绘制的椭圆它的外接矩形的宽度和高度相同则所绘制的椭圆便是一个正圆。也就是当满足 (xRight - xLeft) (yBottom - yTop) 条件时所绘制的椭圆为正圆。还需要强调一点用 Ellipse 绘制出来的椭圆它不止是会画外侧的曲线实际上它也会填充内部。只是默认的情况下所使用的画刷为白色画刷我们的程序客户区的背景画刷也是白色画刷所以呢现阶段的你可能注意不到椭圆内部的填充色。以后我们在讲完画刷的时候你会明白这一点的。二. 程序示例讲完了基础知识我们还是给出来一个简单的程序示例吧。程序代码如下。/*------------------------------------------------------------ WinMain.cpp绘制两个矩形。 ------------------------------------------------------------*/ #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(Ellipse_Lx); 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(The Ellipse_Lx Program), // 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; int x1, x2, y1, y2; switch (message) { case WM_CREATE: return 0; case WM_PAINT: hdc BeginPaint(hwnd, ps); x1 60; x2 360; y1 60; y2 260; Ellipse(hdc, x1, y1, x2, y2); x1 400; x2 700; y1 60; y2 360; Ellipse(hdc, x1, y1, x2, y2); EndPaint(hwnd, ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }程序应该是不难看懂的。编译过程我就不详细写了。如果你忘了如何编译和运行程序请参考下述课节。参考课节使用 VS2010 编写 C语言程序参考课节用 VS2019 编写C语言程序程序的运行结果如下。图2结束语本节的课程内容不难。不过呢你仍然是需要好好地来学习的。专栏导航上一篇第5章[Win32 章节] 边框绘制函数三回到目录下一篇第5章[Win32 章节] 边框绘制函数五