如何用MFC画出直线、虚线、折线、圆、椭圆、矩形、弧形(附上源码)

2024-06-04 01:48

本文主要是介绍如何用MFC画出直线、虚线、折线、圆、椭圆、矩形、弧形(附上源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我创建的工程名字是默认的,叫MFCApplication3

首先在MFCApplication3Dlg.h这个文件中添加构造说明:

public:CPen m_pen[5];CPoint m_point[5];
public:void DrawLine(CDC *pDC);void DrawPolyline(CDC *pDC);void DrawPolygon(CDC *pDC);void DrawRect(CDC *pDC);void DrawRoundRect(CDC *pDC);void DrawEllipse(CDC *pDC);void DrawArc(CDC *pDC);void DrawAngleArc(CDC *pDC);
然后在MFCApplication3Dlg.cpp这个文件里面更改些东西和加点程序:

首先找到这个CMFCApplication3Dlg::CMFCApplication3Dlg(CWnd* pParent /*=NULL*/): CDialogEx(CMFCApplication3Dlg::IDD, pParent),这个创建的时候就自动产生了,改成这样:

CMFCApplication3Dlg::CMFCApplication3Dlg(CWnd* pParent /*=NULL*/): CDialogEx(CMFCApplication3Dlg::IDD, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//初始化画笔、点变量数组m_pen[0].CreatePen(PS_SOLID, 1, RGB(255, 0, 0));     //红色实线,1像素宽---参数:样式、宽度、颜色m_pen[1].CreatePen(PS_SOLID, 6, RGB(0, 255, 0));     //绿色实线,6像素宽m_pen[2].CreatePen(PS_DASH, 1, RGB(255, 0, 0));      //红色虚线,必须为一个像素宽m_pen[3].CreatePen(PS_DOT, 1, RGB(0, 0, 255));       //蓝色点线,必须为一个像素宽m_pen[4].CreatePen(PS_DASHDOTDOT, 1, RGB(255, 0, 0));//红色双点虚线,必须为一个像素宽//绘制多边形的点数组m_point[0].x = 10;m_point[0].y = 100;m_point[1].x = 10;m_point[1].y = 120;m_point[2].x = 100;m_point[2].y = 105;m_point[3].x = 170;m_point[3].y = 120;m_point[4].x = 170;m_point[4].y = 100;
}

然后再继续找到这个函数void CMFCApplication3Dlg::OnPaint(),将里面的东西改成这样:

void CMFCApplication3Dlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文CBrush brush(RGB(190, 190, 190));//画刷dc.SelectObject(&brush);//将画刷选入DCDrawLine(&dc);DrawPolyline(&dc);DrawPolygon(&dc);DrawRect(&dc);DrawRoundRect(&dc);DrawEllipse(&dc);DrawArc(&dc);DrawAngleArc(&dc);if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}
然后继续在刚刚的同一个的MFCApplication3Dlg.cpp : 实现文件中,添加绘图函数:

//绘制直线函数
void CLineTestDlg::DrawLine(CDC *pDC)
{CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔for(int i=0;i<5;i++) {pDC->SelectObject(&m_pen[i]);        //将画笔选入DCpDC->MoveTo(20,20+i*15);         //设置DC当前点pDC->LineTo(170,20+i*15);            //绘制直线}pDC->SelectObject(oldPen);       //回复DC原画笔
}//绘制折线
void CLineTestDlg::DrawPolyline(CDC *pDC)
{CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔for(int i=0;i<5;i++){for(int j=0;j<5;j++){m_point[j].y+=35;       //每次下移35个像素}pDC->SelectObject(&m_pen[i]);pDC->Polyline(m_point,5);}pDC->SelectObject(oldPen);
}//绘制多边形
void CLineTestDlg::DrawPolygon(CDC *pDC)
{for(int j=0;j<5;j++)m_point[j].y+=75;   //数组中的点下移75个像素CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔for(int i=0;i<5;i++){for(int j=0;j<5;j++){m_point[j].y+=35;   //每次绘制图形下移35个像素}pDC->SelectObject(&m_pen[i]);pDC->Polygon(m_point,5); //绘制多边形}pDC->SelectObject(oldPen);
}//绘制矩形
void CLineTestDlg::DrawRect(CDC *pDC)
{CRect rect(150,20,220,80);CPen *oldPen=pDC->SelectObject(&m_pen[0]);for(int i=0;i<5;i++){rect.OffsetRect(80,0);//每次绘图右移80个像素pDC->SelectObject(&m_pen[i]);pDC->Rectangle(&rect);//绘制矩形}pDC->SelectObject(oldPen);
}//绘制圆角矩形
void CLineTestDlg::DrawRoundRect(CDC *pDC)
{CRect rect(150,150,220,230);CPen *oldPen=pDC->SelectObject(&m_pen[0]);for(int i=0;i<5;i++){rect.OffsetRect(80,0);//每次绘图右移80个像素pDC->SelectObject(&m_pen[i]);pDC->RoundRect(&rect,CPoint(15,15));}pDC->SelectObject(oldPen);
}//绘制椭圆
void CLineTestDlg::DrawEllipse(CDC *pDC)
{CRect rect(150,260,220,310);CPen *oldPen=pDC->SelectObject(&m_pen[0]);for(int i=0;i<5;i++){rect.OffsetRect(80,0);pDC->SelectObject(&m_pen[i]);pDC->Ellipse(&rect);}pDC->SelectObject(oldPen);
}//绘制弧线
void CLineTestDlg::DrawArc(CDC *pDC)
{CRect rect(150,400,220,460);CPoint ptStart(170,440);CPoint ptEnd(210,400);CPen *oldPen=pDC->SelectObject(&m_pen[0]);for(int i=0;i<5;i++){rect.OffsetRect(80,0);ptStart+=CPoint(80,0);ptEnd+=CPoint(80,0);pDC->SelectObject(&m_pen[i]);pDC->Arc(&rect,ptStart,ptEnd);}pDC->SelectObject(oldPen);
}//绘制直线与弧线
void CLineTestDlg::DrawAngleArc(CDC *pDC)
{CRect rect(150,500,220,560);CPoint ptCenter(185,600);CPoint ptStart(150,630);int r=30;float angleStart=0;float angleEnd=180;CPen *oldPen=pDC->SelectObject(&m_pen[0]);for(int i=0;i<5;i++){rect.OffsetRect(80,0);ptStart+=CPoint(80,0);pDC->MoveTo(ptStart);pDC->SelectObject(&m_pen[i]);pDC->AngleArc(ptCenter.x,ptCenter.y,r,angleStart,angleEnd);}pDC->SelectObject(oldPen);
}

然后点击运行,图就出来了,里面什么都有,大家想用哪个就用哪个吧。



结束了!MFC太难了,好多都看不懂了,哎,还是需要学习啊。

这篇关于如何用MFC画出直线、虚线、折线、圆、椭圆、矩形、弧形(附上源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028726

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

red5-server源码

red5-server源码:https://github.com/Red5/red5-server