mfc画图板的设计采用vc++.doc_第1页
mfc画图板的设计采用vc++.doc_第2页
mfc画图板的设计采用vc++.doc_第3页
mfc画图板的设计采用vc++.doc_第4页
mfc画图板的设计采用vc++.doc_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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;在void CGraphicView:OnLButtonDown(UINT nFlags, CPoint point) 中即鼠标左键按下时给这个值赋值为TRUE;在鼠标左键弹起时候给他赋值为FALSE;在void CGraphicView:OnLButtonUp(UINT nFlags, CPoint point) 中赋值然后在void CGraphicView:OnMouseMove(UINT nFlags, CPoint point)函数中判断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.利用static CBrush* PASCAL FromHandle( HBRUSH hBrush );函数来创建画刷,还有为了创建空画刷,需要引入这个函数HGDIOBJ GetStockObject(int fnObject / stock object type);它可以设置pen ,brush,fonts,palettes(调色板)的样式2.但是它的返回值是HGDIOBJ句柄,我们需要的HBRUSH句柄,所以需要进行强制类型转换3.程序如下编译运行如下所示,可以看到是透明的,可以用下面来进行画刷的分配,就是比方说,我们画图时候先选择画刷-简单画刷,然后在绘图中选择矩形啊什么的,就是把这两个板块融合起来也利用switch。Case 语句1. 修改简单画刷ID为IDM_JDHS,修改位图画刷的ID为IDM_WTHS,修改透明画刷的ID为IDM_TMHS;过程不贴图了,应该都会;2. 接着给他们添加响应函数,注意选在在view类中添加添加成功后如下图在他们的函数中设置m_nDrawType的值,设置后结果如下所示然后在void CGraphicView:OnLButtonUp(UINT nFlags, CPoint point)函数中修改程序,首先将透明画刷作为默认画刷;也就是其他两个画刷只是创建但是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选上,关于单选框的用法可以参考这个博客/blog/711480接下来,对设置对话框添加变量,如下图所示分别给IDC_EDIT_LINEWIDTH和IDM_XUXIAN添加变量m_nLineWidth 和m_nLineStyle如下图此时查看一下添加成功了注意,对话框构造函数中,自动对这两个值初始化了,我们把第二个改过来,改为0;接下来一切就绪,在设置里面编程先在view类中添加预处理命令如下图,意思就是将CSettingDlg类的头文件添加到view中,如下图所示然后先在OnSetting函数中编辑一下程序,如图所示编译运行,点击设置,会出现下图证明先在这个对话框创建成功了。然后将对话框中设置的值传递给view类中的对应值里面如下图所示现在值传递进去了,但是还没有让画笔选上,所以还需要编辑画笔,先在void CGraphicView:OnLButtonUp(UINT nFlags, CPoint point) 函数中编辑如下代码编译运行,如下图,运行正常,可以用;下来修改void CGraphicView:OnMouseMove(UINT nFlags, CPoint point)这个函数中的画笔,不要忘记先删掉以前编辑的画笔修改后的代码如下所示void CGraphicView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultswitch(m_nDrawType)case 6:/画连续线/if(6=m_nDrawType)/获取DCCClientDC dc(this);/创建宽度为1的红丝实线画笔CPen pen(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)case 5:/画扇形/if(6=m_nDrawType)/获取DCCClientDC dc(this);/创建宽度为1的红丝实线画笔CPen pen(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);编译运行如下所示可以看出,运行都正常,非常好;接下来操作颜色的设置在void CGraphicView:OnColor() 函数中编辑代码首先在view类中添加一个颜色变量m_nColor,如下图所示,在dlg类中也添加这个变量注意变量类型添加好之后,首先在这个函数中编辑代码编译运行,结果如下可以看到,颜色对话框已经出来了,下面就是传递值得问题了。接着用查找替换RGB(X,X,X)为m_nColor;然后编译运行如下图所示一切都OK;可以用附录1.程序view的程序/ GraphicView.cpp : implementation of the CGraphicView class/#include stdafx.h#include Graphic.h#include GraphicDoc.h#include GraphicView.h#include SettingDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CGraphicViewIMPLEMENT_DYNCREATE(CGraphicView, CView)BEGIN_MESSAGE_MAP(CGraphicView, CView)/AFX_MSG_MAP(CGraphicView)ON_WM_LBUTTONDBLCLK()ON_COMMAND(IDM_DOT, OnDot)ON_COMMAND(IDM_ELLIPSE, OnEllipse)ON_COMMAND(IDM_LIANXUXIAN, OnLianxuxian)ON_COMMAND(IDM_LINE, OnLine)ON_COMMAND(IDM_RECTANGLE, OnRectangle)ON_COMMAND(IDM_SHANXING, OnShanxing)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_COMMAND(IDM_JDHS, OnJdhs)ON_COMMAND(IDM_TMHS, OnTmhs)ON_COMMAND(IDM_WTHS, OnWths)ON_COMMAND(IDM_SETTING, OnSetting)ON_COMMAND(IDM_COLOR, OnColor)/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CGraphicView construction/destructionCGraphicView:CGraphicView()/ TODO: add construction code herem_nDrawType=0;m_ptOrigin=0;m_bDraw=FALSE;/初始化为FALSE;m_nLineStyle=0;/初始化线型m_nLineWidth=1;/初始化线宽CGraphicView:CGraphicView()BOOL CGraphicView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CGraphicView drawingvoid CGraphicView:OnDraw(CDC* pDC)CGraphicDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/Invalidate();/重新绘图/CGraphicView:OnLButtonUp(nFlags,point);/ CGraphicView printingBOOL CGraphicView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CGraphicView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CGraphicView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CGraphicView diagnostics#ifdef _DEBUGvoid CGraphicView:AssertValid() constCView:AssertValid();void CGraphicView:Dump(CDumpContext& dc) constCView:Dump(dc);CGraphicDoc* CGraphicView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CGraphicDoc);return (CGraphicDoc*)m_pDocument;#endif /_DEBUG/ CGraphicView message handlersvoid CGraphicView:OnLButtonDblClk(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultAfxMessageBox(HELLO WORLD !);CView:OnLButtonDblClk(nFlags, point);void CGraphicView:OnDot() / TODO: Add your command handler code herem_nDrawType=1;void CGraphicView:OnEllipse() / TODO: Add your command handler code herem_nDrawType=4;void CGraphicView:OnLianxuxian() / TODO: Add your command handler code herem_nDrawType=6;void CGraphicView:OnLine() / TODO: Add your command handler code herem_nDrawType=2;void CGraphicView:OnRectangle() / TODO: Add your command handler code herem_nDrawType=3;void CGraphicView:OnShanxing() / TODO: Add your command handler code herem_nDrawType=5;void CGraphicView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_ptOrigin=point;m_bDraw=TRUE;/鼠标左键按下赋值为TRUE;CView:OnLButtonDown(nFlags, point);void CGraphicView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_bDraw=FALSE;/鼠标左键弹起赋值为FALSE;/获取DC;CClientDC dc(this);/创建红色画刷对象CBrush jdbrush(m_nColor);/填充/dc.FillRect(CRect(m_ptOrigin,point),&jdbrush);/创建位图画刷CBitmap bitmap;/创建位图对象bitmap.LoadBitmap(IDB_BITMAP1);/加载位图资源/创建位图画刷/CBrush bmbrush(&bitmap);/填充/dc.FillRect(CRect(m_ptOrigin,point),&bmbrush);/创建透明画刷 CBrush *nlbrush=CBrush:FromHandle(HBRUSH)(GetStockObject(NULL_BRUSH);/将画刷选入设备描述表/CBrush *Oldnlbrush=dc.SelectObject(nlbrush);dc.SelectObject(nlbrush);/绘制一个矩形/dc.Rectangle(CRect(m_ptOrigin,point);/选回画刷/dc.SelectObject(Oldnlbrush);/创建画笔CPen pen(m_nLineStyle,m_nLineWidth,m_nColor);/暂时创建一个红色画笔dc.SelectObject(&pen);/选择画笔/绘图程序;switch(m_nDrawType)case 1:dc.SetPixel(point,m_nColor);/绘制点break;case 2:/线条程序dc.MoveTo(m_ptOrigin);/线移动到初始位置,即鼠标左键按下的位置dc.LineTo(point);/画线break;case 3:dc.Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);/绘制矩形/if(7=m_nDrawType)/dc.Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);/dc.FillRect(CRect(m_ptOrigin,point),&jdbrush);/break;case 4:/绘制椭圆dc.Ellipse(CRect(m_ptOrigin,point);break;case 7:dc.FillRect(CRect(m_ptOrigin,point),&jdbrush);/选择简单画刷break;case 8:dc.FillRect(CRect(m_ptOrigin,point),&bmbrush);/选择位图画笔break;case 9: CBrush *nlbrush=CBrush:FromHandle(HBRUSH)(GetStockObject(NULL_BRUSH);/选择透明画笔/将画刷选入设备描述表CBrush *Oldnlbrush=dc.SelectObject(nlbrush);dc.SelectObject(nlbrush);/绘制一个矩形dc.Rectangle(CRect(m_ptOrigin,point);/选回画刷dc.SelectObject(Oldnlbrush);break;/default:/break;CView:OnLButtonUp(nFlags, point);void CGraphicView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultswitch(m_nDrawType)case 6:/画连续线/if(6=m_nDrawType)/获取DCCClientDC dc(this);/创建宽度为1的红丝实线画笔CPen pen(m_nLineStyle,m_nLineWidth,m_nColor);/暂时创建一个红色画笔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)case 5:/画扇形/if(6=m_nDrawType)/获取DCCClientDC dc(this);/创建宽度为1的红丝实线画笔CPen pen(m_nLineStyle,m_nLineWidth,m_nColor);/暂时创建一个红色画笔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);void CGraphicView:OnJdhs() / TODO: Add your command handler code herem_nDrawType=7;void CGraphicView:OnTmhs() / TODO: Add your command handler code herem_nDrawType=9;void CGraphicView:OnWths() / TODO: Add your command handler code herem_nDrawType=8;void CGraphicView:OnSetting() /设置的编程/ TODO: Add your command handler code hereCSettingDlg dlg;/先创建一个设置对话框对象dlg.m_nLineWidth=m_nLineWidth;/dlg.m_nLineStyle=m_nLineStyle;/传递值if(IDOK=dlg.DoModal()/打开对话框m_nLineWidth=dlg.m_nLineWidth;m_nLineStyle=dlg.m_nLineStyle;/将对话框中设置好的值传递进view类中/DEL void CGraphicView:OnPaint() /DEL /DEL CPaintDC dc(this); / device context for painting/DEL /DEL / TODO: Add your message handler code here/DEL /Invalidate();/重绘/DEL / Do not call CView:OnPaint() for painting messages/DEL void CGraphicView:OnColor() / TODO: Add your command handler code hereCColorDialog dlg;/创建一个颜色对话框dlg.m_cc.Flags |= CC_FULLOPEN | CC_RGBINIT;dlg.m_cc.rgbResult = RGB(255, 0, 0);/默认红色备选if(IDOK=dlg.DoModal()/打开颜色对话框m_nColor=dlg.m_cc.rgbResult;/将用户选择的颜色传递给m_nColor/DEL void CGraphicView:OnFileOpen() /DEL /DEL / TODO: Add your command handler code here/DEL /DEL /DEL void CGraphicV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论