




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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对象之间的运算。2大小1)大小结构SIZE大小(size尺寸)结构SIZE用来表示矩形的宽cx和高cy:typedef struct tagSIZE LONG cx; LONG cy; SIZE;2)大小类CSize大小类CSize也为一个没有基类的独立类,封装了SIZE结构,有成员变量cx和cy,其构造函数也有5种:CSize( );CSize( int initCX, int initCY );CSize( SIZE initSize );CSize( POINT initPt );CSize( DWORD dwSize ); / 低字设为cx、高字设为cyCSizet类也重载了+、-、+=、-=、=、!=等运算符来支持CSize对象和CSize、POINT、SIZE、RECT对象之间的运算。3矩形1)矩形结构RECT矩形结构RECT定义了矩形的左上角与右下角的坐标:typedef struct tagRECT LONG left; LONG top; LONG right; LONG bottom; RECT;2)矩形类CRect矩形类CRect也为一个没有基类的独立类,封装了RECT结构,有成员变量left、top、right和bottom,其构造函数有6种:CRect( );CRect( int l, int t, int r, int b );CRect( const RECT& srcRect );CRect( LPCRECT lpSrcRect );CRect( POINT point, SIZE size );CRect( POINT topLeft, POINT bottomRight );CRect类重载了=,+、-,+=、-=,=、!=,&、|,&=、|=等运算符来支持CRect对象和CRect、POINT、SIZE、RECT对象之间的运算。还定义了转换符LPCRECT和LPRECT来自动完成CRect对象到矩形结构和类指针LPCRECT和LPRECT的转换。CRect类中常用的属性和成员函数有:int Width( ) const;int Height( ) const;CSize Size( ) const;CPoint& TopLeft( );CPoint& BottomRight( );CPoint CenterPoint( ) const;void SwapLeftRight();BOOL IsRectEmpty( ) const;BOOL PtInRect( POINT point ) const;void SetRect( int x1, int y1, int x2, int y2 );void SetRect(POINT topLeft, POINT bottomRight);void OffsetRect(int x, int y);void MoveToXY(int x, int y);3) 判断点是否在矩形中有时需要判断某点(如鼠标位置)是否在某一矩形区域中,这可以调用CRect类的PtInRect函数来做:BOOL PtInRect( POINT point ) const;该函数当点point在其矩形区域内时,返回真。注意,该矩形区域不包括矩形的右边界和底边界。例如:CRect rect( 10, 10, 371, 267 );void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if ( rect.PtInRect( point ) ) . . . . CView:OnLButtonUp(nFlags, point);2 客户区大小和DC在绘图前,必须先得到客户区大小和设备上下文DC。1获得客户区绘图一般都是在视图窗口的客户区进行,而客户区的大小在运行时可由用户改变,为了使绘制的图形能随窗口大小自动改变,必须先得到当前客户区大小的数据(宽w和高h)。获取客户区大小的方法有如下两种:1)在消息响应函数OnSize中获得利用属性窗口的信息页,在视图类中添加WM_SIZE消息的响应函数OnSize。该函数在窗口第一次显示或窗口大小被改变时会被Windows系统调用。其输入参数中的cx和cy就是客户区大小的宽和高,可将它们赋值给类变量(如m_iW和m_iH)供绘图时使用。例如void CDrawView:OnSize(UINT nType, int cx, int cy) CView:OnSize(nType, cx, cy); / TODO: 在此处添加消息处理程序代码 m_iW = cx; m_iH = cy;其中,nType的值为:SIZE_MAXIMIZED(窗口已被最大化)SIZE_MINIMIZED(窗口已被最小化)SIZE_RESTORED(窗口已被改变大小)SIZE_MAXHIDE(其他窗口被最大化)SIZE_MAXSHOW(其他窗口从最大化还原)2)调用成员函数GetClientRect得到可在绘图前,定义一个矩形变量rect,然后再调用CWnd类的成员函数GetClientRect:void GetClientRect( LPRECT lpRect ) const;得到当前客户区矩形的数据,其中的右(right)与底(bottom)就是客户区的宽与高(其左left与顶top都为0)。例如: RECT rect; GetClientRect(&rect); int w = rect.right, h = rect.bottom;2DC在Windows中,绘图使用的是MFC的DC(Device-Context, 设备上下文)类CDC中各种绘图函数。0)CDC类CDC是CObject的直接派生类,CDC类自己也有若干派生类,其中包括窗口客户区DC所对应的CClientDC类、OnPaint和OnDraw消息响应函数的输入参数中使用的CPaintDC类、图元文件对应的CMetaFileDC类和整个窗口所对应的CWindowDC类。CDC类中有许多成员函数,可以用来设置各种绘图环境、属性和参数,以及绘制各种图形和图像等,将在后面陆续加以介绍。1)获得DC可以从OnDraw函数的输入参数pDC或调用CWnd的成员函数GetDC:CDC* GetDC( );来获得DC的指针。2)释放DC因为Windows限制可用DC的数量,所以DC属于稀缺的公用资源。因此,对每次获得的DC,在使用完成后必须立即释放。从OnDraw函数的输入参数pDC获得的DC,在该函数运行结束后,系统会自动释放。但由GetDC所获得的DC,必须自己来释放,这可以通过调用CWnd的成员函数ReleaseDC来完成:int ReleaseDC( CDC* pDC ); / 成功返回非0例如:void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) ReleaseCapture(); if (m_bLButtonDown) CDC* pDC = GetDC(); pDC-SelectObject(new CPen(PS_SOLID, 0, RGB(255, 0, 0); pDC-SelectStockObject(NULL_BRUSH); pDC- Ellipse (rect); ReleaseDC(pDC); m_bLButtonDown = FALSE; CView:OnLButtonUp(nFlags, point);3)类DC每次从OnDraw函数的输入参数或调用GetDC所获得的DC,都是一个全新的临时缺省DC。它不能用类变量来长期保存,而且原来选入的各种GDI对象全都被作废,必须从头再来。为了使选入的各种GDI对象一直有效,必须在视图类的PreCreateWindow函数中调用CWnd类的成员函数AfxRegisterWndClass:LPCTSTR AFXAPI AfxRegisterWndClass( UINT nClassStyle, HCURSOR hCursor = 0,HBRUSH hbrBackground = 0, HICON hIcon = 0 );来修改窗口类的风格属性中的DC为类DC:CS_CLASSDC。如BOOL CDrawView:PreCreateWindow(CREATESTRUCT& cs) cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW |CS_VREDRAW | CS_CLASSDC, 0,:CreateSolidBrush(RGB(255, 255, 255); return CView:PreCreateWindow(cs);4)安全DC句柄也可以用CDC类的成员函数:HDC GetSafeHdc();来获取CD所对应窗口(如客户区)的安全DC句柄,该句柄在窗口存在期间一直是有效的。例如,可先定义类变量HDC m_hDC;,再在适当的地方给它赋值m_hDC = GetDC()-GetSafeHdc();,然后就可以放心地使用了。例如,可以使用CDC类的成员函数BOOL Attach(HDC hDC); / 成功返回非0来将CDC对象与DC句柄连接在一起。3 设置绘图颜色1颜色Windows中的颜色一般用4个字节表示(0BGR(整数) = R G B 0(字节序) Intel CPU低位字节在前),Win32 API中定义了一个专门表示颜色索引值的变量类型COLORREF:(windef.h)typedef DWORD COLORREF; / 0x00bbggrr和一个由红绿蓝三原色构造颜色值的宏RGB:(wingdi.h)#define RGB(r,g,b) (COLORREF)(BYTE)(r)|(WORD)(BYTE)(g)8)|(DWORD)(BYTE)(b) 8)#define GetBValue(rgb) (LOBYTE(rgb)16)其中:typedef unsigned long ULONG_PTR;typedef ULONG_PTR DWORD_PTR;#define LOBYTE(w) (BYTE)(DWORD_PTR)(w) & 0xff)它们对应的函数说明为:BYTE GetRValue(DWORD rgb); / DWORD rgb COLORREF colBYTE GetGValue(DWORD rgb);BYTE GetBValue(DWORD rgb);2点色(像素)在Windows中,像素(pixel)的颜色是直接由设备上下文类CDC的成员函数SetPixel来设置的,该函数的原型为:COLORREF SetPixel( int x, int y, COLORREF crColor );COLORREF SetPixel( POINT point, COLORREF crColor );其中,x与y分别为像素点的横坐标与纵坐标,crColor为像素的颜色值。例如:pDC-SetPixel(10, 10, RGB(0, 255, 0); 另外,也可以用CDC的成员函数COLORREF GetPixel( int x, int y ) const;COLORREF GetPixel( POINT point ) const;来获得指定点(x, y)或point的颜色。例如: COLORREF col; col = pDC-GetPixel(10, 10);3线色(笔)在Windows中,线状图必须用笔(pen)来画,所以线的颜色就由笔色来确定。在MFC中,笔的属性和功能由CPen类提供(CPen是CGDIObject的派生类)。笔的创建与使用的步骤为:创建笔对象:创建笔类CPen对象的方法有如下两种:使用构造函数CPenCPen( int nPenStyle, int nWidth, COLORREF crColor );其中:nPenStyle为笔的风格,可取值:PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PSDASHDOTDOT注意:14号笔风格只是在笔宽=0或1时有效,笔宽1时总为实心的。nWidth为笔宽,与映射模式有关,使用缺省映射时为像素数,若nWidth = 0,则不论什么映射模式,笔宽都为一个像素;crColor为笔的颜色值。例如CPen* pGrayPen = new CPen(PS_SOLID, 0, RGB(128, 128, 128);CPen grayPen(PS_SOLID, 0, RGB(128, 128, 128);使用成员函数CreatePenBOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );如:CPen grayPen;grayPen.CreatePen(PS_SOLID, 0, RGB(128, 128, 128);缺省的笔为单像素宽的实心黑色笔将笔对象选入设备上下文:为了能使用我们所创建的笔对象,必须先将它选入设备上下文,这可以调用设备上下文类CDC的成员函数SelectObject来完成:CPen* SelectObject( CPen* pPen );返回值为指向原来笔对象的指针(一般将其保存下来,供下次再装入时使用)。如pOldPen = pDC-SelectObject(&pen);另外,Windows中有一些预定义的笔对象,可用CDC的另一成员函数SelectStockObject将其选入DC,其函数原型为:virtual CGdiObject* SelectStockObject( int nIndex );预定义的笔对象有BLACK_PEN(黑色笔)、WHITE_PEN (白色笔)、NULL_PEN(空笔/无色笔)。例如:pDC-SelectStockObject(BLACK_PEN);使用设备上下文画线状图:画线状图以及面状图的边线,所使用的是当前设备上下文中的笔对象。线状图有直线、折线、矩形、(椭)圆(弧)等)将笔对象从设备上下文中放出:为了能删除使用过的笔对象,必须先将它从设备上下文中释放出来后,然后才能删除。释放的方法是装入其他的笔对象(一般是重新装入原来的笔对象)。例如pDC-SelectObject(pOldPen);删除笔对象:为了能删除笔对象,必须先将其从设备上下文中释放。删除方法有如下几种:调用笔类CDC的成员函数DeleteObject删除笔的当前内容(但是未删除笔对象,以后可再用成员函数CreatePen在笔对象中继续创建新的笔内容)。如pen.DeleteObject();使用删除运算符delete将笔对象彻底删除,如delete pen;自动删除:若笔对象为局部变量,则在离开其作用域时,会被系统自动删除下面为一段较完整地创建与使用笔的例子代码: CPen pen, *pOldPen; for (int j = 0; j SelectObject(&pen); pDC-MoveTo(0, j); pDC-LineTo(40, j); pDC-SelectObject(pOldPen); pen.DeleteObject(); 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中,供绘面状图时使用。5文本色可使用CDC类的成员函数SetTextColor和SetBkColor来分别设置输出文本的前景色和背景色:(缺省的前景色为黑色,背景色空)COLORREF GetTextColor( ) const;virtual COLORREF SetTextColor( COLORREF crColor );COLORREF GetBkColor( ) const;virtual COLORREF SetBkColor( COLORREF crColor );例如: pDC-TextOut(10, 10, Test text); pDC-SetTextColor(RGB(0, 128, 0); pDC-TextOut(10, 30, Test text); pDC-SetBkColor(RGB(0, 0, 128); pDC-TextOut(10, 50, Test text);6绘图工具1)GDI对象Windows的图形设备接口(GDI = graphics device interface)对象指各种绘图工具,如笔、刷、位图、字体、调色板、区域等,对应的MFC类为CPen、CBrush、CBitmap、CFont等。这些图形绘制对象类都是CGDIObject的派生类,而CGDIObject则是直接从CObject类派生的抽象基类。其中,Windws CE不支持调色板类CPalette;CRgn为区域类,对应于窗口中的一个矩形、多边形或(椭)圆区域(region),可用于移动、拷贝、合并、判断和裁剪。2)选入可用设备上下文类CDC的多态成员函数SelectObject,来将绘图工具对象选入设备上下文,以供绘图时使用:CPen* SelectObject( CPen* pPen );CBrush* SelectObject( CBrush* pBrush );virtual CFont* SelectObject( CFont* pFont );CBitmap* SelectObject( CBitmap* pBitmap );int SelectObject( CRgn* pRgn );CGdiObject* SelectObject( CGdiObject* pObject );3)获取可用API函数GetCurrentObject来获得当前在DC中的指定类型的绘图对象:HGDIOBJ GetCurrentObject(HDC hdc, / handle to device contextUINT uObjectType / specifies the object-type);其中,参数uObjectType可取值:OBJ_PEN / Returns the current selected pen.OBJ_BRUSH / Returns the current selected brush.OBJ_PAL / Returns the current selected palette.OBJ_FONT / Returns the current selected font.OBJ_BITMAP / Returns the current selected bitmap.也可分别调用CDC类的下列成员函数来做同样的事:CPen* GetCurrentPen( ) const;CBrush* GetCurrentBrush( ) const;CFont* GetCurrentFont( ) const;CBitmap* GetCurrentBitmap( ) const;CPalette* GetCurrentPalette( ) const;如:HPEN hPen = (HPEN)GetCurrentObject(pDC-m_hDC, OBJ_PEN);CPen* pPen = CPen:FromHandle(hPen);等价于:CPen* pPen = pDC- GetCurrentPen( );4 画图在Windows中,绘图一般在视图窗口的客户区进行,使用的是设备上下文类CDC中各种绘图函数。1. 映射模式与坐标系1)默认映射模式映射模式(map mode)影响所有的图形和文本绘制函数,它定义(将逻辑单位转换为设备单位所使用的)度量单位和坐标方向,Windows总是用逻辑单位来绘图。缺省情况下,绘图的默认映射模式为MM_TEXT,其绘图单位为像素(只要不打印输出,屏幕绘图使用该模式就够了)。若窗口客户区的宽和高分别为w和h像素,则其x坐标是从左到右,范围为0 w-1;y坐标是从上到下,范围为0 h-1。2)设置映射模式可以使用CDC类的成员函数GetMapMode和SetMapMode来获得和设置当前的映射模式:int GetMapMode( ) const; / 返回当前的映射模式virtual int SetMapMode( int nMapMode ); / 返回先前的映射模式映射模式的nMapMode取值与含义符号常量 数字常量 x方向 y方向 逻辑单位的大小MM_TEXT 1 向右 向下 像素MM_LOMETRIC 2 向右 向上 0.1 mmMM_HIMETRIC 3 向右 向上 0.01 mmMM_LOENGLISH 4 向右 向上 0.01 inMM_HIENGLISH 5 向右 向上 0.001 inMM_TWIPS 6 向右 向上 1/1440 inMM_ISOTROPIC 7 自定义 自定义 自定义MM_ANISOTROPIC 8 自定义 自定义 自定义可见,除了两种自定义映射模式外,x方向都是向右,y方向也只有MM_TEXT的向下,其余的都是向上,与数学上一致。除了MM_ANISOTROPIC外,其他所有映射模式的x与y方向的单位都是相同的。所有映射模式的逻辑坐标的原点(0, 0)最初都是在窗口的左上角,但在CScrollView的派生类中,MFC会随用户滚动文档而自动调整逻辑原点的相对位置(改变视点的原点属性)。3)自定义映射模式自定义映射模式MM_ISOTROPIC(各向同性,x与y方向的单位必须相同)和MM_ANISOTROPIC(各向异性,x与y方向的单位可以不同)的单位和方向,可以通过用CDC类的成员函数G/SetWindowExt和G/SetViewportExt来获取/设置窗口和视口的大小来确定:CSize GetWindowExt( ) const;virtual CSize SetWindowExt( int cx, int cy );virtual CSize SetWindowExt( SIZE size );CSize GetViewportExt( ) const;virtual CSize SetViewportExt( int cx, int cy );virtual CSize SetViewportExt( SIZE size );其中,cx或size.cx和cy或size.cy分别为窗口/视口的宽度与高度(逻辑单位)。还可以用CDC类的成员函数SetViewportOrg来设置坐标原点的位置:virtual CPoint SetViewportOrg( int x, int y );CPoint SetViewportOrg( POINT point );例如void CDrawView:OnDraw(CDC* pDC) CRect rect; GetClientRect(rect); pDC-SetMapMode(MM_ANISOTROPIC); pDC-SetWindowExt(1000,1000); pDC-SetViewportExt(rect.right, -rect.bottom); pDC-SetViewportOrg(rect.right / 2, rect.bottom /2); pDC-Ellipse(CRect(-500, -500, 500, 500);将当前的映射模式设置为各向异性自定义映射模式,窗口大小为1000个逻辑单位宽和1000个逻辑单位高,视口大小同当前客户区,视口的坐标原点设置在当前客户区的中央。由于使用了负数作为SetViewportExt函数的第2个参数,所以y轴方向是向上的。可见,圆被画成了椭圆,x与y方向上的逻辑单位不相同。4)单位转换对所有非MM_TEXT映射模式,有如下重要规则:CDC的成员函数(如各种绘图函数)具有逻辑坐标参数CWnd的成员函数(如各种响应函数)具有设备坐标参数(如鼠标位置point)位置的测试操作(如CRect的PtInRect函数)只有使用设备坐标时才有效长期使用的值应该用逻辑坐标保存(如窗口滚动后保存的设备坐标就无效了)因此,为了使应用程序能够正确工作,除MM_TEXT映射模式外,其他映射模式都需要进行单位转换。下面是逻辑单位到设备单位(如像素)的转换公式:x比例因子 = 视口宽度 / 窗口宽度y比例因子 = 视口高度 / 窗口高度设备x = 逻辑x * x比例因子 + x原点偏移量设备y = 逻辑y * y比例因子 + y原点偏移量Windows的GDI负责逻辑坐标和设备坐标之间的转换,这可以调用CDC类的成员函数LPtoDP和DPtoLP来进行:void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const;void LPtoDP( LPRECT lpRect ) const;void LPtoDP( LPSIZE lpSize ) const;void DPtoLP( LPPOINT lpPoints, int nCount = 1 ) const;void DPtoLP( LPRECT lpRect ) const;void DPtoLP( LPSIZE lpSize ) const;例如:void CDrawView:OnLButtonDown(UINT nFlags, CPoint point) CRect rect = m_rect; / 逻辑坐标 CClientDC dc(this); dc.SetMapMode(MM_LOENGLISH); dc.LPtoDP(rect); / 转化成设备坐标 if (rect.PtInRect(point) / 位置的测试操作只有使用设备坐标时才有效 .void CDrawView: OnMouseMove (UINT nFlags, CPoint point) float t,y; char buf40; CDC* pDC = GetDC();pDC-SetMapMode(MM_HIMETRIC); pDC-DPtoLP(&point); / 转化成逻辑坐标t = t1 + (point.x * dt) / w; sprintf(buf, %.4fs, t); pSB-SetPaneText(xV, buf);y = (y0 - point.y) / dy; sprintf(buf, %.4f, y); pSB-SetPaneText(yV, buf); .2. 画像素点画像素点就是设置像素点的颜色,从前面3)(2)已知道这可由CDC的成员函数SetPixel来做,该函数的原型为:COLORREF SetPixel( int x, int y, COLORREF crColor ); 或COLORREF SetPixel( POINT point, COLORREF crColor );其中,x与y分别为像素点的横坐标与纵坐标,crColor为像素的颜色值。例如pDC-SetPixel(i, j, RGB(r, g, b);3画线状图在Windows中,线状图必须用笔来画(笔的创建与使用见前面的3)(3)),下面是CDC类中可以绘制线状图的常用成员函数:当前位置:设置当前位置为(x, y)或point:(返回值为原当前位置的坐标)CPoint MoveTo( int x, int y ); 或 CPoint MoveTo( POINT point );画线:使用DC中的笔从当前位置画线到点(x, y)或point:(若成功返回非0值):BOOL LineTo( int x, int y ); 或BOOL LineTo( POINT point );画折线:使用DC中的笔,依次将点数组lpPoints中的nCount(2)个点连接起来,形成一条折线:BOOL Polyline( LPPOINT lpPoints, int nCount );画多边形:似画折线,但还会将最后的点与第一个点相连形成多边形,并用DC中的刷填充其内部区域:BOOL Polygon( LPPOINT lpPoints, int nCount );画矩形:使用DC中的笔画左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形的边线,并用DC中的刷填充其内部区域:BOOL Rectangle( int x1, int y1, int x2, int y2 ); 或BOOL Rectangle( LPCRECT lpRect ); 有时需要根据用户给定的两个任意点来重新构造左上角和右下角的点,例如: rect = CRect(min(p0.x, point.x), min(p0.y, point.y), max(p0.x, point.x), max(p0.y, point.y);画圆角矩形:使用DC中的笔画左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形的边线,并用宽x3或point.x高y3或point.y矩形的内接椭圆倒角,再用DC中的刷填充其内部区域:BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 );BOOL RoundRect( LPCRECT lpRect, POINT point );例如:int d = min(rect.Width(), rect.Height() / 4;pDC- RoundRect(rect, CPoint(d, d);画(椭)圆:使用DC中的笔在左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形中画内接(椭)圆的边线,并用DC中的刷填充其内部区域:BOOL Ellipse( int x1, int y1, int x2, int y2 );BOOL Ellipse( LPCRECT lpRect );注意,CDC中没有画圆的专用函数。在这里,圆是作为椭圆的(宽高相等)特例来画的。画弧:(x1, y1)与(x2, y2)或lpRect的含义同画(椭)圆,(x3, y3)或ptStart为弧的起点,(x4, y4)或ptEnd为弧的终点:(逆时针方向旋转)BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );BOOL ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);BOOL ArcTo(LPCRECT lpRect, POINT ptStart, POINT ptEnd);画圆弧:(其中(x, y)为圆心、nRadius为半径、fStartAngle为起始角、fSweepAngle为弧段跨角)BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, float fSweepAngle);画弓弦:参数的含义同上,只是用一根弦连接弧的起点和终点,形成一个弓形,并用DC中的刷填充其内部区域:BOOL Chord( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );BOOL Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd );4画填充图在Windows中,面状图必须用刷来填充(刷的创建与使用见前面的3)(4))。上面(2)中的Polygon、Rectangle、Ellipse和Chord等画闭合线状图的函数,只要DC中的刷不是空刷,都可以用来画对应的面状图(边线用当前笔画,内部用当前刷填充)。下面介绍的是CDC类中只能绘制面状图的其他常用成员函数:画填充矩形:用指定的刷pBrush画一个以lpRect为区域的填充矩形,无边线,填充区域包括矩形的左边界和上边界,但不包括矩形的右边界和下边界:void FillRect( LPCRECT lpRect, CBrush* pBrush );画单色填充矩形:似FillRect,但只能填充单色,不能填充条纹和图案:void FillSolidRect( LPCRECT lpRect, COLORREF clr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阿拉山口市2024-2025学年八年级下学期语文期末模拟试卷
- 安徽省黄山市黟县2022-2023学年高三下学期高考第三次模拟考试语文试卷及答案
- 安徽省池州市东至县2024-2025学年高三上学期期末考试英语考题及答案
- 2025 年小升初茂名市初一新生分班考试数学试卷(带答案解析)-(人教版)
- 河南省新乡市第七中学2025-2026学年七年级上学期第一次月考数学试题
- 广东省广州市东环中学2025-2026学年八年级数学第一学期期中测试数学试题(无答案)
- 社区管理与服务实践课件
- 社区画像基础知识培训课件
- 重庆市九龙坡区统编版2024-2025学年四年级下册期末考试语文试卷(含答案)
- 社区消费安全知识培训课件
- 水声传感器技术研究与应用
- 2025年小学教研室教学计划
- 2025年上海市建筑工程施工合同模板
- 手术室护理业务学习
- 贩卖人口罪与强迫劳动罪
- 新员工入职职业道德培训
- 电气安全基础知识安全培训
- 宽带宣传活动方案
- 电缆生产工艺全解析
- 婚内债务隔离协议书范本
- 新生儿暖箱使用操作指南
评论
0/150
提交评论