南工程多媒体技术课设绘图软件.docx

上传人:b****6 文档编号:4299993 上传时间:2022-11-29 格式:DOCX 页数:17 大小:239.61KB
下载 相关 举报
南工程多媒体技术课设绘图软件.docx_第1页
第1页 / 共17页
南工程多媒体技术课设绘图软件.docx_第2页
第2页 / 共17页
南工程多媒体技术课设绘图软件.docx_第3页
第3页 / 共17页
南工程多媒体技术课设绘图软件.docx_第4页
第4页 / 共17页
南工程多媒体技术课设绘图软件.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

南工程多媒体技术课设绘图软件.docx

《南工程多媒体技术课设绘图软件.docx》由会员分享,可在线阅读,更多相关《南工程多媒体技术课设绘图软件.docx(17页珍藏版)》请在冰豆网上搜索。

南工程多媒体技术课设绘图软件.docx

南工程多媒体技术课设绘图软件

南京工程学院

课程设计说明书

 

题目绘图软件

课程名称多媒体编程

院(系.部.中心)计算机工程学院

专业多媒体技术

班级

学生姓名

学号

设计地点

指导老师

 

设计起止时间:

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提供的各种设备环境类有了进一步的认识,并能熟练应用一些常用的类和内置函数。

在实验中遇到的问题让我收获到了很多,也锻炼了自己的动手操作能力和上机能力编程能力,使课上的知识结合到实践中来,但是很多知识还不能灵活运用,以后要注重这方面的培养。

教师评语:

 

                    教师签名:

______

                    日  期:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1