MFC经典绘图(清华大学)
- 格式:ppt
- 大小:1.41 MB
- 文档页数:31
一、绘制线条1、新建MFC单文档工程Draw。
2、为CDrawView类添加CPoint类型的成员变量m_ptOrigin,将其访问权限设置为Private。
3、添加WM_LBUTTONDOWN的消息响应函数,该函数初始化m_ptOrigin变量m_ptOrigin=point。
4、添加WM_LBUTTONUP的消息响应函数void CDrawView::OnLButtonUp(UINT nFlags, CPoint point),在该函数里可添加如下各种代码实现绘图:(1)、利用SDK全局函数实现画线功能:HDC hdc;hdc=::GetDC(m_hWnd); //获得窗口的设备描述表MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //移动到线条的起点LineTo(hdc,point.x,point.y); //画线::ReleaseDC(m_hWnd,hdc);//释放设备描述表知识点:所有派生于CWnd类的子类都拥有m_hWnd这一成员变量,m_hWnd被定义为HWND类型,用于保存当前窗口的句柄,该成员变量具有public的访问权限。
(2)、利用MFC的CDC类实现画线功能:CDC* pDC=GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);知识点:MFC提供了设备描述表的封装类CDC,该类封装了所有与绘图相关的操作。
该类提供了一个数据成员m_hDC,用来保存与CDC类相关的DC句柄(3)、利用MFC的CClientDC类实现画线功能:CClientDC dc(this);//dc(GetParent())可获得父窗口的DCdc.MoveTo(m_ptOrigin);dc.LineTo(point);知识点:CClientDC派生于CDC类,当一个CClientDC对象在构造时,它在内部会调用GetDC 函数,在这个CClientDC对象析构时,它会调用ReleaseDC函数。
画点像素点的绘制不过是改变单个像素点的颜色。
SetPixel( ) 试图用指定的颜色画一个像素,返回绘制时使用的实际颜色SetPixelV( ) 与上面的基本相同,但不用返回绘制时使用的实际颜色,因而速度更快画线画线即改变屏幕上一系列像素点的颜色。
M o v e To( ) 开始画线、弧和多边形时,把光标移动到一个初始位置L i n e To( ) 画一条从初始位置到另一个点的直线Arc( ) 画一段弧A r c To( ) 画一段弧,并更新初始位置AngleArc( ) 画一条线,然后画一段弧,并更新初始位置PolyDraw( ) 画一系列线段和B e z i e r样条PolyLine( ) 画一系列线段PolyPolyLine( ) 画多个系列线条画形状这里的形状是一系列封闭线条。
Rectangle( ) 画一个矩形Pie( ) 画一个饼状楔形RoundRect( ) 画一个圆角矩形Draw3dRect( ) 画一个三维矩形Polygon( ) 画一个多边形DrawEdge( ) 画一个矩形的边缘PolyPolygon( ) 创建一个或多个多边形DrawFrameControl( ) 画一个框架控件Ellipse( ) 画一个椭圆形状填充和翻转填充和翻转改变一个形状内的所有像素点颜色。
FillRect( ) 填充一个矩形FillSolidRect( ) 用一单色填充一个矩形InvertRect( ) 反转一个矩形的颜色ExtFloodFill( ) 用当前画刷填充一个区域,提供比FloodFill( )成员函数更多的灵活性FrameRect( ) 画一个矩形的边框下面三个函数包括一个区域对象,它实际上是一个线条列表,形成一个由设备环境维护的形状。
有关区域的详细讨论参见4 . 4 . 8节“剪裁属性”。
FillRgn( ) 填充一个区域InvertRgn( ) 反转一个区域的颜色FrameRgn( ) 画一个特定区域的边框滚动通过滚动,可移动屏幕周围像素颜色。
mfc绘图课程设计一、课程目标知识目标:1. 学生能理解MFC(Microsoft Foundation Class)的基本概念及其在绘图中的应用;2. 学生能掌握MFC绘图程序的基本框架和常用绘图工具的使用;3. 学生能了解并运用MFC中的颜色、画笔、画刷等绘图属性。
技能目标:1. 学生能运用MFC编写简单的绘图程序;2. 学生能通过MFC实现基本的图形绘制,如线条、矩形、椭圆等;3. 学生能通过MFC实现图形的填充、旋转等变换。
情感态度价值观目标:1. 培养学生对计算机绘图产生兴趣,激发其主动探索精神;2. 培养学生在团队合作中相互学习、交流,形成良好的合作氛围;3. 培养学生具备创新思维,敢于尝试新方法,提高解决问题的能力。
课程性质:本课程为信息技术学科选修课程,适用于对计算机绘图有兴趣的学生。
学生特点:学生具备一定的编程基础,对MFC有一定了解,具有较强的学习能力和探索精神。
教学要求:课程要求教师引导学生主动探索,通过实践操作,掌握MFC绘图的相关知识和技能。
在教学过程中,注重培养学生的动手能力和创新能力。
教学评估以学生的实际操作和绘图作品为依据。
二、教学内容1. MFC绘图基础理论:- MFC概述及其在绘图中的应用;- 常用绘图工具和类的介绍。
2. MFC绘图程序框架:- 创建MFC绘图程序的基本步骤;- 常用绘图函数和功能介绍。
3. 图形绘制与变换:- 线条、矩形、椭圆等基本图形的绘制;- 图形的填充、旋转等变换操作。
4. MFC绘图进阶应用:- 颜色、画笔、画刷等绘图属性的应用;- 综合实例分析,实现复杂图形的绘制。
教学大纲安排:第一课时:MFC绘图基础理论,介绍MFC及其在绘图中的应用,学习常用绘图工具和类。
第二课时:MFC绘图程序框架,学习创建MFC绘图程序的基本步骤和常用绘图函数。
第三课时:图形绘制与变换,实践绘制基本图形和实现图形的填充、旋转等变换。
第四课时:MFC绘图进阶应用,学习颜色、画笔、画刷等绘图属性的应用,分析综合实例。
M F C简单的绘图程序——王帅目录摘要 (2)关键字 (2)1 引言 (2)设计目的 ....................................................... 错误!未定义书签。
2 功能说明 (2)菜单栏 ........................................................ 错误!未定义书签。
图形 (3)画笔 (4)画硬币 (4)工具栏 (5)状态栏 (5)3 功能的实现 (5)视图设计 (5)编辑资源 (6)编程思路及各个函数的实现 (7)(1)思路 (7)(2)代码的实现 (7)1.为基本形状创建一个基类 (8)2.基本形状类的创建 (8)矩形类的创建及定义 (8)圆形类的创建及定义 (10)正五边形类的创建及定义 (11)正三角形类的创建及定义 (14)椭圆类的创建及定义 (16)正四边形类的创建及的定义 (17)正六边形类的创建及定义 (18)直线类的创建及定义 (19)3.各基本形状类在CMyDraw2_0类中的调用和绘图的实现 (20)矩形类的调用与与绘图的实现 (20)圆形类的调用 (24)正三角形类的调用 (25)基本类型调用的剩余代码 (26)4.画笔的使用、颜色及大小的调整 (29)5.画硬币 (35)6.工具栏中的自定义控件 (38)7.状态栏中的显示 (39)4程序功能的测试 (41)5最后总结 (42)摘要:本绘图程序能够进行基本图形的绘画,如直线,圆,矩形,三角形等等,并且在此基础上添加了多边形的绘画,如正五边形等。
除此之外,还能够进行随手画,即用鼠标随意画线条。
为了更好的绘图,还添加了对画笔粗细的调整,以及对画笔颜色的调整,除了特定的颜色,颜色还可根据输入的RGB值随意更改。
还有一些老师的要求,加入了画硬币、显示硬币数目即鼠标坐标等信息。
本程序主要采用面向对象写法。
关键字:程序设计,MFC,绘图1.引言设计目的本绘图程序的设计不仅仅局限于老师课堂的要求,通过C++的编写实现绘图要求,我还想要在此基础上,加入自己的一些想法,想要更好地了解MFC,更好地去实现自己的想法。
源码目录一、课程设计目的-------------------------------------3二、课程设计内容与实现的功能-------------------------3三、系统分析与设计-----------------------------------31、系统分析----------------------------------------------------------32、系统设计----------------------------------------------------------4四、系统测试与调试分析-------------------------------81、系统测试-----------------------------------------------------------82、调试分析-----------------------------------------------------------9五、用户手册-----------------------------------------10六、程序清单-----------------------------------------11七、体会与自我评价-----------------------------------19八、参考文献-----------------------------------------19九、课程设计评价-------------------------------------20一、课程设计目的进行C++面向对象程序设计课程设计主要是在学习C++这门面向对象语言的根底上,在完成C++面向对象程序设计各局部实验的根底上,通过自学MFC,掌握一种可视化编程的方法,并通过实践加深对可视化编程与C++面向对象程序设计语言特点的认识与理解。
同时,可以提高运用C++编程语言解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力选作这个二维图形的设计题目,主要是基于了解在电脑上的画图软件的功能是如何实现的,以及在MFC平台是怎么实现功能调用的,实现图形的绘制,从而可以进一步的了解到c++是如何面向对象的程序设计,以及在我们平常使用的一些软件的一些功能实现的算法。
M F C简单的绘图程序——王帅目录摘要 (2)关键字 (2)1 引言 (2)设计目的 (3)2 功能说明 (2)2.1菜单栏 (3)2.1.1图形 (3)2.1.2画笔 (4)2.1.3画硬币 (4)2.2工具栏 (5)2.3状态栏 (5)3 功能的实现 (5)3.1 视图设计 (5)3.2 编辑资源 (6)3.3 编程思路及各个函数的实现 (7)(1)思路 (7)(2)代码的实现 (7)1.为基本形状创建一个基类 (8)2.基本形状类的创建 (8)2.1矩形类的创建及定义 (8)2.2圆形类的创建及定义 (10)2.3正五边形类的创建及定义 (11)2.4正三角形类的创建及定义 (14)2.5椭圆类的创建及定义 (16)2.6正四边形类的创建及的定义 (17)2.7正六边形类的创建及定义 (18)2.8直线类的创建及定义 (19)3.各基本形状类在CMyDraw2_0类中的调用和绘图的实现 (20)3.1矩形类的调用与与绘图的实现 (20)3.2圆形类的调用 (24)3.3正三角形类的调用 (25)3.4基本类型调用的剩余代码 (26)4.画笔的使用、颜色及大小的调整 (29)5.画硬币 (35)6.工具栏中的自定义控件 (38)7.状态栏中的显示 (39)4程序功能的测试 (41)5最后总结 (42)摘要:本绘图程序能够进行基本图形的绘画,如直线,圆,矩形,三角形等等,并且在此基础上添加了多边形的绘画,如正五边形等。
除此之外,还能够进行随手画,即用鼠标随意画线条。
为了更好的绘图,还添加了对画笔粗细的调整,以及对画笔颜色的调整,除了特定的颜色,颜色还可根据输入的RGB值随意更改。
还有一些老师的要求,加入了画硬币、显示硬币数目即鼠标坐标等信息。
本程序主要采用面向对象写法。
关键字:程序设计,MFC,绘图1.引言设计目的本绘图程序的设计不仅仅局限于老师课堂的要求,通过C++的编写实现绘图要求,我还想要在此基础上,加入自己的一些想法,想要更好地了解MFC,更好地去实现自己的想法。
面向对象课程作业我做的是画笔程序,首先把作业要求写在开头。
作业要求:1、程序界面参考Microsoft画图程序。
2、能够支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆3、支持区域选中(通过鼠标拖拽方框选中),并删除选中区域内所画的形状。
4、支持各种笔形画图时的前景和背景色。
5、支持图擦功能,选中图擦时,随着图擦的移动,根据图擦的大小,将图擦经过的区域中的形状相关部分清除。
6、支持打印、打印预览功能,并保持图片所见即所得。
支持将所画的内容保存为文件,格式为BMP格式。
本设计报告包括以下几部分:一.程序实现的功能二.程序功能的具体实现方法三.程序示例说明四.课程设计的体会五.本程序的不足之处六.本程序参考文献一.程序实现的功能程序所用开发工具: Visual C++ 6.0编程工具。
实现功能:能够支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆;支持区域选中(通过鼠标拖拽方框选中),并删除选中区域内所画的形状;支持各种笔形画图时的前景和背景色;支持图擦功能,选中图擦时,随着图擦的移动,根据图擦的大小,将图擦经过的区域中的形状相关部分清除;支持打印、打印预览功能;并保持图片所见即所得;支持将所画的内容保存为文件,格式为BMP格式。
另外本程序还支持任意设置画笔的颜色,设置画笔笔画的宽度(粗细),支持当窗口发生重绘时将原来所绘的图形在新窗口中重绘出来。
二.问题分析按照程序设计实现功能的要求,其中应该有以下几部分,划线的实现部分可以在鼠标单击响应函数中实现,其中有:鼠标左键按下,鼠标左键移动,鼠标左键弹起等;设置颜色部分应该创建一个颜色设置对话框,这可用MFC自带的类来实现,为此我们在菜单中添加一个设置菜单,并且下面添加颜色设置菜单项,并且对此菜单项的添加命令响应函数,在其中创建颜色对话框,并且将我们选择的颜色保存到我们预定义的对象中去;同理笔画宽度和背景色的设置也是如此;其中在背景色的设置中当我们选择某种颜色设置背景色时,程序将会刷新窗口,并且用新的背景色填充视口背景。
MFC经典绘图方法总结Windows 绘图的实质就是利用windows提供的图形设备接口GDI(Graphics Device Interface)将图形会制在显示器上。
为了支持GDI绘图,MFC提供了两种重要的类:设备上下文DC(Device Context)类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。
CDC类介绍:在MFC中,CDC是设备上下文类的基类,派生类包括:CClientDC, CPaintDC, CWindowDC, CMetaFileDC类CClientDC 客户区设备上下文,绘制客户区时CPaintDC 一般发生在窗口需要重绘时CWindwDC 可以绘制整个窗口,通常在窗口WM_NCPAINT消息的响应函数CWnd::OnNCPaint()中使用CMetaFileDC 专门用于图元文件的绘制,图元文件记录一组GDI命令,重建图形输出。
CDC包含m_hDC和m_hAttribDC二个设备上下文。
CDC指导所有对m_hDC的输出GDI调用(SetTextColor)以及对m_hAttribDC的大部分属性GDI调用(GetTextColor)。
CDC对象的重要函数如下:1、为指定设备创建上下文virtual BOOL CreateDC(...)比如创建一个为屏幕的设备上下文CDC dc;dc.CreateDC("DISPLAY", NULL, NULL,NULL);2、创建内存设备上下文,与指定设备上下文兼容virtual BOOL CreateCompatibleDC( CDC * pDC)3、删除CDC对象对应的Windows设备上下文, 通常不调用该函数而是使用析构程序virtual BOOL DeleteDC();4、将HDC句柄转化为设备上下文的句柄: CDC *pDC=CDC::FromHandle( hDC )5、选择GDI对象入选到设备上下文中,一共有五种形式:CPen * SelectObject( CPen * pPen) ;CBrush * SelectObject( CBrush * pBrush) ;virtual CFont * SelectObject( CFont * pFont) ;CBitmap * SelectObject( CBitmap * pBitmap) ;int SelectObject( CRgn * pRgn) ;例:Cpen cpen;pen.CreatePen( PS_SOLID, 2, RGB(255,0,0) );Cpen *pOldPen=(CPen*)pDC->SelectObject(&pen); //设置新画笔,记录旧画笔....pDC->SelectObject(pOldPen); //还原画笔三种方法创建画笔1/构造函数:CPen();CPen( int nPenStyle, int nWidth, COLORREF crColor );CPen(...)略2/CreatePen( int nPenStyle, int nWidth, COLORREF crColor )3/CreatePenIndirect( LPLOGPEN lpLogpen )typedef struct tagLOGPEN{UINT lopnStyle;POINT lopnWidth;COLORREF lopnColor;}LOGPEN, *LPLOGPEN;例:LOGPEN lppn;lppn.lopnColor=RGB(255,0,0);lppn.lopnStype=PS_DASHDOT;lgpn.lopnWidth.x=2;lgpn.lopnWidth.y=2;CPen pen;pen.CreatePenIndirect( &lppn );画刷三种方法创建1/构造函数:CBrush();CBrush(COLROREF crColor);CBrush(int nIndex, COLORREF crColor);nIndex 哪种类型的网格, HS_BDIAGONAL HS_CROSSHS_VERTICAL HS_HORIZONTAL2/CreateSolidBrush( COLORREF crColor);3/CreateHatchBrush( int nIndex , COLORREF crColor );4/CreateBrushIndirect( const LOGBRUSH* lpLogBrush );typedef struct tagBRUSH{UINT lbStyle; // BS_HA TCHED, BS_SOLID , BS_NULLCOLORREF lopnColor;LONG lbHatch; //HS_BDIAGONAL HS_CROSS HS_VERTICAL HS_HORIZONTAL}LOGBRUSH, *LPLOGBURSH;例:CRect Rect(0,0,200,200);CBrush brush(HS_HORIZONTAL,RGB(0,255,0));CBrush *pOldBursh=pDC->SelectObject(&brush);pDC->Rectangle(Rect);pDC->SelectObject( pOldBursh);图形绘制1.点绘制//返回RGB值COLORREF SetPixel(int x, int y, COLORREF crColor);COLORREF SetPixel(POINT point, COLORREF crColor);//返回BOOL值,绘制是否成功.BOOL SetPixelV(int x, int y, COLORREF crColor);BOOL SetPixelV(POINT point, COLORREF crColor);2.直线绘制//返回CPoint对象的x和y坐标的前一次取值CPoint MoveTo(int x, int y);CPoint MoveTo(POINT point);//返回绘制是否成功BOOL MoveTo(int x, int y);BOOL MoveTo(POINT point);例:CPen pen;pen.CreatePen(PS_SOLID,2,RGB(0,255,0));CPen* oldPen =(CPen *)pDC->SelectObject(&pen);CPoint oldPoint=pDC->MoveTo(600,300);pDC->LineTo(500,500);3.矩形绘制1/矩形绘制BOOL Rectangle( int x1, int y1, int x2, int y2 );BOOL Rectangle( LPRECT lpRect);例:pDC->SelectObject( oldPen);pDC->Rectangle(0,0,600,300);CRect Rect(0,0,300,200);CBrush brush(HS_HORIZONTAL,RGB(0,255,0));CBrush *pOldBursh=pDC->SelectObject(&brush);pDC->Rectangle( &Rect );pDC->SelectObject( pOldBursh);例:CPen pen;pen.CreatePen(PS_DASH, 1,RGB(255,0,0));LOGBRUSH lb;memset( &lb,0, sizeof(lb));lb.lbStyle=BS_HATCHED;lb.lbHatch=HS_DIAGCROSS;CBrush brush;brush.CreateBrushIndirect( &lb);CPen *pOldPen=(CPen *)pDC->SelectObject( & pen);CBrush *pOldBrush=(CBrush*)pDC->SelectObject(&brush);pDC->Rectangle(0,0,200,200);pDC->SelectObject( pOldPen);pDC->SelectObject( pOldBrush);2/三维矩形线框绘制void Draw3dRect(int x, int y, int cx, int cy , COLORREF clrTopLeft, COLORBEF clrBottomRight );void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORBEF clrBottomRight );例:pDC->Draw3dRect(100, 100, 200, 300, RGB(255,0,0), RGB(0,255,0));3/表示焦点风格矩形void DrawFocusRect( LPCRECT lpRect);例:CRect rt( 400,400, 450, 450);pDC->DrawFocusRect( &rt);4/绘制拖曳形线框void DrawDragRect(LPCRECT lpRect , SIZE size LPCRECT lpRectLast, SIZE sizeLast, CBrush* pBrush=NULL , CBrush* pBrushLast=NULL);5/圆角矩形void RoundRect(LPCRECT lpRect , POINT point); //point.x 椭圆宽, point.y 椭圆高void RoundRect(int x1, int y1, int x2, int y2, int x3, int y3 );例:pDC->RoundRect(250, 250, 400, 400, 50, 100);4.椭圆绘制BOOL Ellipse( LPCRECT lpRect ) //椭圆的外接矩形范围文字绘制TextOut函数返回值是BOOLBOOL TextOut( int x, int y, const CString & str );virtual BOOL TextOut(int x, int y, LPCSTR lpszString, int nCount);DrawText函数返回值是文本高度int DrawText ( LPCSTR lpszString, int nCount, LPRECT lpRect, UNIT nFormat);int DrawText ( const CString& str, LPRECT lpRect, UNIT nFormat); //DT_BOTTOM DT_LEFT...//注意:如果nFormat 参数指定了DT_CALCRECT标志,由lpRect指定的矩形将会更新,以反映显示文本需要的高度和宽度,但并不绘制显示文字背景色和前景色virtual COLORREF SetBKColor( COLORREF crColor);int SetBKMode( int nBKMode); // nBKMode: OPAQUE, TRANSPARENT时,SetBKColor失效例:CRect rect;GetClientRect(&rect);pDC->FillSolidRect(rect,RGB(0,0,255));CString strText=L"VC++ BKColor Demo...";pDC->SetTextColor(RGB(255,255,255));pDC->SetBkColor(RGB(255,0,0));pDC->SetBkMode(TRANSPARENT);pDC->TextOut(10,10,strText);文字字体设置文字的字体会使用到MFC下的CFont类,然后调用CFont类下的四个成员函数: CreateFont, CreateFontIndirect, CreatePointFont和CreatePointFontIndirect,详见msdn帮助例:1/CreateFont 函数CFont font;font.CreateFont(25,0,1800,0,FW_BOLD,1,1,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,L"Courier New");CString strText=L"VC++ Font Demo...";pDC->SetTextColor( RGB(255,0,0));CFont *pOldFont=(CFont*)pDC->SelectObject(&font);pDC->TextOut(210,210, strText);pDC->SelectObject(pOldFont);2/ CreateFontIndirect(const LOGFONT* lpLogFont);typedef struct tagLOGFONT{//14个成员变量与世隔绝CreateFont函数类似}LOGFONT;3/如果只注重字体的高度和字体名时,使用CreatePointFont(int nPointSize, LPCSTR lpszFaceName, CDC* pDC=NULL);位图显示A:位图介绍,CBitmap类封装了Windows图形设备接口中的位图,并提供了操作位图的成员函数1/创建兼容位图,使之与指定设备兼容.BOOL CreateCompatibleBitmap(CDC *pDC, int nWidth, int nHeight);2/得到位图信息,作用是填充BITMAP结构.int GetBitmap(BITMAP * pBitMap);3/加载位图资源,加载一个命名的位图资源来初始化位图对象.BOOL LoadBitmap( LPCSTR lpszResourceName);BOOL LoadBitmap( UINT nIDResuource );B:显示位图,VC++提供BitBlt, StretchBlt和TransparentBit(需加入msimg32.lib库) 1/ BOOL BitBlt(int x , int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );//尺寸不变2/ BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC,int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop); //支持缩放/* dwRop一般设置为SRCCOPY */3/ BOOL TransparentBlt( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,HDC hdcSrc, int nXoriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);例:CBitmap bitmap;bitmap.LoadBitmap(IDB_BITAMBOW);BITMAP bm;bitmap.GetBitmap(&bm);CDC MemDC;MemDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap=(CBitmap *)MemDC.SelectObject(&bitmap);CRect rect(10,10, bm.bmWidth, bm.bmHeight);TransparentBlt(pDC->GetSafeHdc(), rect.left, rect.top, rect.Width()*5, rect.Height()*5, MemDC.GetSafeHdc(), 0, 0, bm.bmWidth, bm.bmHeight, RGB(0,0,0));//长宽扩大5倍,图片中黑色的部分将作为透明处理。
MFC绘图总结(5):设置绘图属性求索阁除了映射模式外,还有许多绘图属性可以设置,如背景、绘图方式、多边形填充方式、画弧方向、刷原点等。
1.背景1)背景色当背景模式为不透明时,背景色决定线状图的空隙颜色(如虚线中的空隙、条纹刷的空隙和文字的空隙),可以使用CDC类的成员函数GetBkColor和SetBkColor来获得和设置当前的背景颜色:COLORREF GetBkColor( ) const; // 返回当前的背景色virtual COLORREF SetBkColor( COLORREF crColor ); // 返回先前的背景色// 若出错返回0x800000002)背景模式背景模式影响有空隙的线状图的空隙(如虚线中的空隙、条纹刷的空隙和文字的空隙)用什么办法填充。
可以使用CDC类的成员函数GetBkMode和SetBkMode来获得和设置当前的背景模式:int GetBkMode( ) const; // 返回当前背景模式int SetBkMode( int nBkMode ); // 返回先前背景模式背景模式的取值2. 绘图模式绘图模式(drawing mode)指前景色的混合方式,它决定新画图的笔和刷的颜色(pbCol)如何与原有图的颜色(scCol)相结合而得到结果像素色(pixel)。
1)设置绘图模式可使用CDC类的成员函数SetROP2 (ROP = Raster OPeration 光栅操作)来设置绘图模式:int SetROP2( int nDrawMode );其中,nDrawMode可取值:绘图模式nDrawMode的取值其中,R2_COPYPEN(覆盖)为缺省绘图模式,R2_XORPEN (异或)较常用。
2)画移动图形为了能画移动的位置标识(如十字、一字)和随鼠标移动画动态图形(如直线、矩形、椭圆),必须在不破坏原有背景图形的基础上移动这些图形。
移动图形采用的是异或画图方法,移动图形的过程为:异或画图、在原位置再异或化图(擦除)、在新位置异或画图、……。