windows程序设计实验指导书.docx_第1页
windows程序设计实验指导书.docx_第2页
windows程序设计实验指导书.docx_第3页
windows程序设计实验指导书.docx_第4页
windows程序设计实验指导书.docx_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

实验四、Windows GDI编程实验目的:1、 了解windows GDI设备环境的获取与设置。2、 了解windows GDI 绘图对象CPen,CBrush,CFont等的相关基本操作。3、 掌握建立简单图形交互的图形数据管理和鼠标工具设计等。实验要求:建立一个windows SDI(单文档)应用程序,并编辑建立图形属性设置的无模式对话框、简单图形工具条等。实现直线、矩形、椭圆、多边形的交互绘制及文字显示,并能进行图形属性设置。实验可以选择竞赛作业题目,则本次的基本操作实验可以不做,竞赛作业可在课程后期交上,计算成绩有加分因素。竞赛作业:分析微软Office系列软件的绘图工具箱组件的图形编辑功能和操作特点,抽象出其数据组织的结构体系,并分析其需要的鼠标工具类型,设计出相应合理的数据结构和鼠标工具,模拟实现简单几何图形的绘制工具(能交互设置图形属性、有图形成组操作功能,可以实现图形的简单几何变换为佳)。实验指导:一、 在VC+6.0环境中建立一个单文档工程。1、 通过资源编辑器编辑如下所示对话框资源和工具条资源。注意生成对话框类后,为几个组合框添加字符串变量,为Spin控件添加控制变量,并为几个组合对话框添加初始数据:映射模式:MM_ANISOTROPICMM_HIENGLISHMM_HIMETRICMM_ISOTROPICMM_LOENGLISHMM_LOMETRICMM_TEXTMM_TWIPS画笔风格:PS_SOLIDPS_DASHPS_DOTPS_DASHDOTPS_DASHDOTDOTPS_NULLPS_INSIDEFRAME画刷风格:BS_HATCHEDBS_SOLID线刷风格:HS_BDIAGONALHS_CROSSHS_DIAGCROSSHS_FDIAGONALHS_HORIZONTALHS_VERTICAL为生成的对话框类添加构造函数和变量:.h文件CGraphPropertyDlg(CView* pView);GDI_ExeView* m_pView;.cpp文件CGraphPropertyDlg:CGraphPropertyDlg(CView* pView)m_pView = (GDI_ExeView* ) pView;2、 在View类中添加数据成员:public:/无模式对话框CGraphPropertyDlg* pDlg;int m_nMapMode;/映射模式LOGBRUSH m_lBrush;/用来交互设置CDC画刷属性的逻辑画刷LOGPEN m_lPen;/用来交互设置CDC画笔属性的逻辑画笔COLORREF m_cFont;/用来交互设置CDC字体颜色LOGFONT m_lFont;/用来交互设置CDC字体属性的逻辑字体private:/将字符串变量与整形变量之间建立映射关系,用于对话框的数据交互CMap m_mapMode;CMap m_mapPen;CMap m_mapBrush;CMap m_mapHBrush;View类中数据成员的初始化:CGDI_ExeView:CGDI_ExeView()/ TODO: add construction code here/初始化映射模式的值-字符串映射表m_mapMode.SetAt(MM_ANISOTROPIC,MM_ANISOTROPIC);m_mapMode.SetAt(MM_HIENGLISH,MM_HIENGLISH);m_mapMode.SetAt(MM_HIMETRIC,MM_HIMETRIC);m_mapMode.SetAt(MM_ISOTROPIC,MM_ISOTROPIC);m_mapMode.SetAt(MM_LOENGLISH,MM_LOENGLISH);m_mapMode.SetAt(MM_LOMETRIC,MM_LOMETRIC);m_mapMode.SetAt(MM_TEXT,MM_TEXT);m_mapMode.SetAt(MM_TWIPS,MM_TWIPS);/初始化画笔样式的值-字符串映射表m_mapPen.SetAt(PS_SOLID,PS_SOLID);m_mapPen.SetAt(PS_DASH,PS_DASH);m_mapPen.SetAt(PS_DOT,PS_DOT);m_mapPen.SetAt(PS_DASHDOT,PS_DASHDOT);m_mapPen.SetAt(PS_DASHDOTDOT,PS_DASHDOTDOT);m_mapPen.SetAt(PS_NULL,PS_NULL);m_mapPen.SetAt(PS_INSIDEFRAME,PS_INSIDEFRAME);/初始化画刷样式的值-字符串映射表m_mapBrush.SetAt(BS_HATCHED,BS_HATCHED);m_mapBrush.SetAt(BS_SOLID,BS_SOLID);m_mapBrush.SetAt(BS_NULL,BS_NULL);/初始化线模式画笔样式的值-字符串映射表m_mapHBrush.SetAt(HS_BDIAGONAL,HS_BDIAGONAL);m_mapHBrush.SetAt(HS_CROSS,HS_CROSS);m_mapHBrush.SetAt(HS_DIAGCROSS,HS_DIAGCROSS);m_mapHBrush.SetAt(HS_FDIAGONAL,HS_FDIAGONAL);m_mapHBrush.SetAt(PS_DASHDOTDOT,PS_DASHDOTDOT);m_mapHBrush.SetAt(HS_HORIZONTAL,HS_HORIZONTAL);m_mapHBrush.SetAt(HS_VERTICAL,HS_VERTICAL);/初始化映射模式,画笔、画刷、字体样式m_nMapMode = MM_TEXT;m_lBrush.lbColor = RGB(0,0,0);m_lBrush.lbHatch = HS_BDIAGONAL;m_lBrush.lbStyle = BS_HATCHED;m_lPen.lopnColor = RGB(0,0,0);m_lPen.lopnStyle = PS_SOLID;m_lPen.lopnWidth.x = 1;m_cFont = RGB(0,0,0);m_lFont.lfHeight = 30;m_lFont.lfWidth = 0;m_lFont.lfEscapement = 0;m_lFont.lfOrientation = 0;m_lFont.lfWeight = FW_NORMAL;m_lFont.lfItalic = FALSE;m_lFont.lfUnderline = FALSE;m_lFont.lfStrikeOut = FALSE;m_lFont.lfCharSet = GB2312_CHARSET;m_lFont.lfOutPrecision = OUT_STROKE_PRECIS;m_lFont.lfClipPrecision = CLIP_STROKE_PRECIS;m_lFont.lfQuality = DRAFT_QUALITY;m_lFont.lfPitchAndFamily = VARIABLE_PITCH|FF_MODERN;strcpy(m_lFont.lfFaceName,楷体_GB2312);/无模式对话框的指针初始化pDlg = NULL;/析构函数的内存释放CGDI_ExeView:CGDI_ExeView()m_mapMode.RemoveAll();m_mapPen.RemoveAll();m_mapBrush.RemoveAll();m_mapHBrush.RemoveAll();二、 DOC类中的图形数据项及数据管理函数的添加。数据项添加(*Doc.h)private:/存储图形数据的数据结构CArray m_lineObj;CArray m_rectObj;CArray m_ellipseObj;CTypedPtrList m_polygonObj;数据操作功能:/向数据集中追加新的数据的函数void AddLine(CRect rect);void AddRect(CRect rect);void AddEllipse(CRect rect);void AddPolygon(CDrawPolygon* pPoly);/在数据集中删除相应目标BOOL DeleteLine(CRect rect);BOOL DeleteRect(CRect rect);BOOL DeleteEllipse(CRect rect);BOOL DeletePolygon(int nPolyID);/调整多边形位置于链表最后void PolygonToTail(int nPolyID);/用于图形选择的函数,主要用了CRgn类的RectInRegion()方法BOOL GetLineAt(CRect& rect, CPoint point, LOGPEN logpen);BOOL GetRectAt(CRect& rect, CPoint point);BOOL GetEllipseAt(CRect& rect, CPoint point);BOOL GetPolygonAt(CDrawPolygon& poly, CPoint point);/画图形的函数void DrawLines(CGDI_ExeView* pView,CDC* pDC);void DrawRects(CGDI_ExeView* pView,CDC* pDC);void DrawEllipses(CGDI_ExeView* pView,CDC* pDC);void DrawPolygons(CGDI_ExeView* pView,CDC* pDC);/移动选中对象void MoveObj(CRect rect, int nPolyID, DrawShape type, CPoint dxy);多边形的数据结构及相关操作函数请参考例程相关代码,争取看懂代码。三、 建立右键菜单资源并在View类中添加对右键菜单的消息处理。void CGDI_ExeView:OnContextMenu(CWnd* pWnd, CPoint point) / TODO: Add your message handler code hereCMenu menu;if (menu.LoadMenu(IDR_MENU_POP)CMenu* pPopup = menu.GetSubMenu(0);if(pPopup != NULL)pPopup-TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN, point.x, point.y, pWnd); void CGDI_ExeView:OnDelete() / TODO: Add your command handler code hereCGDI_ExeDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CRect rdoc = m_rectSelect;ClientToDoc(rdoc);rdoc.NormalizeRect();int idpoly = m_polygonSelect.m_nID;if(m_bSelected)switch(m_selectType)case rectangle:if(pDoc-DeleteRect(rdoc)m_bSelected = FALSE;Invalidate();break;case ellipse:if(pDoc-DeleteEllipse(rdoc)m_bSelected = FALSE;Invalidate();break;case line:if(pDoc-DeleteLine(rdoc)m_bSelected = FALSE;Invalidate();break;case polygon:if(pDoc-DeletePolygon(idpoly)m_bSelected = FALSE;Invalidate();break;pDoc-UpdateAllViews(this);void CGDI_ExeView:OnCdcattri() / TODO: Add your command handler code here/无模式对话框的建立if(pDlg = NULL)pDlg = new CGraphPropertyDlg(this);pDlg-Create(IDD_DIALOG1);pDlg-ShowWindow(SW_SHOW);View类OnDraw()函数的内容请参考下面代码:/根据逻辑画笔、画刷设置设备环境画笔、画刷的属性CBrush brush;if (!brush.CreateBrushIndirect(&m_lBrush)return;CPen pen;if (!pen.CreatePenIndirect(&m_lPen)return;CBrush* pOldBrush = pDC-SelectObject(&brush);CPen* pOldPen = pDC-SelectObject(&pen);/画矩形pDoc-DrawRects(this,pDC);/画椭圆pDoc-DrawEllipses(this,pDC);/画多边形pDoc-DrawPolygons(this,pDC);/画直线pDoc-DrawLines(this,pDC);/还原设备环境 pDC-SelectObject(pOldBrush);pDC-SelectObject(pOldPen);/画选中物体的选中句柄if(m_bSelected) DrawSelectionObj();/根据“字体”通用对话框中的选项绘制文本CFont myFont;myFont.CreateFontIndirect(&m_lFont);CFont* pOldFont = pDC-SelectObject(&myFont);pDC-SetTextColor(m_cFont);/根据逻辑字体显示文字pDC-TextOut(80,80,字体实例,显示选择字体);/由CreateFont函数直接创建一种显示字体CFont myFont1;myFont1.CreateFont(30,/字符的逻辑高度0,/字符的平均宽度,缺省值-450,/文本行顺时针旋转45度0,FW_BOLD,/加粗体TRUE,/不倾斜TRUE,/加下划线FALSE,/不加删除线GB2312_CHARSET, /中文字符集OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_MODERN,仿宋_GB2312); /宋体pOldFont = pDC-SelectObject(&myFont1);/将字体颜色设置为兰色pDC-SetTextColor(RGB(0,0,255);/根据创建字体显示文字pDC-TextOut(200,130,自定义仿宋字体);/还原设备环境pDC-SelectObject(pOldFont);无模式对话框与View之间的方法调用:void CGraphPropertyDlg:OnApply() / TODO: Add your control notification handler code hereUpdateData();/调用视图类的方法将图形属性设置变量传过去m_pView-OnApply();View类中相应方法:/由无模式对话框设置设备环境属性void CGDI_ExeView:OnApply() m_lPen.lopnWidth.x = pDlg-m_nWeight;POSITION pos;pos = m_mapMode.GetStartPosition();while (pos != NULL)CString szMapMode;int nMapMode;m_mapMode.GetNextAssoc(pos,nMapMode,szMapMode);if (szMapMode = pDlg-m_strMode)if(m_nMapMode != nMapMode)m_nMapMode = nMapMode;m_bSelected = FALSE;break;pos = m_mapPen.GetStartPosition();while (pos != NULL)CString szPenStyle;int nPenStyle;m_mapPen.GetNextAssoc(pos,nPenStyle,szPenStyle);if (szPenStyle = pDlg-m_strPStyle)m_lPen.lopnStyle= nPenStyle;break;pos = m_mapBrush.GetStartPosition();while (pos != NULL)CString szBrushStyle;int nBrushStyle;m_mapBrush.GetNextAssoc(pos,nBrushStyle,szBrushStyle);if (szBrushStyle = pDlg-m_strBStyle)m_lBrush.lbStyle= nBrushStyle;break;pos = m_mapHBrush.GetStartPosition();while (pos != NULL)CString szHBrushStyle;int nHBrushStyle;m_mapHBrush.GetNextAssoc(pos,nHBrushStyle,szHBrushStyle);if (szHBrushStyle = pDlg-m_strHBrush)m_lBrush.lbHatch= nHBrushStyle;break;Invalidate();View类中窗口-视口坐标转换方法:/窗口-视图坐标变换函数void ClientToDoc(CPoint& point);void ClientToDoc(CRect& rect);void DocToClient(CPoint& point);void DocToClient(CRect& rect);其它对话框初始化、控件消息响应代码请参考示例程序GDI_Exe。四、 运行程序,观察通过无模式对话框设置绘图设备环境的文字显示效果。五、 添加绘图的鼠标工具类和对绘图工具条消息的处理,重载View类的鼠标消息,调用鼠标工具。View类中对选择工具的数据项添加,注意对变量的初始化也要加到构造函数中:/用于单选操作的变量BOOL m_bSelected;DrawShape m_selectType;CRect m_rectSelect;CDrawPolygon m_polygonSelect;鼠标工具类的具体代码请参考例程,View类中对鼠标消息的重载示例如下:void CGDI_ExeView:OnButtonSelect() / TODO: Add your command handler code hereCDrawTool:c_drawShape = selection;void CGDI_ExeView:OnButtonLine() / TODO: Add your command handler code hereCDrawTool:c_drawShape = line;void CGDI_ExeView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultCDrawTool* pTool = CDrawTool:FindTool(CDrawTool:c_drawShape);if (pTool != NULL)pTool-OnLButtonDown(this, nFlags, point);/CView:OnLButtonDown(nFlags, point);六、 运行程序,看看绘图工具能否正常使用,并通过设置画笔、画刷的属性看看绘图效果。七、 完善细节,比如对选择后显示被选中物体句柄的处理,对工具条ON_COMMAND_UI类型消息的响应。/画被选中图形的选中句柄void CGDI_ExeView:DrawSelectionObj()CClientDC dc(this);CPoint handle;int w = m_lPen.lopnWidth.x/2 + 3;int w2 = 2*w;CRect rbound;switch(m_selectType)case ellipse:dc.DrawFocusRect(m_rectSelect);case rectangle:handle.x = m_rectSelect.left;handle.y = m_rectSelect.bottom;dc.PatBlt(handle.x - w, handle.y - w, w2, w2, DSTINVERT);handle.x = m_rectSelect.left;handle.y = m_rectSelect.top;dc.PatBlt(handle.x - w, handle.y - w, w2, w2, DSTINVERT);handle.x = m_rectSelect.right;handle.y = m_rectSelect.bottom;dc.PatBlt(handle.x - w, handle.y - w, w2, w2, DSTINVERT);handle.x = m_rectSelect.right;handle.y = m_rectSelect.top;dc.PatBlt(handle.x - w, handle.y - w, w2, w2, DSTINVERT);break;case line:handle.x = m_rectSelect.left;handle.y = m_rectSelect.top;dc.PatBlt(handle.x - w, handle.y - w, w2, w2, DSTINVERT);handle.x = m_rectSelect.right;handle.y = m_rectSelect.bottom;dc.PatBlt(handle.x - w, handle.y - w, w2, w2,

温馨提示

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

评论

0/150

提交评论