当前位置: 首页 > article >正文

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

        在《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.kler.cn/a/392519.html

相关文章:

  • Element-ui的使用教程 基于HBuilder X
  • 打造独特的博客封面:动态封面设置指南
  • Springboot + vue3 实现大文件上传方案:秒传、断点续传、分片上传、前端异步上传
  • 单片机:实现数码管动态显示(0~99999999)74hc138驱动(附带源码)
  • 活着就好20241225
  • 搭建Elastic search群集
  • 快速入门Zookeeper
  • 机器学习在医疗健康领域的应用
  • 【C++】类与对象的基础概念
  • Python网络爬虫与数据采集实战——什么是网络爬虫
  • PostgreSQL 锁判断
  • 继承和多态(上)
  • Kafka 之自定义消息拦截器【Kafka 拦截器】
  • 牛客小白月赛104-D小红开锁-模拟
  • Unity常见问题合集(一)
  • workerman的安装与使用
  • TCP/IP协议,TCP和UDP区别
  • L10.【LeetCode笔记】回文链表
  • QObject中QThreadData里面的postEventList和QObjectPrivate里面的postedEvents
  • caozha-comment(原生PHP评论系统)
  • 根据模型数据 处理流式数据 生成AI对话
  • [运维][Nginx]Nginx学习(1/5)--Nginx基础
  • QTableWidget的简单使用
  • Swift 开发教程系列 - 第11章:内存管理和 ARC(Automatic Reference Counting)
  • Redhat8.6安装MySQL8.0.31
  • 在启动 Spring Boot 项目时,报找不到 slf4j 的错误