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); /绘制椭圆 涂鸦部分,以
2、鼠标移动的轨迹画线。同样要用到MouseMove()函数。使起点为鼠标前一个位置,终点为鼠标当前位置,以画直线的方式完成。对于线型、线宽、颜色的设置,通过使用颜色通用对话框完成。1.2 绘图时需要用到的设备环境类介绍 设备环境类CDC提供了绘制和打印的全部函数。为了能让用户使用一些特殊的设备环境,CDC还派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC类。 (1)CPaintDC比较特殊,它的构造函数和析构函数都是针对OnPaint进行的,但用户一旦获得相关的CDC指针,就可以将它当成任何设备环境(包括屏幕、打印机)指针来使用。CPaintDC类的构造函数
3、会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。 (2)CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏)中进行绘图,点(0,0)通常指的是客户区的左上角。而CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。CWindowDC和CClientDC构造函数分别调用GetWindowDC和GetDC,但它们的析构函数都是调用ReleaseDC函数1.3 CRect类的常用操作 1.4画笔 画笔是Windows应用程序中用来绘制各种直线和曲线的一种图形工具,它可分为修饰画笔和几何画笔两种类型。在这两种类型中,几何画
4、笔的定义最复杂,它不但有修饰画笔的属性,而且还跟画刷的样式、阴影线类型有关,通常用在对绘图有较高要求的场合。而修饰画笔只有简单的几种属性,通常用在简单的直线和曲线等场合。 一个修饰画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。默认的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线等七种风格。 1.5画刷 画刷用于指定填充的特性,许多窗口、控件以及其他区域都需要用画刷进行填充绘制,它比画笔的内容更加丰富。 画刷的属性通常包括填充色、填充图案和填充样式
5、三种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8 x 8位图,而填充样式往往是CDC内部定义的一些特性,它们都是以HS_为前缀的标识。4设计方法及步骤void CGraphicView:OnLine() / TODO: 在此添加命令处理程序代码 m_nDrawType=1;OnRectangle() m_nDrawType=2;OnEllipse() m_nDrawType=3;OnLButtonDown(UINT nFlags, CPoint point) 在此添加消息处理程序代码和/或调用默认值 /m_ptOrigin=point; :S
6、etCursor(m_HCross);/这一句能防止左键单击的时候,保持鼠标样式不变_ m_ptOrigin=point;_ m_ptOld=point; SetCapture();/捕获鼠标,充分控制鼠标_ m_Dragging=1; RECT Rect; GetClientRect(&Rect);/取得窗口当前显示坐标_ ClientToScreen(&/转换为屏幕坐标_ClipCursor(&/限定光标在指定矩形区域_ if(m_nDrawType=6) SetCursor(m_HCross); /使用新光标 m_bDraw=TRUE; m_ptOld=point; SetCapture
7、(); /捕捉鼠标 CRect rect; GetClientRect(&rect); /获取客户端窗口矩形区域 ClientToScreen(& /转换为屏幕坐标 ClipCursor(rect); /限定鼠标指针不能移出客户窗口 CClientDC dc(this); pt2=point;/当前鼠标按下点赋值给pt2 ckbl=true;/作用和画直线一样,保证只有在按下左键到抬起左键之间的mousemove有用.。 dc.MoveTo(pt1); dc.LineTo(point); if(m_nDrawType=7) CGraphicDoc*pDoc=GetDocument(); pt3
8、=point;/定义pt6也是为了防止混乱,因为前面用的不是pt6,实验的时候会出现错误。 pDoc-str=;/文档类定义 CView:OnLButtonDown(nFlags, point);OnLButtonUp(UINT nFlags, CPoint point) CClientDC dc(this); CPen newPen(PS_SOLID,m_nLineWidth, m_clr); CPen *pOldPen = dc.SelectObject(&newPen); CBrush*pBrush = CBrush:FromHandle(HBRUSH)GetStockObject(NU
9、LL_BRUSH); dc.SelectObject(pBrush); /设置透明画刷 switch (m_nDrawType) case 1: dc.MoveTo(m_ptOrigin); break; case 2: dc.Rectangle(CRect(m_ptOrigin,point); case 3: dc.Ellipse(CRect(m_ptOrigin,point); case 4: dc.SetPixel(point,m_clr); case 5: m_bDraw=FALSE; ReleaseCapture(); /释放鼠标捕获 ClipCursor(NULL); case 6
10、: dc.SetROP2(m_clr);/擦除旧线 dc.LineTo(pt2);/擦除最后一次移动画的线,可有可恶 dc.SetROP2(R2_COPYPEN);/ 设置绘图模式,以当前画笔绘图,即 绘制新线 ckbl=false; pt1=point;/把这次鼠标抬起的点作为下次鼠标按下命令画直线的起点。#与画直线的区别。 if (m_Dragging)_ _ m_Dragging=0; :ReleaseCapture();/结束捕获鼠标_ClipCursor(NULL);/解锁鼠标 CClientDC ClientDC(this); ClientDC.SetROP2(R2_NOTXORP
11、EN); ClientDC.SetROP2(m_clr);/缺省绘图模式,像素为画笔颜色 CPen pen(PS_SOLID,m_nLineWidth,m_clr); ClientDC.SelectObject(&pen);OnLButtonUp(nFlags, point);OnMouseMove(UINT nFlags, CPoint point)/逆转当前屏幕颜色来画线的绘图方式_ CBrush*pBrush = CBrush: ClientDC.SelectObject(pBrush); switch (m_nDrawType) case 1: ClientDC.MoveTo(m_pt
12、Origin); ClientDC.LineTo(m_ptOld); /擦去上一次的线_ ClientDC.LineTo(point);/绘制这一次的临时线_ m_ptOld=point; break; case 2: ClientDC.Rectangle(CRect(m_ptOrigin,m_ptOld); ClientDC.Rectangle(CRect(m_ptOrigin,point); case 3: ClientDC.Ellipse(CRect(m_ptOrigin,m_ptOld); ClientDC.Ellipse(CRect(m_ptOrigin,point); case 5
13、: ClientDC.SelectObject (& ClientDC.MoveTo (m_ptOld); ClientDC.LineTo (point); case 6: CClientDC dc(this); if (ckbl) dc.SetROP2(R2_MERGEPENNOT);/。即擦除旧线 dc.MoveTo(pt1); dc.LineTo(pt2);/第一次移动,擦除鼠标按下画的直线以后每次移动擦除上次移动画的线。 dc.LineTo(point);/重新画线 pt2=point; _OnMouseMove(nFlags, point);Oncolor() CColorDialo
14、g 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;OnFileOpen() CString strFilter,str; strFilter=位图文件(.bmp)|*.bmp| CFileDialog dlg(TRUE,NULL,NULL, OFN_FILEMUSTEXIST,strFilter); if(IDOK = dlg.DoModal() str=dlg.GetPathName(); m_h
15、Bmp=LoadImage(NULL,str, IMAGE_BITMAP,0,0,LR_LOADFROMFILE); Invalidate(); / 强制调用OnDraw _OnDot() m_nDrawType=4;OnTuya() m_nDrawType=5;OnXx() CSettingDlg a; 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()
16、/折线 m_nDrawType=6;On32782()/文字 m_nDrawType=7;OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)/文字 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() CRect rectTrue1, rect
17、True2; m_tracker.GetTrueRect(&rectTrue1); m_tracker.m_nStyle &= CRectTracker:resizeInside; m_tracker.m_nStyle = CRectTracker:resizeOutside;rectTrue2); InvalidateRect(rectTrue1.Width() rectTrue2.Width() ? rectTrue1 : rectTrue2);BOOL CGraphicView:OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) Ad
18、d your message handler 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