




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
南京工程学院课程设计说明书题 目 绘图软件 课 程 名 称 多媒体编程 院(系.部.中心) 计算机工程学院 专 业 多媒体技术 班 级 学 生 姓 名 学 号 设 计 地 点 指 导 老 师 设计起止时间:2015 年7月6日至2015年7月7日1 实验目的 课程设计的目的是使学生学习并掌握了理论知识和一般编程方法后,结合自己的兴趣,侧重于具体的应用,在某一方面进行深挖,设计出一个相对完整的多媒体应用程序,通过设计课题的编写、调试、运行工作,进一步理解和掌握Visual C+多媒体编程的实际应用能力,以及Windows编程的思想、方法和技巧,从而巩固所学理论知识、使理论与实际相结合,增强学生分析问题、解决问题的能力。2 程序功能与设计思路 仿照“AutoCAD”软件或“画图”软件设计一个绘图软件,软件具有基本的图形处理能力,要求实现直线、圆、椭圆、画矩形(多边形)、手绘等功能,同时可以选择线的颜色、填充色、线型样式、界面友好。1. 主界面1.1主界面实现功能如下: 菜单项包括绘图、设置、编辑、文件、清除,点击进入各个功能界面。1.2界面效果显示:1.3主界面设计思路: 首先创建一个基于单文档的MFC应用程序,然后在资源里添加五个菜单栏以实现点击菜单项跳出对应的功能。主界面其功能结构如下:清除文件编辑设置绘图2. 绘图2.1绘图实现功能如下 画直线 画矩形 画椭圆 涂鸦2.2功能界面效果显示绘图绘图功能结构图:多边形画笔椭圆矩形直线3. 设置3.1设置实现功能如下: 设置线宽线型 设置颜色3.2功能界面效果显示:3.3设置功能结构图:设置颜色线宽线型3 相关原理知识介绍1.1实现简单图形的绘制,绘图功能中,有绘制直线、矩形、椭圆、涂鸦等。用到的方法如下:CPoint MoveTo(int x,int y); /直线起点CPoint LineTo(int x,int y); /直线终点BOOL Rectangle(int x1,int y1,int x2,int y2); /绘制矩形BOOL Ellipse(int x1,int y1,int x2,int y2); /绘制椭圆 涂鸦部分,以鼠标移动的轨迹画线。同样要用到MouseMove()函数。使起点为鼠标前一个位置,终点为鼠标当前位置,以画直线的方式完成。对于线型、线宽、颜色的设置,通过使用颜色通用对话框完成。1.2 绘图时需要用到的设备环境类介绍 设备环境类CDC提供了绘制和打印的全部函数。为了能让用户使用一些特殊的设备环境,CDC还派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC类。 (1)CPaintDC比较特殊,它的构造函数和析构函数都是针对OnPaint进行的,但用户一旦获得相关的CDC指针,就可以将它当成任何设备环境(包括屏幕、打印机)指针来使用。CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。 (2)CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏)中进行绘图,点(0,0)通常指的是客户区的左上角。而CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。CWindowDC和CClientDC构造函数分别调用GetWindowDC和GetDC,但它们的析构函数都是调用ReleaseDC函数1.3 CRect类的常用操作 1.4画笔 画笔是Windows应用程序中用来绘制各种直线和曲线的一种图形工具,它可分为修饰画笔和几何画笔两种类型。在这两种类型中,几何画笔的定义最复杂,它不但有修饰画笔的属性,而且还跟画刷的样式、阴影线类型有关,通常用在对绘图有较高要求的场合。而修饰画笔只有简单的几种属性,通常用在简单的直线和曲线等场合。 一个修饰画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。默认的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线等七种风格。 1.5画刷 画刷用于指定填充的特性,许多窗口、控件以及其他区域都需要用画刷进行填充绘制,它比画笔的内容更加丰富。 画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8 x 8位图,而填充样式往往是CDC内部定义的一些特性,它们都是以HS_为前缀的标识。4 设计方法及步骤void CGraphicView:OnLine()/ TODO: 在此添加命令处理程序代码m_nDrawType=1;void CGraphicView:OnRectangle()/ TODO: 在此添加命令处理程序代码m_nDrawType=2;void CGraphicView:OnEllipse()/ TODO: 在此添加命令处理程序代码m_nDrawType=3;void CGraphicView:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值/m_ptOrigin=point;:SetCursor(m_HCross);/这一句能防止左键单击的时候,保持鼠标样式不变_m_ptOrigin=point;_m_ptOld=point;_SetCapture();/捕获鼠标,充分控制鼠标_m_Dragging=1;_RECT Rect;GetClientRect(&Rect);/取得窗口当前显示坐标_ClientToScreen(&Rect);/转换为屏幕坐标_:ClipCursor(&Rect);/限定光标在指定矩形区域_if(m_nDrawType=6)SetCursor(m_HCross); /使用新光标m_bDraw=TRUE;m_ptOld=point;SetCapture(); /捕捉鼠标CRect rect; GetClientRect(&rect); /获取客户端窗口矩形区域ClientToScreen(&rect); /转换为屏幕坐标ClipCursor(rect); /限定鼠标指针不能移出客户窗口CClientDC dc(this);pt2=point;/当前鼠标按下点赋值给pt2ckbl=true;/作用和画直线一样,保证只有在按下左键到抬起左键之间的mousemove有用.。dc.MoveTo(pt1);dc.LineTo(point);if(m_nDrawType=7)CGraphicDoc*pDoc=GetDocument();pt3=point;/定义pt6也是为了防止混乱,因为前面用的不是pt6,实验的时候会出现错误。pDoc-str=;/文档类定义 CView:OnLButtonDown(nFlags, point);void CGraphicView:OnLButtonUp(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值CClientDC dc(this);CPen newPen(PS_SOLID,m_nLineWidth, m_clr);CPen *pOldPen = dc.SelectObject(&newPen);CBrush*pBrush = CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);dc.SelectObject(pBrush); /设置透明画刷switch (m_nDrawType)case 1:dc.MoveTo(m_ptOrigin);dc.LineTo(point);break;case 2:dc.Rectangle(CRect(m_ptOrigin,point);break;case 3:dc.Ellipse(CRect(m_ptOrigin,point);break;case 4:dc.SetPixel(point,m_clr);break;case 5:m_bDraw=FALSE; ReleaseCapture(); /释放鼠标捕获ClipCursor(NULL);break;case 6:CClientDC dc(this);dc.SetROP2(m_clr);/擦除旧线dc.MoveTo(pt1);dc.LineTo(pt2);/擦除最后一次移动画的线,可有可恶dc.SetROP2(R2_COPYPEN);/ 设置绘图模式,以当前画笔绘图,即 绘制新线dc.MoveTo(pt1);dc.LineTo(point);ckbl=false;pt1=point;/把这次鼠标抬起的点作为下次鼠标按下命令画直线的起点。#与画直线的区别。break;if (m_Dragging)_m_Dragging=0;_:ReleaseCapture();/结束捕获鼠标_:ClipCursor(NULL);/解锁鼠标CClientDC ClientDC(this);_ClientDC.SetROP2(R2_NOTXORPEN);_ClientDC.SetROP2(m_clr);/缺省绘图模式,像素为画笔颜色CPen pen(PS_SOLID,m_nLineWidth,m_clr);ClientDC.SelectObject(&pen);CView:OnLButtonUp(nFlags, point);void CGraphicView:OnMouseMove(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值:SetCursor(m_HCross);_if (m_Dragging)_CClientDC ClientDC(this);CPen pen(PS_SOLID,m_nLineWidth,m_clr);_ClientDC.SetROP2(m_clr);/逆转当前屏幕颜色来画线的绘图方式_ClientDC.SetROP2(R2_NOTXORPEN);CBrush*pBrush = CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);ClientDC.SelectObject(pBrush); /设置透明画刷ClientDC.SelectObject(&pen);switch (m_nDrawType)case 1:ClientDC.MoveTo(m_ptOrigin);ClientDC.LineTo(m_ptOld); /擦去上一次的线_ClientDC.MoveTo(m_ptOrigin);_ClientDC.LineTo(point);/绘制这一次的临时线_m_ptOld=point;_break;case 2:ClientDC.Rectangle(CRect(m_ptOrigin,m_ptOld);ClientDC.Rectangle(CRect(m_ptOrigin,point);m_ptOld=point;break;case 3:ClientDC.Ellipse(CRect(m_ptOrigin,m_ptOld);ClientDC.Ellipse(CRect(m_ptOrigin,point);m_ptOld=point;break;case 5:ClientDC.SelectObject (&pen);ClientDC.MoveTo (m_ptOld); ClientDC.LineTo (point);m_ptOld=point;break;case 6:CClientDC dc(this);if (ckbl)dc.SetROP2(R2_MERGEPENNOT);/。即擦除旧线dc.MoveTo(pt1);dc.LineTo(pt2);/第一次移动,擦除鼠标按下画的直线以后每次移动擦除上次移动画的线。dc.MoveTo(pt1);dc.LineTo(point);/重新画线pt2=point;_CView:OnMouseMove(nFlags, point);void CGraphicView:Oncolor()/ TODO: 在此添加命令处理程序代码CColorDialog dlg;dlg.m_cc.rgbResult=m_clr;dlg.m_cc.Flags |= CC_RGBINIT | CC_FULLOPEN;if(IDOK=dlg.DoModal()m_clr=dlg.m_cc.rgbResult;void CGraphicView:OnFileOpen()/ TODO: 在此添加命令处理程序代码CString strFilter,str;strFilter=位图文件(.bmp)|*.bmp|; CFileDialog dlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,strFilter);if(IDOK = dlg.DoModal() str=dlg.GetPathName(); m_hBmp=LoadImage(NULL,str,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);Invalidate(); / 强制调用OnDraw _void CGraphicView:OnDot()/ TODO: 在此添加命令处理程序代码m_nDrawType=4;void CGraphicView:OnTuya()/ TODO: 在此添加命令处理程序代码m_nDrawType=5;void CGraphicView:OnXx()/ TODO: 在此添加命令处理程序代码CSettingDlg a;a.m_nLineWidth=m_nLineWidth;if(IDOK=a.DoModal()m_nLineWidth=a.m_nLineWidth;void CGraphicView:OnTc()/ TODO: 在此添加命令处理程序代码CColorDialog dlg;dlg.m_cc.rgbResult=m_full;if(IDOK=dlg.DoModal()m_full=dlg.m_cc.rgbResult;void CGraphicView:On32783()/折线/ TODO: 在此添加命令处理程序代码m_nDrawType=6;void CGraphicView:On32782()/文字/ TODO: 在此添加命令处理程序代码m_nDrawType=7;void CGraphicView:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)/文字CGraphicDoc*pDoc=GetDocument();/定义文档类指针pDoc-str +=(char)nChar;CClientDC dc(this);dc.SelectObject(&zz);dc.SetTextColor(m_clr);dc.TextOut(pt3.x,pt3.y,pDoc-str);CView:OnChar(nChar, nRepCnt, nFlags);void CGraphicView:OnSelect()/ TODO: 在此添加命令处理程序代码CRect rectTrue1, rectTrue2;m_tracker.GetTrueRect(&rectTrue1);m_trac
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东惠州市博罗县罗浮山文化旅游投资集团有限公司所属企业管理岗位遴选拟聘用模拟试卷及答案详解参考
- 2025江苏南京地铁集团有限公司校园招聘(三)模拟试卷含答案详解
- 2025安徽阜阳市颍州区选调区内乡镇在编在岗教师60人模拟试卷附答案详解
- 2025年中国充气围油栏行业市场分析及投资价值评估前景预测报告
- 2025年中国成人自行车行业市场分析及投资价值评估前景预测报告
- 销售业务洽谈与合同签订工具
- 家庭教育普及知识活动方案
- 2025年中国茶海棠叶提取物行业市场分析及投资价值评估前景预测报告
- 2025河北秦皇岛城市发展投资控股集团有限公司选聘子公司职业经理人1人考前自测高频考点模拟试题及参考答案详解1套
- 2025甘肃平凉市灵台县公安局面向社会招聘警务辅助人员28人模拟试卷完整参考答案详解
- ktv营销经理雇佣合同协议
- 2025年全运会知识竞赛试题及答案
- 2025年陕西清水川能源股份有限公司招聘笔试参考题库含答案解析
- 《光伏逆变器用长寿命级CD297S型铝电解电容器》
- 《公路软土地基处治工程技术规范》(DB45T 1972-2019)
- 工余安健环知识培训
- 云南省石林县鹿阜中学七年级地理上册 第一章 第四节 地球的公转教案 (新版)商务星球版
- 《路遥人生》读书分享课件
- 以青春之名励青春之志
- 小学数学新旧知识关联
- 第9课 共同弘扬中华传统美德 《中华民族大团结》(初中 精讲课件)
评论
0/150
提交评论