南工程多媒体技术课设绘图软件.docx
《南工程多媒体技术课设绘图软件.docx》由会员分享,可在线阅读,更多相关《南工程多媒体技术课设绘图软件.docx(17页珍藏版)》请在冰豆网上搜索。
![南工程多媒体技术课设绘图软件.docx](https://file1.bdocx.com/fileroot1/2022-11/28/ffefe211-afe5-41bb-a39b-0b13f5d09837/ffefe211-afe5-41bb-a39b-0b13f5d098371.gif)
南工程多媒体技术课设绘图软件
南京工程学院
课程设计说明书
题目绘图软件
课程名称多媒体编程
院(系.部.中心)计算机工程学院
专业多媒体技术
班级
学生姓名
学号
设计地点
指导老师
设计起止时间:
2015年7月6日至2015年7月7日
1.实验目的
课程设计的目的是使学生学习并掌握了理论知识和一般编程方法后,结合自己的兴趣,侧重于具体的应用,在某一方面进行深挖,设计出一个相对完整的多媒体应用程序,通过设计课题的编写、调试、运行工作,进一步理解和掌握VisualC++多媒体编程的实际应用能力,以及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实现简单图形的绘制,绘图功能中,有绘制直线、矩形、椭圆、涂鸦等。
用到的方法如下:
CPointMoveTo(intx,inty);//直线起点
CPointLineTo(intx,inty);//直线终点
BOOLRectangle(intx1,inty1,intx2,inty2);//绘制矩形
BOOLEllipse(intx1,inty1,intx2,inty2);//绘制椭圆
涂鸦部分,以鼠标移动的轨迹画线。
同样要用到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.3CRect类的常用操作
1.4画笔
画笔是Windows应用程序中用来绘制各种直线和曲线的一种图形工具,它可分为修饰画笔和几何画笔两种类型。
在这两种类型中,几何画笔的定义最复杂,它不但有修饰画笔的属性,而且还跟画刷的样式、阴影线类型有关,通常用在对绘图有较高要求的场合。
而修饰画笔只有简单的几种属性,通常用在简单的直线和曲线等场合。
一个修饰画笔通常具有宽度、风格和颜色三种属性。
画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。
默认的画笔宽度是一个像素单位。
画笔的颜色确定了所画的线条颜色。
画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线等七种风格。
1.5画刷
画刷用于指定填充的特性,许多窗口、控件以及其他区域都需要用画刷进行填充绘制,它比画笔的内容更加丰富。
画刷的属性通常包括填充色、填充图案和填充样式三种。
画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8x8位图,而填充样式往往是CDC内部定义的一些特性,它们都是以HS_为前缀的标识。
4.设计方法及步骤
voidCGraphicView:
:
OnLine()
{
//TODO:
在此添加命令处理程序代码
m_nDrawType=1;
}
voidCGraphicView:
:
OnRectangle()
{
//TODO:
在此添加命令处理程序代码
m_nDrawType=2;
}
voidCGraphicView:
:
OnEllipse()
{
//TODO:
在此添加命令处理程序代码
m_nDrawType=3;
}
voidCGraphicView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
//m_ptOrigin=point;
:
:
SetCursor(m_HCross);//这一句能防止左键单击的时候,保持鼠标样式不变_
m_ptOrigin=point;_
m_ptOld=point;_
SetCapture();//捕获鼠标,充分控制鼠标_
m_Dragging=1;_
RECTRect;
GetClientRect(&Rect);//取得窗口当前显示坐标_
ClientToScreen(&Rect);//转换为屏幕坐标_
:
:
ClipCursor(&Rect);//限定光标在指定矩形区域__
if(m_nDrawType==6)
{
SetCursor(m_HCross);//使用新光标
m_bDraw=TRUE;
m_ptOld=point;
SetCapture();//捕捉鼠标
CRectrect;
GetClientRect(&rect);//获取客户端窗口矩形区域
ClientToScreen(&rect);//转换为屏幕坐标
ClipCursor(rect);//限定鼠标指针不能移出客户窗口
CClientDCdc(this);
pt2=point;//当前鼠标按下点赋值给pt2@@@@@
ckbl=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);
}
voidCGraphicView:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
CClientDCdc(this);
CPennewPen(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)
{
case1:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case2:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case3:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
case4:
dc.SetPixel(point,m_clr);
break;
case5:
{
m_bDraw=FALSE;
ReleaseCapture();//释放鼠标捕获
ClipCursor(NULL);
}
break;
case6:
CClientDCdc(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);//解锁鼠标
CClientDCClientDC(this);_
ClientDC.SetROP2(R2_NOTXORPEN);_
ClientDC.SetROP2(m_clr);//缺省绘图模式,像素为画笔颜色
CPenpen(PS_SOLID,m_nLineWidth,m_clr);
ClientDC.SelectObject(&pen);
}
CView:
:
OnLButtonUp(nFlags,point);
}
voidCGraphicView:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
:
:
SetCursor(m_HCross);_
if(m_Dragging)_
{_
CClientDCClientDC(this);
CPenpen(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)
{
case1:
ClientDC.MoveTo(m_ptOrigin);
ClientDC.LineTo(m_ptOld);//擦去上一次的线_
ClientDC.MoveTo(m_ptOrigin);_
ClientDC.LineTo(point);//绘制这一次的临时线_
m_ptOld=point;_
break;
case2:
ClientDC.Rectangle(CRect(m_ptOrigin,m_ptOld));
ClientDC.Rectangle(CRect(m_ptOrigin,point));
m_ptOld=point;
break;
case3:
ClientDC.Ellipse(CRect(m_ptOrigin,m_ptOld));
ClientDC.Ellipse(CRect(m_ptOrigin,point));
m_ptOld=point;
break;
case5:
ClientDC.SelectObject(&pen);
ClientDC.MoveTo(m_ptOld);
ClientDC.LineTo(point);
m_ptOld=point;
break;
case6:
CClientDCdc(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);
}
voidCGraphicView:
:
Oncolor()
{
//TODO:
在此添加命令处理程序代码
CColorDialogdlg;
dlg.m_cc.rgbResult=m_clr;
dlg.m_cc.Flags|=CC_RGBINIT|CC_FULLOPEN;
if(IDOK==dlg.DoModal())
{
m_clr=dlg.m_cc.rgbResult;
}
}
voidCGraphicView:
:
OnFileOpen()
{
//TODO:
在此添加命令处理程序代码
CStringstrFilter,str;
strFilter="位图文件(.bmp)|*.bmp||";
CFileDialogdlg(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_
}
voidCGraphicView:
:
OnDot()
{
//TODO:
在此添加命令处理程序代码
m_nDrawType=4;
}
voidCGraphicView:
:
OnTuya()
{
//TODO:
在此添加命令处理程序代码
m_nDrawType=5;
}
voidCGraphicView:
:
OnXx()
{
//TODO:
在此添加命令处理程序代码
CSettingDlga;
a.m_nLineWidth=m_nLineWidth;
if(IDOK==a.DoModal())
{
m_nLineWidth=a.m_nLineWidth;
}
}
voidCGraphicView:
:
OnTc()
{
//TODO:
在此添加命令处理程序代码
CColorDialogdlg;
dlg.m_cc.rgbResult=m_full;
if(IDOK==dlg.DoModal())
{
m_full=dlg.m_cc.rgbResult;
}
}
voidCGraphicView:
:
On32783()//折线
{
//TODO:
在此添加命令处理程序代码
m_nDrawType=6;
}
voidCGraphicView:
:
On32782()//文字
{
//TODO:
在此添加命令处理程序代码
m_nDrawType=7;
}
voidCGraphicView:
:
OnChar(UINTnChar,UINTnRepCnt,UINTnFlags)//文字
{
CGraphicDoc*pDoc=GetDocument();//定义文档类指针
pDoc->str+=(char)nChar;
CClientDCdc(this);
dc.SelectObject(&zz);
dc.SetTextColor(m_clr);
dc.TextOut(pt3.x,pt3.y,pDoc->str);
CView:
:
OnChar(nChar,nRepCnt,nFlags);
}
voidCGraphicView:
:
OnSelect()
{
//TODO:
在此添加命令处理程序代码
CRectrectTrue1,rectTrue2;
m_tracker.GetTrueRect(&rectTrue1);
m_tracker.m_nStyle&=~CRectTracker:
:
resizeInside;
m_tracker.m_nStyle^=CRectTracker:
:
resizeOutside;
m_tracker.GetTrueRect(&rectTrue2);
InvalidateRect(rectTrue1.Width()>rectTrue2.Width()?
rectTrue1:
rectTrue2);
}
BOOLCGraphicView:
:
OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CGraphicDoc*pDoc=GetDocument();
if(!
m_IsDraw)
{
if(pWnd==this&&m_tracker.SetCursor(this,nHitTest))
returnTRUE;
}
returnCView:
:
OnSetCursor(pWnd,nHitTest,message);
}
4.总结与设计体会
通过这次综合作业,让我对多媒体编程有了进一步了解,对文字处理,绘图,图片处理,媒体播放,动画都有了一定的认识。
对VS2008的使用也由陌生到熟悉,对MFC提供的各种设备环境类有了进一步的认识,并能熟练应用一些常用的类和内置函数。
在实验中遇到的问题让我收获到了很多,也锻炼了自己的动手操作能力和上机能力编程能力,使课上的知识结合到实践中来,但是很多知识还不能灵活运用,以后要注重这方面的培养。
教师评语:
教师签名:
______
日 期: