南工程多媒体技术课设绘图软件Word格式.docx
- 文档编号:17220732
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:17
- 大小:239.61KB
南工程多媒体技术课设绘图软件Word格式.docx
《南工程多媒体技术课设绘图软件Word格式.docx》由会员分享,可在线阅读,更多相关《南工程多媒体技术课设绘图软件Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
✧画椭圆
✧涂鸦
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;
}
OnRectangle()
m_nDrawType=2;
OnEllipse()
m_nDrawType=3;
OnLButtonDown(UINTnFlags,CPointpoint)
在此添加消息处理程序代码和/或调用默认值
//m_ptOrigin=point;
:
SetCursor(m_HCross);
//这一句能防止左键单击的时候,保持鼠标样式不变_
m_ptOrigin=point;
_
m_ptOld=point;
SetCapture();
//捕获鼠标,充分控制鼠标_
m_Dragging=1;
RECTRect;
GetClientRect(&
Rect);
//取得窗口当前显示坐标_
ClientToScreen(&
//转换为屏幕坐标_
ClipCursor(&
//限定光标在指定矩形区域__
if(m_nDrawType==6)
{
SetCursor(m_HCross);
//使用新光标
m_bDraw=TRUE;
m_ptOld=point;
SetCapture();
//捕捉鼠标
CRectrect;
GetClientRect(&
rect);
//获取客户端窗口矩形区域
ClientToScreen(&
//转换为屏幕坐标
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);
OnLButtonUp(UINTnFlags,CPointpoint)
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);
break;
case2:
dc.Rectangle(CRect(m_ptOrigin,point));
case3:
dc.Ellipse(CRect(m_ptOrigin,point));
case4:
dc.SetPixel(point,m_clr);
case5:
{
m_bDraw=FALSE;
ReleaseCapture();
//释放鼠标捕获
ClipCursor(NULL);
}
case6:
dc.SetROP2(m_clr);
//擦除旧线
dc.LineTo(pt2);
/////擦除最后一次移动画的线,可有可恶
dc.SetROP2(R2_COPYPEN);
//设置绘图模式,以当前画笔绘图,即绘制新线
ckbl=false;
pt1=point;
///把这次鼠标抬起的点作为下次鼠标按下命令画直线的起点。
######与画直线的区别。
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);
OnLButtonUp(nFlags,point);
OnMouseMove(UINTnFlags,CPointpoint)
//逆转当前屏幕颜色来画线的绘图方式_
CBrush*pBrush=CBrush:
ClientDC.SelectObject(pBrush);
switch(m_nDrawType)
case1:
ClientDC.MoveTo(m_ptOrigin);
ClientDC.LineTo(m_ptOld);
//擦去上一次的线_
ClientDC.LineTo(point);
//绘制这一次的临时线_
m_ptOld=point;
break;
case2:
ClientDC.Rectangle(CRect(m_ptOrigin,m_ptOld));
ClientDC.Rectangle(CRect(m_ptOrigin,point));
case3:
ClientDC.Ellipse(CRect(m_ptOrigin,m_ptOld));
ClientDC.Ellipse(CRect(m_ptOrigin,point));
case5:
ClientDC.SelectObject(&
ClientDC.MoveTo(m_ptOld);
ClientDC.LineTo(point);
case6:
CClientDCdc(this);
if(ckbl)
{
dc.SetROP2(R2_MERGEPENNOT);
//。
即擦除旧线
dc.MoveTo(pt1);
dc.LineTo(pt2);
//第一次移动,擦除鼠标按下画的直线@@@@@以后每次移动擦除上次移动画的线。
dc.LineTo(point);
//重新画线
}
pt2=point;
}
}_
OnMouseMove(nFlags,point);
Oncolor()
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;
OnFileOpen()
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_
OnDot()
m_nDrawType=4;
OnTuya()
m_nDrawType=5;
OnXx()
CSettingDlga;
a.m_nLineWidth=m_nLineWidth;
if(IDOK==a.DoModal())
m_nLineWidth=a.m_nLineWidth;
OnTc()
dlg.m_cc.rgbResult=m_full;
m_full=dlg.m_cc.rgbResult;
On32783()//折线
m_nDrawType=6;
On32782()//文字
m_nDrawType=7;
OnChar(UINTnChar,UINTnRepCnt,UINTnFlags)//文字
CGraphicDoc*pDoc=GetDocument();
//定义文档类指针
pDoc->
str+=(char)nChar;
dc.SelectObject(&
zz);
dc.SetTextColor(m_clr);
dc.TextOut(pt3.x,pt3.y,pDoc->
str);
OnChar(nChar,nRepCnt,nFlags);
OnSelect()
CRectrectTrue1,rectTrue2;
m_tracker.GetTrueRect(&
rectTrue1);
m_tracker.m_nStyle&
=~CRectTracker:
resizeInside;
m_tracker.m_nStyle^=CRectTracker:
resizeOutside;
rectTrue2);
InvalidateRect(rectTrue1.Width()>
rectTrue2.Width()?
rectTrue1:
rectTrue2);
BOOLCGraphicView:
OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)
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提供的各种设备环境类有了进一步的认识,并能熟练应用一些常用的类和内置函数。
在实验中遇到的问题让我收获到了很多,也锻炼了自己的动手操作能力和上机能力编程能力,使课上的知识结合到实践中来,但是很多知识还不能灵活运用,以后要注重这方面的培养。
教师评语:
教师签名:
______
日 期:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工程 多媒体技术 绘图 软件
![提示](https://static.bdocx.com/images/bang_tan.gif)