资源描述
第第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_PALETTEClipping region裁剪区域裁剪区域Mapping mode映射模式,映射模式,MM_TEXTPolygon-fill mode多边形填充模式,多边形填充模式,ALTERNATEBackground mode背景模式背景模式Drawing mode绘制模式,绘制模式,R2_COPYPENStretch mode延伸模式,延伸模式,BLACKONWHITEBackground color背景颜色背景颜色Device origin设备原点设备原点Current pen position画笔原点画笔原点Brush origin画刷原点画刷原点Intercharacter spacing字符间隔,字符间隔,0Text color字体颜色,字体颜色,setting from Control PanelViewport extent视口比例视口比例,(1,1)Viewport origin视口原点,视口原点,(0,0)Window extent窗口比例,窗口比例,(1,1)Window origin窗口原点,窗口原点,(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);patternBOOLPatBlt(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,LPRECTlpRect,UINTnFormat,LPDRAWTEXTPARAMSlpDTParams);virtualBOOLExtTextOut(intx,inty,UINTnOptions,LPCRECTlpRect,LPCTSTRlpszString,UINTnCount,LPINTlpDxWidths);BOOLExtTextOut(intx,inty,UINTnOptions,LPCRECTlpRect,constCString&str,LPINTlpDxWidths);4.1.2设备描述表的绘图函数设备描述表的绘图函数区域:区域:BOOLFillRgn(CRgn*pRgn,CBrush*pBrush);BOOLFrameRgn(CRgn*pRgn,CBrush*pBrush,intnWidth,intnHeight);BOOLInvertRgn(CRgn*pRgn);BOOLPaintRgn(CRgn*pRgn);BOOLExtFloodFill(intx,inty,COLORREFcrColor,UINTnFillType);BOOLFloodFill(intx,inty,COLORREFcrColor);BOOLGradientFill(TRIVERTEX*pVertices,ULONGnVertices,void*pMesh,ULONGnMeshElements,DWORDdwMode);路径路径BOOLBeginPath();BOOLEndPath();BOOLCloseFigure();BOOLFillPath();BOOLFlattenPath();intGetPath(LPPOINTlpPoints,LPBYTElpTypes,intnCount)const;BOOLSelectClipPath(intnMode);BOOLStrokeAndFillPath();4.2映射模式映射模式映射模式:映射模式:逻辑坐标和设备坐标的映射方式。逻辑坐标和设备坐标的映射方式。设备坐标:设备坐标:设备使用的整数坐标,与设备相关。设备使用的整数坐标,与设备相关。逻辑坐标:逻辑坐标:GDI函数使用的实数坐标,与设备无关。函数使用的实数坐标,与设备无关。4.2映射模式映射模式视口视口(viewport)设备上的一个矩形区域,使用设备坐标。通常和显示区域相同。设备上的一个矩形区域,使用设备坐标。通常和显示区域相同。实际设备使用的坐标实际设备使用的坐标视口的指标视口的指标视口原点视口原点(0,0)和视口范围和视口范围(1,1)和坐标轴方向。和坐标轴方向。窗口窗口(window)用户图形用户图形(与现实世界中的实体相对应与现实世界中的实体相对应)使用的矩形区域,使用逻辑使用的矩形区域,使用逻辑坐标,可以用图素、毫米、英寸或任何其它单位。坐标,可以用图素、毫米、英寸或任何其它单位。GDI绘图函数中使用窗口坐标。绘图函数中使用窗口坐标。窗口的表示窗口的表示窗口原点窗口原点(0,0)窗口范围窗口范围(1,1)和坐标轴方向和坐标轴方向4.2.1坐标变换公式坐标变换公式4.2.1坐标变换公式坐标变换公式窗口窗口视口视口4.1.2映射模式的种类映射模式的种类映像方式映像方式逻辑单位逻辑单位x值值y值值MM_TEXT图素图素右右下下MM_LOMETRIC0.1mm右右上上MM_HIMETRIC0.01mm右右上上MM_LOENGLISH0.01in.右右上上MM_HIENGLISH0.001in.右右上上MM_TWIPS1/1440in.右右上上MM_ISOTROPIC任意任意(x=y)可选可选可选可选MM_ANISOTROPIC任意任意(x!=y)可选可选可选可选MM_TEXT映像方式映像方式映像方式映像方式逻辑单位逻辑单位x值值y值值MM_TEXT图素图素右右下下xy与设备坐标一致与设备坐标一致METRIC和和ENGLISH映像方式映像方式映像方式映像方式逻辑单位逻辑单位x值值y值值MM_TWIPS1/1440in.右右上上MM_LOMETRIC0.1mm右右上上MM_HIMETRIC0.01mm右右上上MM_LOENGLISH 0.01in.右右上上MM_HIENGLISH0.001in.右右上上xyISOTROPIC映像方式映像方式映像方式映像方式逻辑单位逻辑单位x值值y值值MM_ISOTROPIC任意任意(x=y)可选可选可选可选MM_ANISOTROPIC任意任意(x!=y)可选可选可选可选xyISOTROPIC映像方式映像方式MM_ISOTROPICMM_ANISOTROPIC逻辑单位被转换成轴逻辑单位被转换成轴(非非)等距的任意单位等距的任意单位;可以使用可以使用SetWindowExt和和SetViewportExt指定希望的指定希望的单位和方向单位和方向.GDI会做必要的调整以保证会做必要的调整以保证x轴和轴和y轴方向上的等距。轴方向上的等距。4.1.3关于映射模式的相关操作关于映射模式的相关操作映射模式:映射模式:virtualintSetMapMode(intnMapMode);intGetMapMode()const;视口比例视口比例CSizeGetViewportExt()const;virtualCSizeSetViewportExt(intcx,intcy);virtualCSizeSetViewportExt(SIZEsize);virtualCSizeScaleWindowExt(intxNum,intxDenom,intyNum,intyDenom);视口原点视口原点virtualCPointSetViewportOrg(intx,inty);CPointSetViewportOrg(POINTpoint);CPointGetViewportOrg()const;virtualCPointOffsetViewportOrg(intnWidth,intnHeight);4.1.3关于映射模式的相关操作关于映射模式的相关操作窗口比例窗口比例CSizeGetWindowExt();virtualCSizeSetWindowExt(intcx,intcy);virtualCSizeSetWindowExt(SIZEsize);virtualCSizeScaleWindowExt(intxNum,intxDenom,intyNum,intyDenom);窗口原点窗口原点CPointSetWindowOrg(intx,inty);CPointSetWindowOrg(POINTpoint);CPointGetWindowOrg()const;CPointOffsetWindowOrg(intnWidth,intnHeight);4.1.3关于映射模式的相关操作关于映射模式的相关操作设备坐标与逻辑坐标的转换设备坐标与逻辑坐标的转换voidDPtoLP(LPPOINTlpPoints,intnCount=1)const;voidDPtoLP(LPRECTlpRect)const;voidDPtoLP(LPSIZElpSize)const;voidLPtoDP(LPPOINTlpPoints,intnCount=1)const;voidLPtoDP(LPRECTlpRect)const;voidLPtoDP(LPSIZElpSize)const;4.1.3关于映射模式的相关操作关于映射模式的相关操作映射模式的关键概念映射模式的关键概念映射方式映射方式窗口窗口原点、范围原点、范围视口视口原点、范围原点、范围问题:如何运用映射模式。问题:如何运用映射模式。定义自己的映射模式定义自己的映射模式定义窗口和视口的映射方式定义窗口和视口的映射方式使用逻辑坐标绘图使用逻辑坐标绘图如果使用了设备坐标,应注意如果使用了设备坐标,应注意设备坐标与逻辑坐标的转换设备坐标与逻辑坐标的转换。如鼠标消息就使用设备坐标。如鼠标消息就使用设备坐标。4.1.4映射模式应用举例映射模式应用举例在类中添加如下数据成员在类中添加如下数据成员intxWindowExt,yWindowExt,xViewPortExt,yViewPortEx;并在构造函数中,初始化为并在构造函数中,初始化为100 xWindowExt=yWindowExt=xViewPortExt=yViewPortEx=10;voidCtestView:OnDraw(CDC*pDC)pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowExt(xWindowExt,yWindowExt);pDC-SetViewportOrg(400,400);pDC-SetViewportExt(xViewPortExt,-yViewPortExt);pDC-MoveTo(-1000,0);/坐标轴坐标轴pDC-LineTo(1000,0);pDC-MoveTo(0,-1000);pDC-LineTo(0,1000);pDC-Rectangle(100,100,300,300);/矩形矩形pDC-Ellipse(200,100,400,300);/椭圆椭圆4.1.4映射模式应用举例映射模式应用举例例子程序。例子程序。voidCtestView:OnScaleup()xViewPortExt+;yViewPortExt+;Invalidate();voidCtestView:OnScaledown()if(xViewPortExt1)xViewPortExt-;yViewPortExt-;Invalidate();voidCtestView:OnScaleorgin()xViewPortExt=10;yViewPortExt=10;Invalidate();4.1.4映射模式应用举例映射模式应用举例4.3GDI对象对象图形设备接口图形设备接口(GDI:GraphicsDeviceInterface)为程序员提供了一个设备无关的设备接口。为程序员提供了一个设备无关的设备接口。Gdi对象分类对象分类画笔:绘制线和图形的边框。画笔:绘制线和图形的边框。画刷:绘制一个图形的内部区域。画刷:绘制一个图形的内部区域。字体:定义字体字体:定义字体区域:设备上的一个区域,可用于定义裁剪区域等操作区域:设备上的一个区域,可用于定义裁剪区域等操作位图:一个由颜色位组成的数组,用于表示一个图形位图:一个由颜色位组成的数组,用于表示一个图形调色板:一个颜色列表,用于建立逻辑颜色到设备颜色的映射。调色板:一个颜色列表,用于建立逻辑颜色到设备颜色的映射。4.3GDI对象对象WindowsGDI对象的使用规则对象的使用规则创建创建GDI对象对象选入设备描述表选入设备描述表使用这些选入的设备描述表属性使用这些选入的设备描述表属性GDI对象对象从设备描述表中删除从设备描述表中删除删除删除GDI对象对象CGdiObjectClassCGdiObject类类MFC定义的一个定义的一个GDI对象的基类,为使用这些对象的基类,为使用这些GDI对象提对象提供了一个统一的接口。供了一个统一的接口。如如pen,brushe,font,bitmap,region和和palette等等.CGdiObject类成员类成员m_hObject:GDI对象句柄。对象句柄。CGdiObject:构造函数:构造函数Attach:连接到一个:连接到一个GDI对象。对象。CreateStockObject:创建一个创建一个Windows预定义的画笔、刷或字体存储对象预定义的画笔、刷或字体存储对象.CGdiObjectClassDeleteObject:删除相连的删除相连的GDI对象。对象。DeleteTempMap:删除一个用删除一个用FromHandle相联系的相联系的GDI对象对象.Detach:切断与此对象相联系的切断与此对象相联系的Gdi对象并返回对象并返回WindowsGDI对象的句柄对象的句柄.FromHandle:返回一个与给定句柄返回一个与给定句柄CGDI对象指针。对象指针。GetObjectType取取GDI对象的类型对象的类型.GetSafeHandle返回句柄。返回句柄。CGdiObjectClassUnrealizeObject重置重置画笔原点画笔原点or逻辑调色板逻辑调色板.operator!=比较运算符比较运算符.operator=比较运算符比较运算符operatorHGDIOBJ检索句柄检索句柄Attach和和Detach函数函数BOOLAttach(HGDIOBJhObject);AttachesaWindowsGDIobjecttoaCGdiObjectobject.这个函数的含义是什么?看如下代码。这个函数的含义是什么?看如下代码。CPenpen;/定义了一个定义了一个CGdiObject类的派生类对象类的派生类对象HGDIOBJhObject;/定义了一个句柄定义了一个句柄HGDIOBJhObject=:CreatePen(0,1,RGB(0,0,0);pen.Attach(hObject);pen.Detach();:DeleteObject(hObject)CreateStockObject函数函数BOOLCreateStockObject(intnIndex);查找查找windows预定义的预定义的GDI对象对象,并将这个并将这个GDI对象与一个对象与一个CGdiObject相连接,并返回这个相连接,并返回这个CGdiObject对象。对象。windows预定义的预定义的GDI对象对象ValueMeaningWHITE_BRUSH白画刷白画刷.BLACK_BRUSH黑画刷黑画刷.LTGRAY_BRUSH亮灰色画刷亮灰色画刷.GRAY_BRUSH灰色画刷灰色画刷DC_BRUSH实心彩色画刷。默认白色,可用实心彩色画刷。默认白色,可用SetDCBrushColor函数修改。函数修改。DKGRAY_BRUSH 深灰画刷深灰画刷NULL_BRUSH空画刷空画刷(等价于等价于HOLLOW_BRUSH).HOLLOW_BRUSH 空心画刷空心画刷(等价于等价于NULL_BRUSH).NULL_PEN空画笔空画笔.WHITE_PEN白色画笔白色画笔.DC_PEN实心彩色画笔实心彩色画笔.默认色是白色默认色是白色.可用可用SetDCPenColor函数修改。函数修改。BLACK_PEN黑色笔黑色笔.windows预定义的预定义的GDI对象对象ValueMeaningDEVICE_DEFAULT_FONT 设备依赖字体设备依赖字体.DEFAULT_GUI_FONT用户界面对象用户界面对象(菜单对话框菜单对话框)的默认字体的默认字体(MSSansSerif)OEM_FIXED_FONTOEM固定宽度字体固定宽度字体.SYSTEM_FONT系统字体系统字体.SYSTEM_FIXED_FONT固定宽度字体固定宽度字体ANSI_VAR_FONTWindows变宽度系统字体变宽度系统字体.ANSI_FIXED_FONTWindows固定宽度字体固定宽度字体DEFAULT_PALETTE默认调色板默认调色板.4.3.2画刷画刷画刷画刷Windows定义画刷定义画刷WHITE_BRUSH、BLACK_BRUSH、LTGRAY_BRUSH、GRAY_BRUSH、DC_BRUSH、DKGRAY_BRUSH、NULL_BRUSH自定义逻辑画刷自定义逻辑画刷SolidBrushhBrush=CreateSolidBrush(crColor)HatchBrushhBrush=CreateHatchBrush(iHatchStyle,crColor);PatternBrushBOOLCreatePatternBrush(CBitmap*pBitmap);BOOLCreateDIBPatternBrush(HGLOBALhPackedDIB,UINTnUsage);CBrushClassCPen();CPen(intnPenStyle,intnWidth,COLORREFcrColor);CPen(intnPenStyle,intnWidth,constLOGBRUSH*pLogBrush,intnStyleCount=0,constDWORD*lpStyle=NULL);画笔风格画笔风格nPenStylePS_SOLIDPS_DASHPS_DOTPS_DASHDOTPS_DASHDOTDOTPS_NULLPS_INSIDEFRAME4.3.3CBrushClass创建函数创建函数BOOLCreateBrushIndirect(constLOGBRUSH*lpLogBrush);BOOLCreateDIBPatternBrush(HGLOBALhPackedDIB,UINTnUsage);BOOLCreateDIBPatternBrush(constvoid*lpPackedDIB,UINTnUsage);BOOLCreatePatternBrush(CBitmap*pBitmap);BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);BOOLCreateSolidBrush(COLORREFcrColor);BOOLCreateSysColorBrush(intnIndex);DWORDWINAPIGetSysColor(intnIndex);ValueValueMeaning0COLOR_SCROLLBARScrollbargrayarea.1COLOR_BACKGROUNDDesktop.1COLOR_DESKTOPDesktop.2COLOR_ACTIVECAPTIONActivewindowtitlebar.3COLOR_INACTIVECAPTION Inactivewindowcaption.4COLOR_MENUMenubackground.5COLOR_WINDOWWindowbackground.6COLOR_WINDOWFRAMEWindowframe.7COLOR_MENUTEXTTextinmenus.8COLOR_WINDOWTEXTTextinwindows.9COLOR_CAPTIONTEXTTextincaption,sizebox,andscrollbararrowbox.10COLOR_ACTIVEBORDERActivewindowborder.11COLOR_INACTIVEBORDERInactivewindowborder.12COLOR_APPWORKSPACEBackgroundcolorofmultipledocumentinterface(MDI)applications.13COLOR_HIGHLIGHTItem(s)selectedinacontrol.14COLOR_HIGHLIGHTTEXTTextofitem(s)selectedinacontrol.15COLOR_3DFACEFacecolorfor3Ddisplayelementsandfordialogboxbackgrounds.系统颜色列表系统颜色列表SysColorListValue ValueMeaning16COLOR_3DSHADOWShadowcolorfor3Ddisplay16COLOR_BTNSHADOWShadowcolorfor3Ddisplayelements.17COLOR_GRAYTEXTGrayed(disabled)text.18COLOR_BTNTEXTTextonpushbuttons.19COLOR_INACTIVECAPTIONTEXTColoroftextinaninactivecaption.20COLOR_3DHIGHLIGHTHighlightforthree-dimensionaldisplayelements20COLOR_3DHILIGHTHighlightfor3Ddisplayelements20COLOR_BTNHIGHLIGHT Highlightfor3Ddisplayelements21COLOR_3DDKSHADOWDarkshadowforthree-dimensionaldisplayelements.22COLOR_3DLIGHTLightfor3Ddisplayelements23COLOR_INFOTEXTTextcolorfortooltipcontrols.24COLOR_INFOBKBackgroundcolorfortooltipcontrols.26COLOR_HOTLIGHTColorforahyperlinkorhot-trackeditem.27COLOR_GRADIENTACTIVECAPTIONRightsidecolorofactivewindowstitlebar.28COLOR_GRADIENTINACTIVECAPTIONRightsidecolorofaninactivewindowstitlebar.29COLOR_MENUHILIGHTThecolorusedtohighlightmenuitems.30COLOR_MENUBARThebackgroundcolorforthemenubar4.3.4字体字体字体字体文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸等方面的属性。等方面的属性。字样字样是字符书写和显示时表现出的特定模式是字符书写和显示时表现出的特定模式.例如,对于汉字通常有宋体、楷体、隶书、黑体以及魏碑林等多例如,对于汉字通常有宋体、楷体、隶书、黑体以及魏碑林等多种字样;种字样;字体风格字体风格主要表现为字体的主要表现为字体的粗细粗细和和倾斜倾斜等特点;等特点;字体尺寸字体尺寸指字符所占区域的大小,用字符高度描述。可取毫米或英寸作为单指字符所占区域的大小,用字符高度描述。可取毫米或英寸作为单位位.常常用一种称为点常常用一种称为点pitch的单位,一点约折合为的单位,一点约折合为1/72英寸。对英寸。对于汉字,还常用号数来表示字体尺寸于汉字,还常用号数来表示字体尺寸,初号字、小初、一号、小一、初号字、小初、一号、小一、二号、小二等,如此类推,字体尺寸越来越小。二号、小二等,如此类推,字体尺寸越来越小。4.3.4字体字体字体分类字体分类根据字体的构造技术,可以把字体分为三种基本的技术类型:点根据字体的构造技术,可以把字体分为三种基本的技术类型:点阵字体、矢量字体和阵字体、矢量字体和TrueType字体。字体。点阵字体点阵字体也称光栅字体或位图字体,其中每个字符的原型都是以固定的位也称光栅字体或位图字体,其中每个字符的原型都是以固定的位图形式存储在字库中,如图形式存储在字库中,如System,MSSerif,FixedSys,Terminal和和SmallFonts等等;等等;点阵字体依赖于特定的设备分辨率,是与设备相关的字体;矢量点阵字体依赖于特定的设备分辨率,是与设备相关的字体;矢量字体和字体和TrueType字体都是与设备无关的,可以任意缩放。字体都是与设备无关的,可以任意缩放。矢量字体矢量字体也称为笔画字体或绘图仪字体,则是把字符分解为一系列直线而也称为笔画字体或绘图仪字体,则是把字符分解为一系列直线而存储起来,如存储起来,如Modern,Roman和和Script等等;等等;4.3.4字体字体TrueType字体字体可称为写真字体,其字符原型是一系列直线和曲线指令的线索的可称为写真字体,其字符原型是一系列直线和曲线指令的线索的集合集合,如如Courier,NewTimesNewRoman,Symbol和和Arial等等。等等。TrueType字体的生成速率较快,使用也最广泛。字体的生成速率较快,使用也最广泛。4.3.4字体字体逻辑字体与物理字体逻辑字体与物理字体逻辑字体与逻辑画笔和逻辑画刷相似,逻辑字体是应逻辑字体与逻辑画笔和逻辑画刷相似,逻辑字体是应用程序对于理想字体的一种描述方式。而实际安装在用程序对于理想字体的一种描述方式。而实际安装在操作系统中的和存在于设备中的字体都称为物理字体。操作系统中的和存在于设备中的字体都称为物理字体。应用程序在使用逻辑字体绘制文字时,系统会采用一应用程序在使用逻辑字体绘制文字时,系统会采用一种特定的算法把一种逻辑字体映射为最匹配的物理字种特定的算法把一种逻辑字体映射为最匹配的物理字体。体。字体结构字体结构typedefstructtagTEXTMETRICLONGtmHeight;/纵向高度纵向高度LONGtmAscent;LONGtmDescent;LONGtmInternalLeading;LONGtmExternalLeading;LONGtmAveCharWidth;/宽度宽度LONGtmMaxCharWidth;LONGtmWeight;/权重:权重:LONGtmOverhang;/(粗体斜体等字符的)附加宽度(粗体斜体等字符的)附加宽度LONGtmDigitizedAspectX;/横宽比例横宽比例LONGtmDigitizedAspectY;字体结构字体结构TCHARtmFirstChar;TCHARtmLastChar;TCHARtmDefaultChar;/默认字体默认字体TCHARtmBreakChar;/对其的间断字符对其的间断字符BYTEtmItalic;/斜体斜体BYTEtmUnderlined;/下划线下划线BYTEtmStruckOut;/删除线删除线BYTEtmPitchAndFamily;/字体族字体族BYTEtmCharSet;/字符集字符集TEXTMETRIC,*PTEXTMETRIC;tmCharSetANSI_CHARSETBALTIC_CHARSETCHINESEBIG5_CHARSETDEFAULT_CHARSETEASTEUROPE_CHARSETGB2312_CHARSETGREEK_CHARSETHANGUL_CHARSETMAC_CHARSETOEM_CHARSETRUSSIAN_CHARSETSHIFTJIS_CHARSETSYMBOL_CHARSETTURKISH_CHARSETVIETNAMESE_CHARSETtmPitchAndFamily指定字体是否是的点阵字体指定字体是否是的点阵字体(pitch)、使用的技术、使用的技术(technology)等字体族等字体族(family)的信息。的信息。tmPitchAndFamily常量常量TMPF_FIXED_PITCH:变宽的点阵字体:变宽的点阵字体(variablepitchfont)或固定点阵字体或固定点阵字体(fixedpitchfont)TMPF_VECTOR:向量字体。:向量字体。TMPF_TRUETYPE:TrueType字体字体.TMPF_DEVICE:设备相关字体:设备相关字体问题字体如何分类?问题字体如何分类?字体结构字体结构字体的纵向大小由字体的纵向大小由5个值确定。个值确定。图图4-3 定义字体中纵向字符大小的定义字体中纵向字符大小的4个值个值字符集字符集tmCharSetANSI_CHARSETBALTIC_CHARSETCHINESEBIG5_CHARSETDEFAULT_CHARSETEASTEUROPE_CHARSETGB2312_CHARSETGREEK_CHARSETHANGUL_CHARSETMAC_CHARSETOEM_CHARSETRUSSIAN_CHARSETSHIFTJIS_CHARSETSYMBOL_CHARSETTURKISH_CHARSETVIETNAMESE_CHARSET字符使用的技术字符使用的技术tmPitchAndFamily指定字体的点指定字体的点(pitch)、技术、技术(technology)和族和族(family)的信息。的信息。tmPitchAndFamily常量常量TMPF_FIXED_PITCH:变宽的点阵字体:变宽的点阵字体(variablepitchfont)或固定点阵字体或固定点阵字体(fixedpitchfont)TMPF_VECTOR:向量字体。:向量字体。TMPF_TRUETYPE:TrueType字体字体.TMPF_DEVICE:设备相关字体:设备相关字体逻辑字体结构逻辑字体结构typedefstructtagLOGFONTLONGlfHeight;/字体高度字体高度LONGlfWidth;/平均宽度平均宽度LONGlfEscapement;/字符排列角度字符排列角度LONGlfOrientation;/字符本身旋转的角度字符本身旋转的角度LONGlfWeight;/设置字体线条的宽度设置字体线条的宽度BYTElfItalic;/是否为斜体是否为斜体BYTElfUnderline;/是否加底线是否加底线BYTElfStrikeOut;/是否字符中央加横线是否字符中央加横线BYTElfCharSet;/字符集字符集BYTElfOutPrecision;/字体的精确度字体的精确度BYTElfClipPrecision;/裁剪字符的方法裁剪字符的方法BYTElfQuality;/字体质量字体质量BYTElfPitchAndFamily;/选择字体的间距和字体家族选择字体的间距和字体家族CHARlfFaceNameLF_FACESIZE;/字体的名称字体的名称LOGFONT;如何创建逻辑字体如何创建逻辑字体定义一个逻辑字体结构变量定义一个逻辑字体结构变量LOGFONTlogfont;填充逻辑字体结构变量的值填充逻辑字体结构变量的值为为logfont的各个字段赋值?的各个字段赋值?调用调用CreateFont函数函数CreateFontCreateFontIndirectCreatePointFontCreatePointFontIndirect如何创建逻辑字体如何创建逻辑字体作用:封装了一个作用:封装了一个WindowsGDI字体字体,并提供了一组成员函数。,并提供了一组成员函数。成员函数成员函数构造函数构造函数CFont:创建字体创建字体CreateFont:CreateFontIndirectCreatePointFontCreatePointFontIndirect其它函数:其它函数:FromHandle:用句柄创建一个:用句柄创建一个CFontobject.GetLogFont:用:用CFontobject填充一个填充一个LOGFONT结构。结构。operatorHFONT:取:取CFont对象句柄操作对象句柄操作CreateFont函数函数BOOLCreateFont(intnHeight,/字符高度字符高度intnWidth,/平均宽度平均宽度intnEscapement,/字符方向夹角字符方向夹角intnOrientation,/字符方向夹角字符方向夹角intnWeight,/权:权:FW_NORMAL,FW_REGULAR,andFW_BOLDBYTEbItalic,/斜体斜体BYTEbUnderline,/下划线下划线BYTEcStrikeOut,/删除线删除线BYTEnCharSet,/字符集字符集DEFAULT_CHARSETBYTEnOutPrecision,/输出精度输出精度BYTEnClipPrecision,/裁剪精度裁剪精度BYTEnQuality,/质量质量BYTEnPitchAndFamily,/LPCTSTRlpszFacename/字体名称字体名称);CreateFont函数函数BOOLCreateFontIndirect(constLOGFONT*lpLogFont);BOOLCreatePointFontIndirect(constLOGFONT*lpLogFont,CDC*pDC=NULL);BOOLCreatePointFont(intnPointSize,LPCTSTRlpszFaceName,CDC*pDC=NULL);nPointSize:以:以10为单位的字体高度。为单位的字体高度。列举设备描述表的字体列举设备描述表的字体函数功能:列举指定设备描述表中指定字体族里的字体。函数功能:列举指定设备描述表中指定字体族里的字体。函数原型:函数原型:intEnumFontFamilies(HDChdc,LPCTSTRlpszFamily,FONTENUMPROClpEnumFontFamProc,LPARAMlParam);参数:参数:hdc:设备环境句柄。:设备环境句柄。lpszFamily:以:以0结束的字符串指针,该字符串指定期望的结束的字符串指针,该字符串指定期望的字体族字体族的名字。的名字。如果如果lpszFamily为为NULL,则,则EnumFontFamilies随机地选择并列举每一个有效随机地选择并列举每一个有效字体族的字体。字体族的字体。lpEnumFontProc:指定应用程序定义的回调函数的:指定应用程序定义的回调函数的过程实例地址过程实例地址。lParam:指向应用程序供给的数据的指针,该数据和字体信息一起传给回:指向应用程序供给的数据的指针,该数据和字体信息一起传给回调函数。调函数。备注:对指定字体,备注:对指定字体,EnumFontFamilies获得此字体的信息,并传给参数获得此字体的信息,并传给参数pEnumFontFamProc指向的回调。该回调函数处理获得的字体信息,当再没有指向的回调。该回调函数处理获得的字体信息,当再没有有效字体或回调函数返回零时,列举才停止。有效字体或回调函数返回零时,列举才停止。列举设备描述表的字体列举设备描述表的字体此回调函数原型:此回调函数原型:intCALLBACKMyProc(constLOGFONTFAR*lpel
展开阅读全文