1、南工程多媒体技术课设绘图软件南京工程学院课程设计说明书题 目 绘图软件 课 程 名 称 多媒体编程 院(系.部.中心) 计算机工程学院 专 业 多媒体技术 班 级 学 生 姓 名 学 号 设 计 地 点 指 导 老 师 设计起止时间:2015 年7月6日至2015年7月7日1实验目的 课程设计的目的是使学生学习并掌握了理论知识和一般编程方法后,结合自己的兴趣,侧重于具体的应用,在某一方面进行深挖,设计出一个相对完整的多媒体应用程序,通过设计课题的编写、调试、运行工作,进一步理解和掌握Visual C+多媒体编程的实际应用能力,以及Windows编程的思想、方法和技巧,从而巩固所学理论知识、使理
2、论与实际相结合,增强学生分析问题、解决问题的能力。2程序功能与设计思路 仿照“AutoCAD”软件或“画图”软件设计一个绘图软件,软件具有基本的图形处理能力,要求实现直线、圆、椭圆、画矩形(多边形)、手绘等功能,同时可以选择线的颜色、填充色、线型样式、界面友好。1.主界面1.1主界面实现功能如下: 菜单项包括绘图、设置、编辑、文件、清除,点击进入各个功能界面。1.2界面效果显示:1.3主界面设计思路: 首先创建一个基于单文档的MFC应用程序,然后在资源里添加五个菜单栏以实现点击菜单项跳出对应的功能。其功能结构如下:2.绘图2.1绘图实现功能如下 画直线 画矩形 画椭圆 涂鸦2.2功能界面效果显
3、示绘图功能结构图: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); /绘制椭圆 涂鸦部分,以鼠标移动的轨迹画线。同样要用到Mo
4、useMove()函数。使起点为鼠标前一个位置,终点为鼠标当前位置,以画直线的方式完成。对于线型、线宽、颜色的设置,通过使用颜色通用对话框完成。1.2 绘图时需要用到的设备环境类介绍 设备环境类CDC提供了绘制和打印的全部函数。为了能让用户使用一些特殊的设备环境,CDC还派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC类。 (1)CPaintDC比较特殊,它的构造函数和析构函数都是针对OnPaint进行的,但用户一旦获得相关的CDC指针,就可以将它当成任何设备环境(包括屏幕、打印机)指针来使用。CPaintDC类的构造函数会自动调用BeginPaint,而
5、它的析构函数则会自动调用EndPaint。 (2)CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏)中进行绘图,点(0,0)通常指的是客户区的左上角。而CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。CWindowDC和CClientDC构造函数分别调用GetWindowDC和GetDC,但它们的析构函数都是调用ReleaseDC函数1.3 CRect类的常用操作 1.4画笔 画笔是Windows应用程序中用来绘制各种直线和曲线的一种图形工具,它可分为修饰画笔和几何画笔两种类型。在这两种类型中,几何画笔的定义最复杂,它不但有修饰画笔的
6、属性,而且还跟画刷的样式、阴影线类型有关,通常用在对绘图有较高要求的场合。而修饰画笔只有简单的几种属性,通常用在简单的直线和曲线等场合。 一个修饰画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。默认的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线等七种风格。 1.5画刷 画刷用于指定填充的特性,许多窗口、控件以及其他区域都需要用画刷进行填充绘制,它比画笔的内容更加丰富。 画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色和画笔颜色一样,
7、都是使用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:OnLB
8、uttonDown(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(&Re
9、ct);/限定光标在指定矩形区域_ 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;/当前鼠标按下点赋值给pt2 ckbl=true;/作用和画直线一样,保证只有在按下左键
10、到抬起左键之间的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: 在此添加消息处理程序代码和/或调用默认值 CClient
11、DC 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(CR
12、ect(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.
13、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.Se
14、tROP2(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_SOLI
15、D,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); Client
16、DC.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.E
17、llipse(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);/第一次移动,擦除鼠标按下画的直线以后每次移动擦除上次移动画
18、的线。 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:OnFileOp
19、en() / 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
20、() / 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 dl
21、g; 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=GetDo
22、cument();/定义文档类指针 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_tracke
23、r.m_nStyle &= CRectTracker:resizeInside; m_tracker.m_nStyle = CRectTracker:resizeOutside; m_tracker.GetTrueRect(&rectTrue2); InvalidateRect(rectTrue1.Width() rectTrue2.Width() ? rectTrue1 : rectTrue2);BOOL CGraphicView:OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) / TODO: Add your message han
24、dler code here and/or call default CGraphicDoc* pDoc = GetDocument(); if(!m_IsDraw) if (pWnd = this & m_tracker.SetCursor(this, nHitTest) return TRUE; return CView:OnSetCursor(pWnd, nHitTest, message);4总结与设计体会 通过这次综合作业,让我对多媒体编程有了进一步了解,对文字处理,绘图,图片处理,媒体播放,动画都有了一定的认识。对VS2008的使用也由陌生到熟悉,对MFC提供的各种设备环境类有了进一步的认识,并能熟练应用一些常用的类和内置函数。 在实验中遇到的问题让我收获到了很多,也锻炼了自己的动手操作能力和上机能力编程能力,使课上的知识结合到实践中来,但是很多知识还不能灵活运用,以后要注重这方面的培养。教师评语:教师签名:日期:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1