目录

一、画直线

更改画笔样式

二、使用画刷画一个矩形

透明矩形

自定义颜色填充矩形

自定义图形填充矩形

四、实现一个画笔

五、画扇形

六、画椭圆

七、画圆

八、输出文本


一、画直线

画一条直线需要一个起点和一个终点,当鼠标按下时记录为起点坐标,鼠标弹起时记录为终点坐标。

首先在类向导增加鼠标左键按下事件,和鼠标左键弹起事件

通过类向导添加一个CPoint类型的成员变量用来记录鼠标左键按下时的位置

补充事件代码

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{   m_pOrigin = point;CView::OnLButtonDown(nFlags, point);
}void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{//获得设备上下文CDC* pDC = GetDC();//移动到起点位置pDC->MoveTo(m_pOrigin);//从地点到终点画一条直线pDC->LineTo(point);释放设备上下文ReleaseDC(pDC);CView::OnLButtonUp(nFlags, point);
}

更改画笔样式

在MFC中可以通过CPen重新定义一个画笔样式

CPen pen(笔形,线宽,颜色)

  • 笔形:PS_SOLID 实线, PS_DASH 虚线, PS_DOT 点线, PS_DOTDASH 点划线
  • 线宽:像素为单位
  • 颜色:RGB(RED,GREE,BLUR)

例如想将上面画出的直线改为5像素宽,绿色

这时候就需要自定义一个画笔,将设备上下文默认的画笔替换下来。但是要注意:当停止使用自定义画笔时需要将设备上下文的默认画笔替换回来

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{m_pOrigin = point;CView::OnLButtonDown(nFlags, point);
}void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{//获得设备上下文CDC* pDC = GetDC();定义画笔CPen pen(PS_SOLID, 5, RGB(0,255, 0));//替换设备上下文默认画笔,并保留原来画笔CPen* pOldPen = pDC->SelectObject(&pen);pDC->MoveTo(m_pOrigin);pDC->LineTo(point);//设备上下文回复原来的画笔pDC->SelectObject(pOldPen);释放设备上下文ReleaseDC(pDC);CView::OnLButtonUp(nFlags, point);
}

二、使用画刷画一个矩形

使用画刷绘制矩形时,需要矩形的左上角坐标和右下角坐标,当鼠标按下时记录为左上角坐标,鼠标弹起时记录为右下角坐标。

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{m_pOrigin = point;CView::OnLButtonDown(nFlags, point);
}void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{//画刷//获得设备上下文,与上面方式相比这种获得设备上下文dc是个局部变量,等程序结束后自动释放,就无序手动释放设备上下文CClientDC dc(this);//不透明画刷dc.Rectangle(CRect(m_pOrigin,point));CView::OnLButtonUp(nFlags, point);
}

透明矩形

如果想画出透明矩形,获得系统定义好的透明画刷,将设备上下文的默认画刷替换下来即可,当透明画刷不使用时需要将原来画刷替换回来

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{m_pOrigin = point;CView::OnLButtonDown(nFlags, point);
}void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{//画刷//获得设备上下文CClientDC dc(this);//透明画刷//获得系统透明画刷CBrush* brush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//更换设备上下文画刷CBrush* oldBrush = dc.SelectObject(brush);dc.Rectangle(CRect(m_pOrigin, point));//设备上下文换回原来的画刷dc.SelectObject(oldBrush);CView::OnLButtonUp(nFlags, point);
}

自定义颜色填充矩形

想要自定义矩形的填充,只需要绘制填充矩形时将自定义的画刷颜色填充作为参数传入即可

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{m_pOrigin = point;CView::OnLButtonDown(nFlags, point);
}void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{//画刷//获得设备上下文CClientDC dc(this);//画有填充色的矩形CBrush brush(RGB(255, 0, 0));dc.FillRect(CRect(m_pOrigin, point), &brush);CView::OnLButtonUp(nFlags, point);
}

自定义图形填充矩形

绘制自定义图形填充首先需要在资源视图里添加一个想要填充的图形,这里使用内置资源Bitmap绘制一个想要填充的图片。

第一步:添加Bitmap资源

右击“项目”,选择“添加”,添加“资源”

选择Bitmap,选择新建

第二步:绘制自定义图形

之后在“资源视图”里就可以查看到添加的资源

第三步:加载绘制的图片

声明一个Bitmap,从资源视图里加载刚才绘制的图片,以声明的Bitmap对象为参数,声明一格画刷对象即可

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{m_pOrigin = point;}void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{//画刷//获得设备上下文CClientDC dc(this);CBitmap bitmap;//从资源里加载图片放入bitmap中bitmap.LoadBitmap(IDB_BITMAP1);//以bitmap为参数,生成画刷对象CBrush brush(&bitmap);//填充矩形区域dc.FillRect(CRect(m_pOrigin, point), &brush);CView::OnLButtonUp(nFlags, point);
}

四、实现一个画笔

鼠标左键按下会随着鼠标移动开始绘制,当左键弹起时停止绘制

添加一个鼠标移动事件“OnMouseMove”,和一各成员参数“m_bDraw(bool)”记录鼠标左键是否被按下。当鼠标移动时首先判断m_bDraw,如果m_bDraw为true则左键按下,开始绘制,否则停止绘制

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{m_pOrigin = point;m_bDraw = TRUE;CView::OnLButtonDown(nFlags, point);
}void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{//按键抬起置为falsem_bDraw = false;CView::OnLButtonUp(nFlags, point);
}void CMFCApplication6View::OnMouseMove(UINT nFlags, CPoint point)
{CClientDC dc(this);//鼠标点击后才画线if (m_bDraw) {dc.MoveTo(m_pOrigin);dc.LineTo(point);m_pOrigin = point;}CView::OnMouseMove(nFlags, point);
}

五、画扇形

扇形只需要在鼠标左键弹起前每次的起点都为鼠标左键按下时的即可

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{m_pOrigin = point;m_bDraw = TRUE;CView::OnLButtonDown(nFlags, point);
}void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{//按键抬起置为falsem_bDraw = false;CView::OnLButtonUp(nFlags, point);
}void CMFCApplication6View::OnMouseMove(UINT nFlags, CPoint point)
{CClientDC dc(this);CPen pen(PS_DOT, 1, RGB(0, 255, 255));//画扇形CPen* oldPen = dc.SelectObject(&pen);if (m_bDraw) { dc.MoveTo(m_pOrigin);dc.LineTo(point);}dc.SelectObject(oldPen);CView::OnMouseMove(nFlags, point);
}

六、画椭圆

椭圆形绘制机制是在矩形的基础上,只需调用绘制椭圆形函数即可。

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{m_pOrigin = point;CView::OnLButtonDown(nFlags, point);
}void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{CClientDC dc(this);CPen pen(PS_SOLID, 5, RGB(0, 0, 255));CPen* oldpen = dc.SelectObject(&pen);//画椭圆dc.Ellipse(CRect(m_pOrigin, point));CView::OnLButtonUp(nFlags, point);
}

七、画圆

void CMFCApplication6View::OnLButtonDown(UINT nFlags, CPoint point)
{m_pOrigin = point;CView::OnLButtonDown(nFlags, point);
}void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{m_bDraw = false;CClientDC dc(this);CPen pen(PS_SOLID, 5, RGB(0, 0, 255));CPen* oldpen = dc.SelectObject(&pen);//画圆long len = point.x - m_pOrigin.x;dc.Ellipse(m_pOrigin.x, m_pOrigin.y, m_pOrigin.x + len, m_pOrigin.y + len);CView::OnLButtonUp(nFlags, point);
}

八、输出文本

void CMFCApplication6View::OnLButtonUp(UINT nFlags, CPoint point)
{m_bDraw = false;CClientDC dc(this);CString str("小明来喽");//设置文字颜色dc.SetTextColor(RGB(0, 255, 0));//设置文字字体CFont font;//创建点阵字体//传递多少点字体,传入200,字体是20font.CreatePointFont(200, "华文行楷");//输出字符串dc.TextOut(point.x, point.y, str, str.GetLength());CView::OnLButtonUp(nFlags, point);
}

使用MFC绘制一些简单图形相关推荐

  1. c++之openGL在VS中的配置及简单图形绘制

    VS中openGL的配置 相关资源下载: 链接:https://pan.baidu.com/s/1hRlxbckgLsNiS87k5CPvLg 提取码:tz87 以vs2010为例: 将下载的压缩包解 ...

  2. [Qt教程] 第11篇 2D绘图(一)绘制简单图形

    [Qt教程] 第11篇 2D绘图(一)绘制简单图形 楼主  发表于 2013-4-23 12:52:35 | 查看: 1398| 回复: 5 绘制简单图形 版权声明 该文章原创于Qter开源社区,作者 ...

  3. WebGL(三)——学习Canvas及简单图形绘制

    WebGL(三)--学习Canvas及简单图形绘制 Canvas简介 canvas是HTML5新增的一个可以使用javascript脚本在其中绘制图像的HTML元素(容器),它可以用来制作图像.动画, ...

  4. java 绘制长方形_Java入门:绘制简单图形

    在上一节,我们学习了如何使用swing和awt工具创建一个空的窗口,本节学习如何绘制简单图形. 基本绘图介绍 Java中绘制基本图形,可以使用Java类库中的Graphics类,此类位于java.aw ...

  5. 使用MarkDown+mermaid-JS绘制简单图形

    文章目录 写在前面 简介 流程图(Flowchart) 不带样式的流程图 带样式的流程图(程序框图) 一个例子(辗转相除法) 另一个例子(唐朝三省六部制) 时序图 状态图 类图 甘特图(Gantt) ...

  6. python opencv 绘制简单图形

    09-python opencv 绘制简单图形 09-python opencv 绘制简单图形 概述 实现过程 引用与创建空图 绘制直线 绘制矩形 绘制圆 绘制椭圆 添加文字 显示图像 源代码 运行结 ...

  7. python turtle画有趣的图形_Python turtle库绘制简单图形

    一.简介 Python中的turtle库是一个直观有趣的图形绘制函数库.turtle库绘制图形有一个基本框架:一个小海龟在坐标系中爬行,其爬行轨迹形成了绘制图形. 二.简单的图形列举 1.绘制4个不同 ...

  8. FxCAD实验一 简单图形的绘制

    实验一.绘制一个简单矩形 绘制的图形如下: 第1步: 在解决方案里找到"ToolWindowHost.cs" 双击打开后如图: 添加一个按钮(矩形),ID设置为 btnBox 双击 ...

  9. Python之Turtle库绘制简单图形

    Python之Turtle库绘制简单图形 来绘制正方形.三角形.五边形.五角形 import turtle #引入turtle库pen=turtle.Turtle() #创建turtle类型的画笔 # ...

最新文章

  1. pxe网络安装操作系统 原理与详细过程
  2. 160个Crackme027之First CD-Check
  3. excel2010冻结行列
  4. 什么是空间复杂度(What is actually Space Complexity ?)
  5. Hibernate【inverse和cascade属性】知识要点
  6. 为什么Spring的健康状况会再次下降,下降,上升,上升,上升和下降?
  7. 高效程序员的45个习惯の欲速则不达
  8. 什么是弱网测试?为什么要进行弱网测试?怎么进行弱网测试?
  9. 如何用linux做共线性分析,「生信」共线性分析——MCScanX
  10. 【IoT】产品设计:用实际案例,手把手教你写PRD(产品需求文档)
  11. python变异系数,Python Scipy stats.variation()用法及代码示例
  12. 任天堂游戏 html5,明年的预备阵容!任天堂承诺却还没出的作品
  13. win10内存占用率过高怎么办_Win10系统硬盘占用率100%各种卡死怎么办?
  14. 奈奎斯特与香农定理_奈奎斯特定理和香农定理解析
  15. Codeforces Global Round 8
  16. 《一个64位操作系统的设计与实现》学习实践3-boot加载loader
  17. 智能家居正进化成人们想要的样子
  18. Python接私活,兼职也可以月入10000+。Python爬虫兼职
  19. Python习题十三套汇总
  20. Android自定义view摇杆,Android 自定义摇杆控件(使用图片)

热门文章

  1. 洛谷P2851 [USACO06DEC]The Fewest Coins G 题解
  2. c语言程序设计教程2014版,C语言程序设计案例教程(第3版)
  3. Nginx 反向代理 负载均衡 动静分离 高可用 原理
  4. java cryptography_Java密码体系结构简介:Java Cryptography Architecture (JCA) Reference Guide...
  5. iphone 的文件目录和简单介绍
  6. mysql pid无法写入_ERROR /usr/libexec/mysqld:写入文件'/var/run/mysqld/mysqld.pid'时出错(错误代码:28)...
  7. 【06月21日】北上资金持股比例排名
  8. 马上就要十一大长假了!还没订好机票?用Python写了一个钉钉订低价票脚本!
  9. cad直线和圆弧倒角不相切_cad中绘制圆角倒角有哪些技巧?
  10. ArcMap导入Excel数据显示没有注册类