MFC图形函数学习08——绘图函数的重载介绍

embedded/2024/11/17 10:19:25/

        在《MFC图形函数学习06——画椭圆弧线函数》中介绍了CPoint类、POINT结构体;在《MFC图形函数学习07——画扇形函数》中介绍了CRect类、RECT结构体。在介绍完后,没有介绍它们怎样使用。实际上,这些类和结构体对象或指针也是我们学习过的绘图函数的参数类型,与使用(x,y)坐标做参数对照,构成了这些绘图函数的重载形式。由于这些函数已经学习过,这里仅做简要介绍。
一、绘制像素点函数的重载形式
       原型:a.COLORREF SetPixel( POINT point,COLORREF crColor);
                  b.BOOL SetPixelV(POINT point,COLORREF crColor);
       参数:点结构体POINT对象,此处也可以使用CPoint类对象
       返回值:a.返回使用的颜色值,类型为COLORREF
                     b.绘制成功返回非0数,失败返回0
       说明:a、b函数均为CDC类的成员函数,需要CDC类指针调用。
二、绘制直线段函数的重载
       原型:CPoint MoveTo(POINT point);
       参数:点结构体POINT对象(也可使用CPoint类对象)
       返回值:返回移动前的位置,需用CPoint类对象接收
       原型:BOOL LineTo(POINT point);
       参数:点结构体POINT对象(也可使用CPoint类对象)
       返回值:BOOL类型,画线成功返回非0数,失败返回0
       说明:MoveTo、LineTo两个函数均属于CDC类的成员函数,使用时需要CDC对象或指针调用。
三、绘制矩形函数的重载
       原型:BOOL Rectangle(LPCRECT lpRect);
       参数:LPCRECT类型的指向矩形类CRect对象的指针(也可使用LPRECT类型结构体指针)
       返回值:BOOL类型,绘制矩形成功返回非0数,失败返回0
       说明:Rectangle是CDC类的成员函数,使用时需要CDC对象或指针调用。
四、绘制椭圆函数
       原型:BOOL Ellipse (LPCRECT lpRect);
       参数:LPCRECT类型的指向矩形类CRect对象的指针(也可使用LPRECT类型结构体指针)
       返回值:BOOL类型,椭圆绘制成功返回非0数,失败返回0
       说明:Ellipse函数是CDC类的成员函数,使用时需要CDC对象或指针调用
五、绘制椭圆弧函数
       原型:BOOL Arc(LPCRECT lpRect,POINT ptStart,POINT ptEnd);
       参数:
          参1 LPCRECT lpRect指向内切矩形的指针(使用LPRECT指针也可)
          参2 POINT ptStart 弧线起点点结构体对象(也可使用CPoint类对象)
          参3 POINT ptEnd 弧线终点点结构体对象(同上)
       返回值:BOOL类型,弧线绘制成功返回非0数,失败返回0
       说明:Arc函数是CDC类的成员函数,使用时需要CDC对象或指针调用
六、绘制扇形函数
       原型:BOOL Pie(LPCRECT lpRect,POINT ptStart,POINT ptEnd);
       参数:同椭圆弧函数
       返回值:BOOL类型,弧线绘制成功返回非0数,失败返回0
       说明:Arc函数是CDC类的成员函数,使用时需要CDC对象或指针调用。 
七、使用上述重载函数绘制图形程序举例
       题目:在自定义坐标系中,(1)在原点半径25像素内使用SetPixelV绘制红色填充圆;(2)将填充色定义为透明,以窗口宽度、高度的75%绘制矩形、矩形的内切椭圆,线型为实线、2像素宽、红色;(3)将线的颜色调整为蓝色,线宽调整为4像素,将第一象限的椭圆绘制成蓝色椭圆弧;(4)按绘制弧线要求,将第三象限的椭圆绘制成扇形,填充色仍为透明。
      代码(放到OnDraw函数中可运行)如下:

//一、自定义坐标系CRect rect;GetClientRect(rect);pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetWindowExt(rect.Width(), rect.Height()); pDC->SetViewportExt(rect.Width(), -rect.Height()); pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);
//二、在原点半径25像素内使用SetPixelV绘制红色填充圆CPoint point(-25,-25); //声明CPoint对象for (int i = -25; i <= +25; i++) {for (int j = -25; j <= +25; j++) {point.x = i;point.y = j;if (point.x * point.x + point.y * point.y < 625) {pDC->SetPixelV(point, 0x0000ff);}}}
//三、绘制矩形及矩形的内切椭圆CPen redPen;redPen.CreatePen(PS_SOLID, 2, 0x0000ff);CPen* oldPen = pDC->SelectObject(&redPen);CBrush* oldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);RECT myRect;myRect.left = -rect.Width() * 0.75 / 2;myRect.top = rect.Height() * 0.75 / 2;myRect.right = rect.Width() * 0.75 / 2;myRect.bottom = -rect.Height() * 0.75 / 2;LPRECT lpRect = &myRect;pDC->Rectangle(lpRect);pDC->Ellipse(lpRect);pDC->SelectObject(oldPen);oldPen->DeleteObject();
//四、将椭圆在第一象限部分绘制成蓝色椭圆弧CPen bluePen(PS_SOLID, 4, 0xff0000);oldPen = pDC->SelectObject(&bluePen);POINT start,end;start.x = myRect.right;start.y = 0;end.x = 0;end.y = myRect.top;pDC->Arc(lpRect, start, end);
//五、在第三象限绘制无填充蓝色扇形start.x = myRect.left;start.y = 0;end.x = 0;end.y = myRect.bottom;pDC->Pie(lpRect, start, end);pDC->SelectObject(oldBrush);pDC->SelectObject(oldPen);
//说明:当填充色选择透明时,前后绘制的图形不会被覆盖,都可以看到。

程序运行结果截图:


http://www.ppmy.cn/embedded/138226.html

相关文章

使用Web Components构建模块化Web应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 引言 Web Co…

微积分复习笔记 Calculus Volume 1 - 5.3 The Fundamental Theorem of Calculus

5.3 The Fundamental Theorem of Calculus - Calculus Volume 1 | OpenStax

FastGPT部署通义千问Qwen和智谱glm模型|OneAPI配置免费的第三方API

继这篇博客之后 从零开始FastGPT本地部署|Windows 有同学问&#xff0c;不想在多个平台申请API-Key&#xff0c;不好管理且要付费&#xff0c;有木有白嫖方案呀&#xff1f; 答&#xff1a;有啊。用硅基流动。 注册方法看这篇 【1024送福利】硅基流动送2000万token啦&#xff0…

第九章DIV+CSS布局

9.1 DIVCSS概述 DIV CSS 是一种网页布局技术。其中&#xff0c;DIV&#xff08;division&#xff09;是 HTML 中的一个标签&#xff0c;主要用于划分网页的区域&#xff0c;它本身没有任何样式&#xff0c;只是一个块级元素。CSS&#xff08;Cascading Style Sheets&#xff…

数据研发基础 | 什么是流批一体

流批一体的概念是可能出现在大厂的面试题中的&#xff0c;虽然就算大厂实习也没机会实操这样的高级操作&#xff0c;学一点概念&#xff0c;面试多少是能说上一两句的。大致就是希望一套代码能同时在批处理和流处理中运行&#xff08;同时做离线计算和实时计算&#xff09;。下…

CSS预编译器:让样式编写更高效的秘密武器(6)

在现代前端开发中&#xff0c;CSS 预编译器是一种非常有用的工具&#xff0c;它通过扩展 CSS 语言的功能&#xff0c;帮助开发者更高效地编写和维护样式代码。本文将介绍 CSS 预编译器的基本原理&#xff0c;并重点讲解 LESS 的安装和使用方法。 1. 基本原理 编写 CSS 时&…

[A-18]ARMv8/ARMv9-Memory-内存空间的属性(Attributes Properties)

ver0.1 [看前序文章有惊喜,关注“浩瀚架构师”,可以解锁全部文章] 前言 在宏伟的ARM的内存世界中VMSA中,属性这个议题算不上最亮的星,就和屏幕前的你和我一样,平凡的活在这个茫茫然的人世间。纵使“丈夫贫践应未足,今日相逢无酒钱。”,也不要灰心面对生活,因为“山重…

ODOO学习笔记(7):模块化架构(按需安装)

一、Odoo模块化架构概述 Odoo是一个功能强大的企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;其模块化架构是它的核心优势之一。这种架构允许系统通过添加、移除或修改不同的模块来灵活地适应企业的各种业务需求。 核心模块与自定义模块&#xff1a; Odoo本身带有一…