CDC类的主要绘图成员函数
DC,CDC,HDC,CClientDC....有什么本质的区别

Vc中关于DC(设备环境函数(Device Context))的理解问:设备描述表DC是一个什么概念,谁通俗的说说,先谢了学习Vc,首先遇到的就是这个dc,即设置描述表,输出文字,绘图都要用这个,好象它太重要了。
但是我就是不明白,这是什么东西。
一些教程看了,但还是不太了解,谁能通俗的说说,能快速理解它,谢谢。
答:1、作画之前需要准备好画布、画笔、调色板等。
当使用GDI函数如MoveToEx/LineTo, TextOut时,只是告诉系统要划线或写字了,但用什么样的笔(HPEN),字是什么颜色(SetTextColor),画在哪张“纸”(HBITMAP)上需要从一个由系统定义的数据结构中去读取。
这个数据结构被称为Device Context(DC)。
换句话说,GDI函数只是绘画的动作,而DC则保存了绘画所需的材料和工具。
2、设备环境函数(Device Context)设备环境是一个结构,它定义了一系列图形对象及其相关的属性,以及会影响输出结果的绘图方式。
这些图形对象包括:画笔(用于画直线),笔刷(用于绘图和填充),位图(用于屏幕的拷贝或滚动),调色板(用于定义可用的颜色集),剪裁区(用于剪裁和其他操作),路径(用于绘图和画图操作)。
设备环境函数用于对设备环境进行创建、删除或获取信息。
问:DC,CDC,HDC,CClientDC....有什么本质的区别?答:都是DC嘛,HDC就是最原始的DC 句柄,很多API的第一个参数就是一个HDC 类型,比如HDC hDC = ::GetDC( m_hWnd);::MoveToEx( hDC, 0, 0, NULL );::LineTo( hDC, 0, 100, );::ReleaseDC( m_hWnd, hDC );在MFC中,为了将API封装成一个类来操作,因此多出来了一个CDC。
所以在MFC中,都是CDC dc = GetDC();dc.MoveTo( 0, 0 );dc.LineTo( 0, 100 );this->ReleaseDC( &dc );但这样还不够,因为CDC还要你自己去释放,所有MFC中又多出来一个CClientDC, 这样你就可以这样了:CClientDC dc(this);dc.MoveTo( 0, 0 );dc.LineTo( 0, 100 );CClientDC的析构函数自己会释放自己。
DC介绍

DC 即Device Context,是GDI内部的一个资料结构,一个DC会和某个特定的显示设备(如打印机、屏幕等)产生关联。
我们如果能取得该DC的handle 那我们便可以在这显示设备上写字、画图。
在Form 或Picturebox中都有一个hdc的属性,指的便是这东西,但是,怎麽又会有一个Memory DC呢?这是一个存在记忆体内的dc ,它除了不像form picturebox能将图形、文字显示出来之外,其他的几乎都相同,它也可以用在所有的GDI API 呼叫之上,其实我们在VB中早就有使用上这Memory DC 了,只是没有自觉。
当我们设form picturebox的AutoRedraw = True时,hdc所指的便是Momoory DC,这时我们在其上作绘图动作,都没有显示在form上,这便是先前说的,它只是在记忆体中,不会真的画出图。
而我们下r efresh指令时,便是将这MemoryDC上的图,copy到form/Picture Box上。
另外我们也可以使用CreateCompatibleDC() API 它传入一个h Dc ,代表产生的Memory DC和hdc相容,若传0则是与屏幕相容的Memory DC hMemDC = CreateCompatibleDC(0)这时候,该hMemDC所指的绘图区有多大呢?其实只有一个单色Pixel,直到我们使用SelectObject( hMemDC, hBitmap)那hMemDC显示区就会有和hBitmap一样的宽度、高度、颜色选择等。
而且我们在hMemDC上的任何绘图,也都会反映在hBit Map上,也就是说,原本hBitMap所指的图,在SelectObject(hMe mDC, hBitMap)后,我们使用gdi函式在hMemDC上画一条线,那么该hBitmap所指的图也会有一条线了。
那么Memory DC又有什么作用呢?我们知道,在使用VC开发图形相关的应用程序时,常常需要使用MFC的CDC类直接把图形画在窗口上。
MFC中的CDC 绘图

MFC中的CDC 绘图绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如:void CTestView::OnDraw(CDC* /*pDC*/) {CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码}每次需要重绘窗口时(程序启动/窗口大小改变/全部或部分窗口重现/程序员调用RedrawWindow或UpdateWindow),应用程序框架都会调用该CWnd的消息响应成员函数(的覆盖)来绘制窗口客户区。
在Windows中,绘图一般在视图窗口的客户区进行,使用的是MFC的设备上下文(DC = Device-Context)类CDC中各种绘图函数。
在绘图前,必须先得到客户区大小和DC、设置绘图颜色,然后再根据文档数据或用户操作来绘制图形。
1 几何对象的结构和类为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类。
这些结构和类分别定义在头文件windef.h和afxwin.h中。
1.点1)点结构POINT点数据结构POINT用来表示一点的x、y坐标:typedef struct tagPOINT {LONG x;LONG y;} POINT;2)点类CPoint点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x和y,其构造函数有5种:CPoint( );CPoint( int initX, int initY );CPoint( POINT initPt );CPoint( SIZE initSize );CPoint( LPARAM dwPoint ); // 低字设为x、高字设为yCPoint类还定义了4个平移和设置函数:void Offset(int xOffset, int yOffset);void Offset(POINT point);void Offset(SIZE size);void SetPoint(int X, int Y);CPoint类还重载了+、-、+=、-=、==、!=等运算符来支持CPoint对象和CPoint、POINT、SIZE对象之间的运算。
CDC绘图

图形设备接口一、GDI、DC的概念1.GDI:(Graphics Device Interfase)图形设备接口,是一个应用程序与输出设备之间的中介。
一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道。
user32.dll2.DC:(Device Context)设备描述表,是一种Windows数据结构。
包括了与一个设备的绘制属性相关的信息。
所有的绘制操作通过一个设备描述表进行,绘制线条、形状和文本的Windows API 函数都与DC有关。
二、在Windows Application程序中画线1.定义两个全局变量用于记录鼠标按下的(x,y)坐标。
int nOrginX;int nOrginY;2.响应鼠标按下和鼠标抬起的消息:在Swich中加入case WM_LBUTTONDOWN:case WM_LBUTTONUP:3.在鼠标按下时记录鼠标按下的(x,y)坐标,查MSDN得知WM_LBUTTONDOWN lParam的低字存放x坐标,高字存放y坐标,将其取出存入nOrginX,nOrginY。
case WM_LBUTTONDOWN:nOrginX=lParam & 0x0000ffff;nOrginY=lParam >> 16 & 0x0000ffff;break;4.在鼠标抬起时画线:case WM_LBUTTONUP:HDC hdc;hdc=GetDC(hwnd);PAINTSTRUCT ps;::MoveToEx(hdc,nOrginX,nOrginY,NULL);::LineTo(hdc,LOWORD(lParam),HIWORD(lParam) );::ReleaseDC(hwnd,hdc);三、在MFC程序中画线:1.在CxxxView(其中xxx是你的工程名字)中响应鼠标按下和鼠标抬起的消息(因为只有CxxxView中才能接收到鼠标消息):使用ClassWizard加入WM_LBUTTONDOWN,WM_LBUTTONUP的消息响应函数OnLButtonDown, OnLButtonUp。
windows编程技术10GDI编程3—动画

第10章 GDI编程3-动画动画是利用人的视觉滞留缺陷(25ms~400ms)和心理认可来动态生成系列相关画面以产生运动视觉的技术。
位图动画是将预先制作好的一系列表示连续画面的位图,按一定的时间间隔一幅接一幅地连续显示,从而产生动画效果。
因为绘制动画所需的图形,以及拍摄和处理图片,需要美术、摄影、数字图像处理、动画设计等知识,我们这里不讲。
本书只介绍如何显示已有的位图(序列)以产生动画效果,以及如何动态绘制不同的简单图形以产生二维图形动画等。
用GDI编程实现动画,一般需要用到计时器(Timer)操作,通常在计时器响应函数OnTimer中(而不要使用OnDraw)绘图来实现动画。
10.1 固定位图动画本节介绍利用一系列的位图资源,在同一个屏幕位置,接连显示位图序列,以达到动画的效果的具体方法。
为此,可在交互绘图程序中添加一个如图10-1所示的位图动画对话框,并添加对应的对话框类CDukeDlg。
也可以创建一个基于对话框的独立的MFC应用程序。
图10-1 位图动画对话框资源当然还需添加相应的“位图动画”菜单项(ID_DUKE)和(为视图类添加)对应的菜单响应函数,并在该函数中创建对话框类的对象,打开对话框来运行动画:#include "DukeDlg.h"void CDrawView::OnDuke() {CDukeDlg dlg;dlg.DoModal();}10.1.1 准备位图、加入位图资源系列公爵(Duke)BMP文件T1.BMP ~ T10.BMP(见图10-2),来自Java吉祥物的GIF 动画文件,可存放在项目的res子目录的Duke子目录中(该位图资源已经打包成Duke.rar 文件后,放到了系里的网站和我的个人网页上)。
T1.BMP T2.BMP T3.BMP T4.BMP T5.BMPT6.BMP T7.BMP T8.BMP T9.BMP T10.BMP图10-2 Duke位图文件用VC的资源编辑器依次加入位图文件:在左边的项目工作区中选“资源视图”页,展开项目的资源列表,在“Bitmap”表项(若无此项,则可直接在项目资源项)上单击鼠标右键,在弹出的浮动菜单中选“添加资源”菜单项,在打开的“添加资源”对话框中,选中左边“资源类型”栏中的“Bitmap”表项,单击右边的“导入”按钮,在弹出的“导入”文件对话框中,定位Duke目录,选中所有Ti.BMP后按“打开”钮,则会自动加入ID为IDB_BITMAPi的位图资源。
VC绘图各种DC之间的区别和用法

VC绘图各种DC之间的区别和⽤法1、设备环境(DC)(1)在Windows中,显⽰⼯作是基于设备环境的。
所谓设备环境(DC)是⼀种Windows数据结构,该结构包含应⽤程序设备输出时所需要的信息。
(2)在使⽤任何绘图函数之前必须建⽴⼀个设备环境对象。
(3)在Visual C++ 6.0的MFC中提供了设备环境类CDC,它封装了绘图所需要的所有函数,其中包括了⼤多数的Windows API中的GDI函数。
2、设备环境类2.1. CDC类(1)CDC类是CObject类的派⽣类,也是所有设备环境类的基类。
CDC类定义了⼀个设备描述对象,并提供了对设备描述对象进⾏操作的成员函数以及对与窗⼝客户区有关的显⽰区进⾏操作的成员函数。
(2)CDC类提供的成员函数可以⽤于操作设备描述对象、使⽤绘图⼯具、选择图形设备界⾯,以及操作颜⾊和调⾊板,还⽤于取得和设置绘图属性、映射⽅式、视图和窗⼝范围的操作、坐标的转换、区域的使⽤、剪取、画线以及绘制图形和⽂字等操作。
2.2. CPaintDC类(1)CPaintDC类是CDC类的⼀个派⽣类,该类⼀般⽤在响应WM_PAINT消息的函数OnPaint()中。
(2)WM_PAINT消息是当窗⼝的某个区域需要重画时激发的窗⼝消息。
当程序中的消息循环接到WM_PAINT消息时就⾃动调⽤消息处理函数OnPaint(),如果在OnPaint函数内定义了CPaintDC类的对象,通过这个类对象就可以使⽤CDC类的成员函数完成视图客户区中的图形绘制操作。
(3)CPaintDC⽤于响应窗⼝重绘消息(WM_PAINT)时的绘图输出。
CPaintDC在构造函数中调⽤BeginPaint()取得设备上下⽂,在析构函数中调⽤EndPaint()释放设备上下⽂。
EndPaint()除了释放设备上下⽂外,还负责从消息队列中清除WM_PAINT消息。
因此,在处理窗⼝重画时,必须使⽤CPaintDC,否则WM_PAINT消息⽆法从消息队列中清除,将引起不断的窗⼝重画。
MFC中的CDC 绘图(2)

MFC中的CDC 绘图(2)4.面色(刷)在Windows中,面状图必须用刷(brush)来填充,所以面色是由刷色来确定的。
MFC中的刷类为CBrush(它也是CGDIObject的派生类),刷的创建与使用的步骤与笔的相似。
构造函数有4个:CBrush( ); // 创建一个刷的空对象CBrush( COLORREF crColor ); // 创建颜色为crColor的实心刷CBrush( int nIndex, COLORREF crColor ); // 创建风格由nIndex指定且颜色为crColor的条纹(hatch孵化)刷,其中nIndex可取条纹风格(Hatch Styles)值:符号常量数字常量风格HS_HORIZONTAL 0 水平线HS_VERTICAL 1 垂直线HS_FDIAGONAL 2 正斜线HS_BDIAGONAL 3 反斜线HS_CROSS 4 十字线(正网格)HS_DIAGCROSS 5 斜十字线(斜网格)CBrush( CBitmap* pBitmap ); // 创建位图为pBitmap的图案刷如:pDC->FillRect( &rect, new CBrush( RGB(r, g,b) ) );与构造函数相对应,有多个创建不同类型刷的成员函数:BOOL CreateSolidBrush( COLORREF crColor );BOOL CreateHatchBrush( int nIndex, COLORREF crColor );BOOL CreatePatternBrush( CBitmap* pBitmap );BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage );BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage );BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush );BOOL CreateSysColorBrush( int nIndex );预定义的刷对象有BLACK_BRUSH(黑刷)、DKGRAY_BRUSH(暗灰刷)、GRAY_BRUSH(灰刷)、HOLLOW_BRUSH(空刷)、LTGRAY_BRUSH(亮灰刷)、NULL_BRUSH(空刷)、WHITE_BRUSH (白刷)缺省的刷为空刷与笔一样,可以用函数SelectObject或SelectStockObject将自定义的刷或预定义的刷选入DC 中,供绘面状图时使用。
C++_Windows绘图

5.4.1 与绘图相关的数据类型
2.CRect类和RECT结构 CRect类等同于RECT结构,它用top、left、bottom、 right成员来定义一个矩形区域,RECT的形式是: typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT;
5.1.2 图形刷新
3.刷新方法 常用的Windows应用程序刷新窗口的方法如下: 在内存中保持一个显示输出的副本,当需要重绘 窗口时,将副本拷贝到相应的窗口中。该方法适 用于刷新位图等复杂图形。 记录曾经发生的事件,在窗口需要刷新时重新调 用窗口执行这个事件。 重新绘制图形,一般对于简单图形常采用重新绘 制图形方法执行刷新。在应用程序中,将图形绘 制处理程序放在消息WM_PAINT的响应模块中, 一旦程序接收到刷新请求即可重绘图形。
GDI是Windows用来管理图形操作的一个与设备 无关的模块。上面提到的Windows的DC也包含在 GDI中,GDI还提供了许多有关图形操作的API函 数,这些函数都与DC有关(DC句柄作为参数之 一)。MFC针对DC提供了CDC类,并且把与DC 有关的图形操作API函数封装进CDC类,作为其 成员函数。针对GDI提供的其他一些实体,如笔、 刷子等绘图工具,MFC均提供了GDI实体类,如 CPen、CBrush类等,这些实体类的抽象基类就 是CGDIObject类。
画笔是用来绘制各种直线和曲线的一种图形工具。 系统默认的画笔具有一个像素宽,风格为实线, 颜色为黑色。系统中共有4种画笔,称为库存画笔。 应用程序可以使用GetStockObject()函数来调用 Windows系统定义的画笔。4种库存画笔分别是 WHITE_PEN、BLACK_PEN、DOC_PEN、 NULL_PEN。用户也可以使用CreatePen()函数创 建出具有各种不同属性的画笔。 画笔的操作包括创建画笔、将画笔选入设备环境 和删除画笔。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CDC类的主要绘图成员函数CDC类中常用绘图函数1)绘制像素函数原型:COLORREF SetPixel(int x,int y,COLORREF crColor );设置某像素点的RGB值2)获取像素颜色函数原型:COLORREF GetPixel(int x,int y)const;返回值:指定像素的RGB值。
参数说明:得到指定像素的RGB颜色值一、画笔函数画笔是用来绘制直线、曲线或图形的边界线,是绘图工具类之一画笔通常具有线型、宽度和颜色三种属性画笔的线型通常有实线、虚线、点线、点划线、双点划线、不可见线和内框架线7种,这些线型都是以PS_为前缀的预定义标识符默认的画笔是一个像素单位的黑色实线要想更换画笔,可以在创建新画笔对象后,将其选入设备上下文,就可使用新画笔进行绘图。
1)创建画笔函数原型:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);返回值:非零。
参数说明:第一个参数nPenStyle是画笔的风格代码第二个参数nWidth是画笔的宽度第三个参数crColor是画笔的颜色。
PS_SOLID;实线;宽度任意指定PS_DASH;虚线;宽度1(不可任意指定)PS_DOT;点线;宽度1(不可任意指定)PS_DASHDOT;点划线;宽度1(不可任意指定)PS_DASHDOTDOT;双点画线;宽度1(不可任意指定)PS_NULL;不可见线;宽度1(不可任意指定)PS_INSIDEFRAME;内框架线;宽度任意指定2)选择画笔函数原型:Cpen *SelectObject(Cpen *pPen);返回值:被替代画笔的指针。
参数说明:参数pPen是Cpen类的被选中的新画笔对象指针。
本函数把原画笔换成新画笔,同时返回指向原画笔的指针。
3)删除画笔函数原型:BOOL DeleteObject( );返回值:非零。
参数说明:画笔使用完毕,把已成自由状态的画笔从系统内存中清除。
4)选择一支库画笔函数原型:virtual CGdiObject *SelectStockObject(int nIndex);返回值:被替代的CGdiObject类对象的指针。
参数说明:参数nIndex是库笔代码Windows系统中准备了一些使用频率较高的画笔,不需要创建,可以直接选用。
同样,使用完库画笔时也不需要调用DeleteObject()函数从内存中删除已使用过的画笔。
三种常用库笔:BLACK_PEN宽度为1的黑笔实线笔;WHITE_PEN宽度为1的白笔实线笔;NULL_PEN透明笔二、画刷函数(图形内部进行填充)1)创建实体画刷函数BOOL CreateSolidBrush(COLORREF crColor );选择画刷函数2)CBrush *SelectObject(CBrush *pBrush );删除画刷函数3)BOOL DeleteObject( );创建阴影画刷函数4)BOOL CreateHatchBrush(int nIndex,COLORREF crColor);第一个参数nIndex是阴影样式代码第二个参数crColor是阴影线的颜色5)选择一只库画刷函数virtual CGdiObject *SelectStockObject(int nIndex);参数:LTGRAY_BRUSH:亮灰色画刷;BLACK_BRUSH黑色画刷;NULL_BRUSH:空画刷(相当于HOLLOW_BRUSH);WHITE_BRUSH:白色画刷;DKGRAY_BRUSH 深灰色画刷;GRAY_BRUSH灰色画刷;HOLLOW_BRUSH 中空画刷三、绘制矩形函数原型:BOOL Rectangle(int x1,int y1,int x2,int y2);返回值:非零。
参数说明:该函数使用当前画刷填充矩形内部,并用当前画笔绘制矩形边界线。
CPen MyPen,* OldPen;MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));OldPen=pDC->SelectObject(&MyPen);CBrush MyBrush,*OldBrush;MyBrush.CreateSolidBrush(RGB(255,0,0));OldBrush=pDC->SelectObject(&MyBrush);pDC->Rectangle(100,100,600,300);//画矩形pDC->SelectObject(OldPen); //画框线为蓝色MyPen.DeleteObject();pDC->SelectObject(OldBrush); //填充为红色MyBrush.DeleteObject();坐标映射:MM_TEXT 每个逻辑单位等于一个设备像素,x向右为正,y向下为正MM_HIENGLISH 每个逻辑单位为0.001英寸,x向右为正,y向上为正MM_LOENGLISH 每个逻辑单位为0.01英寸,x向右为正,y向上为正MM_HIMETRIC 每个逻辑单位为0.01mm,x向右为正,y向上为正MM_LOMETRIC 每个逻辑单位为0.1mm,x向右为正,y向上为正MM_TWIPS每个逻辑单位为一个点的1/20(一个点是1/72英寸),x向右为正,y向上为正MM_ANISOTRPIC x,y 可变比例MM_ISOTROPIC x,y 等比例我们就可以通过调用CDC::SetMapMode(int nMapMode)来设置相应的映射模式。
例如:若将映射模式设置为MM_LOMETRIC,那么不管在什么设备中调用上述语句,都将显示出20*20mm的方块。
而MM_ISOTROPIC 映射模式下:纵横比总是1:1,也就是说,无论比例因子如何变化,圆总是圆的。
但,MM_ANISOTROPIC 映射模式下,x和y的比例因子可以独立地变化,即圆可以被拉扁成椭圆形状。
在映射模式MM_ANISOTROPIC 和MM_ISOTROPIC中,常常可以调用CDC::SetWindowExt(设置窗口大小)和CDC::SetViewportExt(设置视口大小)函数来设置所需要的比例因子。
“窗口”和“视口”的概念往往不易理解。
所谓“窗口”,可以理解是一种逻辑坐标下的窗口,而“视口”是我们实际看到的那个窗口,也就是设备坐标下的窗口,根据“窗口”和“视口”的大小就可以确定x和y的比例因子,它们的关系如下:x比例因子=视口x大小/窗口x大小y比例因子=视口y大小/窗口y大小四、绘制椭圆函数原型:BOOL Ellipse(int x1,int y1,int x2,int y2);返回值:非零。
参数说明:Ellipse函数中,参数x1,y1是限定椭圆范围的外接矩形左上角点的坐标;参数x2,y2是限定椭圆范围的外接矩形右下角点的坐标注意VC++中没有专门的画圆函数,只是把圆绘制为长半轴和短半轴相等的椭圆。
Ellipse函数使用当前画刷填充椭圆内部,并用当前画笔绘制椭圆边界线。
例将一个圆绘制在视区中央,圆的形状依据视区形状而定。
当窗口的形状发生改变时,圆的形状也随之改变。
坐标系的中点位于屏幕中心,X轴向右,Y轴向上。
圆的边界为一像素宽的蓝色边界线,内部填充为红色。
CRect Rect; //定义矩形对象GetClientRect(&Rect); //获得当前窗口的客户区大小pDC->SetMapMode(MM_ANISOTROPIC); //设置MM_ANISOTROPIC映射模式pDC->SetWindowExt(Rect.Width(),-Rect.Height()); //设置窗口范围pDC->SetViewportExt(Rect.right,-Rect.bottom); //设置视区范围pDC->SetViewportOrg(Rect.right/2,Rect.bottom/2); //设置视口原点CPen MyPen,*OldPen;MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));OldPen=pDC->SelectObject(&MyPen);CBrush MyBrush,*OldBrush;MyBrush.CreateSolidBrush(RGB(255,0,0));OldBrush=pDC->SelectObject(&MyBrush);pDC->Ellipse(-Rect.right/2, -Rect.bottom/2,Rect.right/2,Rect.bottom/2);pDC->SelectObject(OldPen); //蓝边MyPen.DeleteObject();pDC->SelectObject(OldBrush); //填充红色MyBrush.DeleteObject();五、绘制多边形函数BOOL Polygon(LPPOINT lpPoints,int nCount);参数说明:第一个参数lpPoints指定多边形顶点数组中每一个顶点是一个POINT结构或CPoint对象第二个参数nCount指定多边形数组中的顶点个数该函数用当前画笔绘制多边形边界线,用当前画刷填充多边形内部。
例绘制四个顶点分别位于视区上部中点、右部中点、下部中点和左部中点的菱形。
边界线为蓝色,内部用红色填充CRect Rect;GetClientRect(&Rect); //获得客户区CPen PenBlue(PS_SOLID, 5, RGB(0, 0, 255)); //定义粗蓝色画笔,绘制边界线CPen* OldPen=pDC->SelectObject(&PenBlue); //选取画笔CBrush BrushRed(RGB(255, 0, 0)); //定义红色画刷,填充多边形内部CBrush* OldBrush = pDC->SelectObject(&BrushRed); //选取画刷CPoint p[4]; //定义多边形顶点数组p[0].x=Rect.left+Rect.Width()/2;p[0].y=Rect.top; //计算顶部中点p[1].x=Rect.right;p[1].y=Rect.top+Rect.Height()/2; //计算右部中点p[2].x=p[0].x;p[2].y=Rect.bottom; //计算下部中点p[3].x=Rect.left;p[3].y=p[1].y; //计算左部中点pDC->Polygon(p, 4);//绘制多边形pDC->SelectObject(OldPen);//画笔勾边pDC->SelectObject(OldBrush);//画刷填充六、填充函数void FillRect(LPCRECT lpRect,CBrush *pBrush);参数说明:第一个参数lpRect指定矩形,是一个Rect结构或CRect对象第二个参数pBrush指定画刷对象指针。