第4章设备描述表4.1设备描述表概述4.2映射模式4.3GDI对象4.4设备描述表属性4.1设备描述表•设备描述表(DeviceContext)–一种Windows数据结构,用来描述绘制窗口所需要的信息。–它定义了坐标映射模式、一组GDI图形对象及其属性。–GDI对象•画线的笔,绘图填图的刷子,位图,调色板,剪裁区域,及路径(Path)。设备描述表分类名称特点Display显示设备描述表,提供对视频显示设备上的绘制操作的支持Printer打印设备描述表,提供对打印机、绘图仪设备上的绘制操作的支持Memory内存设备描述表,提供对位图操作的支持Information信息设备描述表,提供对操作设备信息获取的支持设备描述表属性属性缺省值Pen画笔,BLACK_PENBrush画刷,WHITE_BRUSHBitmap位图Font字体,SYSTEM_FONTPalette调色板,DEFAULT_PALETTEClippingregion裁剪区域Mappingmode映射模式,MM_TEXTPolygon-fillmode多边形填充模式,ALTERNATEBackgroundmode背景模式Drawingmode绘制模式,R2_COPYPENStretchmode延伸模式,BLACKONWHITEBackgroundcolor背景颜色Deviceorigin设备原点Currentpenposition画笔原点Brushorigin画刷原点Intercharacterspacing字符间隔,0Textcolor字体颜色,settingfromControlPanelViewportextent视口比例,(1,1)Viewportorigin视口原点,(0,0)Windowextent窗口比例,(1,1)Windoworigin窗口原点,(0,0)4.1.1设备描述表的使用步骤设备描述表的使用步骤:获取或者创建设备描述表;必要的话,改变设备描述表的属性;使用设备描述表完成绘制操作;释放或删除设备描述表。获取和释放设备描述表1WM_PAINT消息(CWnd类OnPaint函数)CPaintDCdc(this);hdc=BeginPaint(hwnd,&ps);/EndPaint(hwnd,&ps);2非WM_PAINT消息时(CWnd类CView类其它函数)hdc=GetDC(hwnd);/ReleaseDC(hwnd,hdc);3整个窗口hdc=GetWindowDC(hwnd);/ReleaseDC(hwnd,hdc);4取得设备上下文句柄通用函数:hdc=CreateDC(pszDriver,pszDevice,pszOutput,pData);/DeleteDC(hdc);如取整个屏幕的设备上下文句柄:hdc=CreateDC(TEXT(“DISPLAY”),NULL,NULL,NULL);5取得内存设备上下文:hdcMem=CreateCompatibleDC(hdc);DeleteDC(hdcMem);设置设备描述表的属性设备描述表属性的表示复杂GDI对象:如画笔、画刷、位图、调色板等。简单MFC类对象:如裁剪区域,原点。简单变量:字体颜色、背景颜色等。一组符号常量:如各种模式,绘制模式,背景模式和填充模式等。设置设备描述表属性的方式选入选出方式:在处理事件期间选入,事件处理完毕后选出。状态机方式:按需要随时设置。设置设备描述表的属性设备描述表属性的保持问题通常情况下,在一个事件函数中设置的设备描述表属性通常不能保存到下一个消息函数,所以对于每一个消息函数,都应该在使用设备描述表之前都要重新进行设置。但windows提供了保持设备描述表属性的机制设备描述表的保持机制设备描述表的保持机制自动保存:每次设置的属性均保存在windows设备描述表中。创建窗口时(WM_CREATE消息),设置CS_OWNDC风格。动态管理机制:使用下列一组API函数管理设备描述表属性。保存/恢复设备上下文。idSaved=SaveDC(hdc);改变一些属性;RestoreDC(hdc,idSaved);以堆栈方式使用SaveDC和RestoreDCSaveDC(hdc);RestoreDC(hdc,-1);或使用CDC类成员函数管理设备描述表属性。保存/恢复设备上下文。idSaved=SaveDC();改变一些属性;RestoreDC(idSaved);以堆栈方式使用SaveDC和RestoreDCSaveDC();RestoreDC(-1);4.1.2设备描述表的绘图函数•点–COLORREFGetPixel(intx,inty)const;–COLORREFGetPixel(POINTpoint)const;–COLORREFSetPixel(intx,inty,COLORREFcrColor);–COLORREFSetPixel(POINTpoint,COLORREFcrColor);–BOOLSetPixelV(intx,inty,COLORREFcrColor);–BOOLSetPixelV(POINTpoint,COLORREFcrColor);•直线–CPointMoveTo(intx,inty);–CPointMoveTo(POINTpoint);–BOOLLineTo(intx,inty);–BOOLLineTo(POINTpoint);•弧–BOOLAngleArc(intx,inty,intnRadius,floatfStartAngle,floatfSweepAngle);–BOOLArc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);–BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd);–BOOLArcTo(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);–BOOLArcTo(LPCRECTlpRect,POINTptStart,POINTptEnd);–intSetArcDirection(intnArcDirection);–intGetArcDirection()const;4.1.2设备描述表的绘图函数•BeZier曲线:–BOOLPolyBezier(constPOINT*lpPoints,intnCount);–BOOLPolyBezierTo(constPOINT*lpPoints,intnCount);–BOOLPolyDraw(constPOINT*lpPoints,constBYTE*lpTypes,intnCount);–BOOLPolyline(LPPOINTlpPoints,intnCount);–BOOLPolylineTo(constPOINT*lpPoints,intnCount);–BOOLPolyPolyline(constPOINT*lpPoints,constDWORD*lpPolyPoints,intnCount);•位图–BOOLAlphaBlend(intxDest,intyDest,intnDestWidth,intnDestHeight,CDC*pSrcDC,intxSrc,intySrc,intnSrcWidth,intnSrcHeight,BLENDFUNCTIONblend);–BOOLBitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,DWORDdwRop);–BOOLMaskBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,CBitmap&maskBitmap,intxMask,intyMask,DWORDdwRop);–BOOLStretchBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,intnSrcWidth,intnSrcHeight,DWORDdwRop);–BOOLTransparentBlt(intxDest,intyDest,intnDestWidth,intnDestHeight,CDC*pSrcDC,intxSrc,intySrc,intnSrcWidth,intnSrcHeight,UINTclrTransparent);•pattern–BOOLPatBlt(intx,inty,intnWidth,intnHeight,DWORDdwRop);4.1.2设备描述表的绘图函数•矩形–voidDraw3dRect(LPCRECTlpRect,COLORREFclrTopLeft,COLORREFclrBottomRight);–voidDraw3dRect(intx,inty,intcx,intcy,COLORREFclrTopLeft,COLORREFclrBottomRight);–voidDrawDragRect(LPCRECTlpRect,SIZEsize,LPCRECTlpRectLast,SIZEsizeLast,CBrush*pBrush=NULL,CBrush*pBrushLast=NULL);–BOOLDrawEdge(LPRECTlpRect,UINTnEdge,UINTnFlags);–voidFillRect(LPCRECTlpRect,CBrush*pBrush);–voidFillSolidRect(LPCRECTlpRect,COLORREFclr);–voidFrameRect(LPCRECTlpRect,CBrush*pBrush);–voidInvertRect(LPCRECTlpRect);–BOOLRectangle(intx1,inty1,intx2,inty2);–BOOLRectangle(LPCRECTlpRect);–BOOLRoundRect(LPCRECTlpRect,POINTpoint);–voidDrawFocusRect(LPCRECTlpRect);4.1.2设备描述表的绘图函数•多边形–BOOLPolygon(LPPOINTlpPoints,intnCount);–BOOLPolyPolygon(LPPOINTlpPoints,LPINTlpPolyCounts,intnCount);–BOOLPolyline(LPPOINTlpPoints,intnCount);•椭圆–BOOLEllipse(intx1,inty1,intx2,inty2);BOOLEllipse(LPCRECTlpRect);•扇形–BOOLChord(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);–BOOLChord(LPCRECTlpRect,POINTptStart,POINTptEnd);–BOOLPie(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);–BOOLPie(LPCRECTlpRect,POINTptStart,POINTptEnd);4.1.2设备描述表的绘图函数•文字–virtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat);–intDrawText(constCString&str,LPRECTlpRect,UINTnFormat);–virtualintDrawTextEx(LPTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat,LPDRAWTEXTPARAMSlpDTParams);–intDrawTextEx(constCString&str,LPRECTlpRec