MFC界面编程基础(06):简单绘图 您所在的位置:网站首页 基于mfc的鼠标画图程序有哪些 MFC界面编程基础(06):简单绘图

MFC界面编程基础(06):简单绘图

2024-07-06 12:41| 来源: 网络整理| 查看: 265

上一篇:MFC界面编程基础(05):利用向导创建MFC以及MFC框架中一些重要函数下一篇:MFC界面编程基础(07):文本编程 关于鼠标事件

根据我们前面学过是知识,用MFC向导生成一个单文档视图程序。在我们的主框架类中添加WM_LBUTTONDOWN消息的响应函数,具体操作如下:

在这里插入图片描述

从类视图中找到CMainFrame(继承自CFrameWnd),选择此类然后从属性面板中找到消息按钮(上图中标示2),在消息列表中找到WM_LBUTTONDOWN消息,添加,然后看我们的工程文件中都多了些什么???

第一处:在框架类头文件中添加了鼠标左键消息函数的函数声明 在这里插入图片描述第二处:在框架类cpp文件中添加了消息映射宏 在这里插入图片描述第三处:在框架列cpp文件中添加了处理鼠标左键消息的函数定义: -

根据前边我们学过的知识要完成MFC中的消息映射需要我们手动将这三处依次做一个添加,但是使用MFC的类向导我们很容易就能完成一个消息的添加,之后再对应生成的消息函数中做相应的处理即可。 我们再此OnLButtonDown函数中添加一个MessageBox消息,鼠标左键按下弹出一个提示框,然后执行程序。我们会惊奇的发现程序并未如我们所愿弹出消息框,why?我的世界凌乱了。。。 我们先搁置疑问,按照上述操作在视类中捕获鼠标左键消息并处理,看结果会如何? 在这里插入图片描述

此时弹出了对话框,说明视类捕获道理鼠标左键消息。但是为什么框架类捕获不到呢?我们前边在将文档/视图结构的时候说过,框架窗口是视窗口的父窗口,那么视类窗口就应该始终覆盖在框架类窗口之上。就好比框架窗口是一面墙,视类窗口就是墙纸,它始终挡在这面墙前边。也就是说,所有操作,包括鼠标单击、鼠标移动等操作都只能有视类窗口捕获,这也是框架类窗口为什么收不到鼠标左键消息的原因。

绘制线条

我们可以利用MFC提供的CClientDC类来实现这一功能,这个类跟CPaintDC一样,也派生于CDC类。CClientDC是窗口客户区的设备描述环境,它应用在WM_PAINT消息之外的消息处理函数中。我们只需要定义一个CClientDC对象,然后就可以利用该对象提供的函数进行绘图操作了。CClientDC对象构造时接收一个参数,即:要进行图像绘制的窗口指针对象。 CClientDC提供的划线函数:

绘制线条的起始点:MoveTo(CPoint p) p – 起始点坐标绘制一条到指定点的线:LineTo(CPoint p) p – 终点坐标

在程序的视图窗口用鼠标画一条线: 在视类中定义一CPoint类型成员变量m_oldPoint,添加鼠标左键按下和弹起的消息处理函数,记录鼠标左键按下时的坐标,在鼠标弹起时,通过两个坐标点将线画到视类窗口屏幕区域。

在这里插入图片描述

绘制彩色线条

我们实现的画线功能,绘制的都是黑色的线条。这是因为设备描述表中有一个默认的黑色画笔。如果想要绘制其他颜色的线条,首先需要创建一个特定颜色的画笔,然后将此画笔选入设备描述表中,接下俩绘制的线条的颜色就由这个新画笔决定了。 我们可以通过MFC提供的类CPen来创建画笔对象。

CPen(int nPenStyle,int nWidth,COLORREF crColor);

第一个参数:指定笔的线型(实线、点线、虚线等) 第二个参数:线的宽度 第三个参数:颜色,是一个RGB宏 COLORREF RGB(BYTE bRed,BYTE bGreen,BYTE bBlue)

当构建一个GDI(图形设备接口)对象后,该对象并不会马上生效,必须选入设备描述表,它才会在以后的操作中生效。可以使用SelectObject函数把GDI对象选入设备描述表中,并且该函数会返回指向先前备选对象的指针,这主要是为了完成当前绘制之后再次利用SelectObject把先前的GDI对象选入设备描述表,以便使其恢复到先前状态。

在这里插入图片描述

绘制连续线条

如果我们想让程序实现Windows画图板那样的画线功能,应如何实现? 为了绘制连续的线条,首先需要得到线条的起点,前面我们已经实现了。然后需要捕获鼠标移动过程中的每个点,这可以通过捕获鼠标移动消息(WM_MOUSEMOVE)来实现。在此消息相应函数中,在依次捕获的各个点之间绘制一条非常短的线段,从而就可以绘制出一条连续的线条。

思路:

需要一变量来标识鼠标左键是否按下这一状态在鼠标移动消息响应函数中,如果鼠标是按下状态就开始绘图,弹起之后停止绘图。

在视类头文件中添加私有成员变量: BOOL m_bDraw; 在视类构造函数中将此变量初始化为FALSE m_bDraw = FALSE; 当鼠标左键按下去时,在视类的OnLButtonDown函数中将此变量初始化为真 m_bDraw = TRUE; 当鼠标左键弹起,在视类的OnLButtonUp函数中将此变量初始化为假 m_bDrae = FALSE; 在视类的OnMouseMove函数中完成线段的绘制 在这里插入图片描述

CDC类中封装的绘图函数还有很多,直接通过CDC类对象调用直接使用即可,可以通过CPen来调节样式,图形函数的参数可参考具体的API使用文档。 在这里插入图片描述

使用画刷绘图

在默认情况下由Rectangle、Ellipse以及其它CDC输出函数画出的封闭图形填充着白色像素点。通过创建GDI画刷并在画图之前将它选入设备描述表可以改变图形的填充颜色。MFC的CBrush类封装了GDI画刷。 画刷有三种基本类型:单色,带阴影线,带图案。单色画刷填充的是单色,阴影线画刷采用预先定义好的交叉线图案填充图形,这中图案有六种,图案画刷用位图来填充图形。 CBrush类为每种画刷提供了一个构造函数。

单色:CBrush( COLORREF crColor ); crColor 指定画刷的前景色(RGB方式)。 阴影:CBrush( int nIndex, COLORREF crColor ); nIndex 指定画刷阴影线采用的风格,取值如下:HS_BDIAGONAL 45度的向下影线(从左到右)HS_CROSS 水平和垂直方向以网格线作出阴影HS_DIAGCROSS 45度的网格线阴影HS_FDIAGONAL 45度的向上阴影线(从左到右)HS_HORIZONTAL 水平的阴影线HS_VERTICAL 垂直的阴影线 creColor指定的阴影线的颜色。 图案:CBrush( CBitmap*pBitmap ); pBitmap 指向CBitmap对象的指针,该对象指定了画刷要绘制的位图。

说明:

类CBrush一共有四个覆盖的构造函数。不带参数的那个构造函数构造一个未初始化的CBrush对象,在使用该对象之前需要另外初始化。 如果使用了不带参数的那个构造函数,则必须用CreateSolidBrush、CreateHatchBrush、CreateBrushIndirect、CreatePatternBrush或CreateDIBPatternBrush来初始化返回的CBrush对象。如果使用了带参数的构造函数,则不再需要初始化CBrush对象。带参数的构造函数在出错时会产生一个异常,而不带参数的构造函数总是成功返回。 只带有一个参数COLORREF的构造函数用指定的颜色构造一个实线型的画刷。颜色是一个RGB值,可以用WINDOWS.H中的宏RGB构造出来。 带两个参数的构造函数构造一个阴影线型的画刷,参数:nIndex指定了阴影线模式的指数(index)。参数:crColor指定了画刷的颜色。 带有一个CBitmap型参数的构造函数构造一个模式化的画刷。参数指定一个位图。该位图应该是已经用CBitmap::CreateBitmap、CBitmap::CreateBitmapIndirect、CBitmap::LoadBitmap或CBitmap::CreateCompatiableBitmap建立或加载的位图。填充模式下的位图的最小尺寸为8像素×8像素。

上一篇:MFC界面编程基础(05):利用向导创建MFC以及MFC框架中一些重要函数下一篇:MFC界面编程基础(07):文本编程


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有