mfc画图板的设计采用vc++

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1.添加菜单项“绘图”如下图2.在绘图菜单项下继续添加菜单命令,如下图接着按下快捷键Ctrl+W;添加菜单项命令响应函数如下图按照上面标的顺序逐个添加函数接着在view类中添加个私有的成员变量,m_nDrawType来记录用户选择的菜单命令,如下图接着在view类的构造函数中对其初始化为0;之所以要添加这个参数,目的是当用户选择不同的操作时候,我们可以利用switch...case语句来选择进行用户的响应;所以接着要对不同的菜单命令设置不同的m_nDrawType;如下图所示分别设置;画线画矩形等,都需要记录鼠标的起始位置和终止位置,那么我们就需要添加鼠标的位置变量,首先添加一个鼠标的起始位置变量在view类中,m_ptOrigin,这个变量是CPoint类型的数据。把他设置成私有成员;在view类构造函数中将其初始化为0;添加一个鼠标按下消息响应函数,如下图然后编写该消息响应函数,首先将鼠标左键按下时的初始坐标位置记录给m_ptOrigin变量;point是(鼠标的位置)然后绘图是在鼠标左键弹起时候绘图的,这个应该不难想明白的。所以按照添加鼠标左键按下响应函数的过程一样,添加一个鼠标左键弹起的消息响应函数,然后在里面编写绘图程序;第一步,获取DC第二步,利用switch。。。。Case语句响应用户的菜单命令;首先编写点的绘图程序;然后编译运行一下,没问题,可以使用如下图下面编写绘制线条的程序暂时先不选择画笔,让它默认的来画线编译运行,没问题,如下图所示下面编写矩形的程序编译运行,如下,成功暂时不管这个画刷的透明与否;绘制椭圆程序编译运行之后可以下面绘制连续线条的编程绘制连续线条的思路是:首先获得鼠标的起始点,其次要绘制连续线条的话,那么鼠标移动过程中的每一个点都应该要记住的,这个可以利用鼠标移动的WM消息WM_MOUSEMOVE获取,然后在各点之间连接非常短的线就OK了。然后我们就可以添加一个该消息的响应函数OnMouseMove(),在该函数中绘图就行了。过程如下图所示在里面编写程序但是有一个问题,就是我们希望在鼠标移动的过程中就绘图,那么就需要设置一个if语句来判断鼠标是否按下,如果按下就开始绘图,没有按下就不管了。所以在view类中添加一个BOOL型的私有变量,m_bDraw,当鼠标左键按下时候这个值设置为TRUE,否则为FALSE,初始化的时候给这个值初始化为FALSE;当鼠标左键弹起时候为FALSE;在voidCGraphicView::OnLButtonDown(UINTnFlags,CPointpoint)中即鼠标左键按下时给这个值赋值为TRUE;在鼠标左键弹起时候给他赋值为FALSE;在voidCGraphicView::OnLButtonUp(UINTnFlags,CPointpoint)中赋值然后在voidCGraphicView::OnMouseMove(UINTnFlags,CPointpoint)函数中判断m_bDraw的值,来绘图1.获取客户区DC;2.创建一个宽度为1的红色实线画笔3.创建一个旧画笔,将新创建的画笔选入4.If语句判读,进行画图。。。。。。。。。。。。。。。。。。。注意,这块儿有个问题出现了,那就是,我们是要在鼠标移动过程中绘图,将每个点连接起来,那么每连接了两个点之后,再画后面的线条的时候起始点就应该是上一次画线的终点才可以,所以需要在if语句中的画线程序的最后面添加改变起始点坐标。5.恢复画刷编译运行,如下图所示;连续线倒是可以画了,但是其他的功能都不正常了,比如说选择绘图里面的点,也是这样的结果,查找一下原因,就是,当鼠标移动的时候系统会自动调用OnMouseMove()这个函数,导致其他的功能都不正常了。然而我们是要让这个连续画线时才启用这个功能的,所以,我们可以有两种办法来解决这个问题,一个是加入if语句,判断一下m_nDrawType是否为5,一个是用witch。。。Case语句来做第一种办法如下:编译运行如下图各功能都正常,可以用;下面是用witch。。。Case语句来做编译运行正常,可以用;接下来绘制扇形扇形的绘制,就是初始位置不变,连续画线到终点,那么很简单,只需要把连续画线里面的修改初始位置的那句程序删掉就可以了;程序也写在OnMouseMove()函数中;如下图所示编译运行,结果如下所示;下面来解决画刷的问题。因为之前没有设置画刷的,所以在画矩形、椭圆的时候,会出现覆盖的现象,所以现在我们在整个菜单项里面添加一个画刷菜单项,其中画刷的选择项有简单画刷、位图画刷、透明画刷。如下图所示先来创建他们,用CBrush类来创建画刷对象先创建一个红色的画刷1.创建一个红色画刷对象2.获取设备描述表3.利用红色画刷填充所画矩形区域,利用FillRect()函数编译运行,如下图所示,证明添加成功了接着创建位图画刷1.创建一个位图按快捷键Ctrl+R,添加一个位图资源,如下图所示,我们创建一个这样的位图2.创建位图对象3.加载位图资源4.创建位图画刷,利用这个函数CBrush(CBitmap*pBitmap);5.填充6.编译运行如下结果正常,可以用下面来创建透明画刷1.利用staticCBrush*PASCALFromHandle(HBRUSHhBrush);函数来创建画刷,还有为了创建空画刷,需要引入这个函数HGDIOBJGetStockObject(intfnObject//stockobjecttype);它可以设置pen,brush,fonts,palettes(调色板)的样式2.但是它的返回值是HGDIOBJ句柄,我们需要的HBRUSH句柄,所以需要进行强制类型转换3.程序如下编译运行如下所示,可以看到是透明的,可以用下面来进行画刷的分配,就是比方说,我们画图时候先选择画刷--简单画刷,然后在绘图中选择矩形啊什么的,就是把这两个板块融合起来也利用switch。。。。Case语句1.修改简单画刷ID为IDM_JDHS,修改位图画刷的ID为IDM_WTHS,修改透明画刷的ID为IDM_TMHS;过程不贴图了,应该都会;2.接着给他们添加响应函数,注意选在在view类中添加添加成功后如下图在他们的函数中设置m_nDrawType的值,设置后结果如下所示然后在voidCGraphicView::OnLButtonUp(UINTnFlags,CPointpoint)函数中修改程序,首先将透明画刷作为默认画刷;也就是其他两个画刷只是创建但是DC并不选择就行了修改程序如下编译运行如下,不选择任何画刷;证明默认画刷的确是透明画刷;可以用;;同样的道理将位图画刷和透明画刷的选择程序添加进入switch。。。Case语句中程序如下图所示下来添加设置对话框,来设置线型和线宽设置对话框的ID设置为IDD_DIALOG_SETTING在上面添加控件如下图所示1.添加线宽的编辑框,设置其ID为ID_EDIT_LINEWIDTH2.添加一个组框,结果如下图所示在菜单项的编辑里面添加一个设置菜单,将其ID设置为IDM_SETTING;在view类中添加变量,线宽(m_nLineWidth)线型(m_nLineStyle)并且初始化为0;在设置菜单项里面添加颜色菜单;设置它的ID如下图所示添加命令响应函数1.添加设置命令响应函数如下图2.添加颜色命令响应函数,如下图所示*注意,这两个函数都是在view类中添加的分别在里面添加代码1.对设置编程1)对设置的对话框进行创建类如下图,点击OK点击OK此时查看一下,创建成功了如下图下来操作设置对话框,我们要给对话框做一些调整第一个,在虚线单选框中设置属性,将group选上,关于单选框的用法可以参考这个博客接下来,对设置对话框添加变量,如下图所示分别给IDC_EDIT_LINEWIDTH和IDM_XUXIAN添加变量m_nLineWidth和m_nLineStyle如下图此时查看一下添加成功了注意,对话框构造函数中,自动对这两个值初始化了,我们把第二个改过来,改为0;接下来一切就绪,在设置里面编程先在view类中添加预处理命令如下图,意思就是将CSettingDlg类的头文件添加到view中,如下图所示然后先在OnSetting函数中编辑一下程序,如图所示编译运行,点击设置,会出现下图证明先在这个对话框创建成功了。然后将对话框中设置的值传递给view类中的对应值里面如下图所示现在值传递进去了,但是还没有让画笔选上,所以还需要编辑画笔,先在voidCGraphicView::OnLButtonUp(UINTnFlags,CPointpoint)函数中编辑如下代码编译运行,如下图,运行正常,可以用;下来修改voidCGraphicView::OnMouseMove(UINTnFlags,CPointpoint)这个函数中的画笔,不要忘记先删掉以前编辑的画笔修改后的代码如下所示voidCGraphicView::OnMouseMove(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultswitch(m_nDrawType){case6:///////////////////////////画连续线//if(6==m_nDrawType)//{////////获取DCCClientDCdc(this);///////////////创建宽度为1的红丝实线画笔CPenpen(m_nLineStyle,m_nLineWidth,RGB(255,0,0));/////////暂时创建一个红色画笔dc.SelectObject(&pen);///////////////////////////选择画笔//////////////创建一个旧画笔,将新创建的画笔选入CPen*OldPen=dc.SelectObject(&pen);if(TRUE==m_bDraw){dc.MoveTo(m_ptOrigin);/////移动到起始点dc.LineTo(point);//////////画线////////修改起始坐标m_ptOrigin=point;}dc.SelectObject(OldPen);//////////恢复画笔//}}switch(m_nDrawType){case5://////////////////////////////////画扇形//if(6==m_nDrawType)//{////////获取DCCClientDCdc(this);///////////////创建宽度为1的红丝实线画笔CPenpen(m_nLineStyle,m_nLineWidth,RGB(255,0,0));/////////暂时创建一个红色画笔dc.SelectObject(&pen);///////////////////////////选择画笔//////////////创建一个旧画笔,将新创建的画笔选入CPen*OldPen=dc.SelectObject(&pen);if(TRUE==m_bDraw){dc.MoveTo(m_ptOrigin);/////移动到起始点dc.LineTo(point);//////////画线////////修改起始坐标//m_ptOrigin=point;}dc.SelectObject(OldPen);//////////恢复画笔//}}CView::OnMouseMove(nFlags,point);}编译运行如下所示可以看出,运行都正常,非常好;接下来操作颜色的设置在voidCGraphicView::OnColor()函数中编辑代码首先在view类中添加一个颜色变量m_nColor,如下图所示,在dlg类中也添加这个变量注意变量类型添加好之后,首先在这个函数中编辑代码编译运行,结果如下可以看到,颜色对话框已经出来了,下面就是传递

1 / 52
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功