•在Windows操作系统中,使用设备上下文不仅能对图形图像进行处理,对文本也能进行相应的操作。•在Windows应用程序的编写过程中,对于文本和字体的处理是程序员应该熟悉掌握的知识点。•本章将讲解如何使用CDC类对文本和字体进行处理。文本函数6.1文本属性6.2字体6.36.1文本函数•在CDC类中,常用的文本函数是TextOut()、DrawText()、ExtTextOut()和TabledTextOut()。•下面对这4个函数分别进行详细介绍。6.1.1使用TextOut显示文本•调用CDC类的成员函数TextOut(),可以在指定位置显示文本。•该函数的原型如下:•virtualBOOLTextOut(•intx,•inty,•LPCTSTRlpszString,•intnCount•);•BOOLTextOut(•intx,•inty,•constCString&str•);图6.1程序sample0601的运行结果6.1.2使用DrawText显示指定格式文本•DrawText()函数用于在指定的区域中格式化文本。•该函数的原型如下:•virtualintDrawText(•LPCTSTRlpszString,•intnCount,•LPRECTlpRect,•UINTnFormat•);•intDrawText(•constCString&str,•LPRECTlpRect,•UINTnFormat•);图6.2程序sample0602的运行结果6.1.3使用ExtTextOut显示字符串•调用ExtTextOut()函数可以用当前选用的字体,在指定的矩形区域内显示字符串。••该函数的原型如下:•virtualBOOLExtTextOut(•intx,•inty,•UINTnOptions,•LPCRECTlpRect,•LPCTSTRlpszString,•UINTnCount,•LPINTlpDxWidths•);•BOOLExtTextOut(•intx,•inty,•UINTnOptions,•LPCRECTlpRect,•constCString&str,•LPINTlpDxWidths•);图6.3程序sample0603的运行结果6.1.4使用TabbedTextOut显示字符串•使用TabbedTextOut()函数可以在指定位置显示字符串,并用指定的制表间距扩展Tab制表位。•该函数的原型如下:•virtualCSizeTabbedTextOut(•intx,•inty,•LPCTSTRlpszString,•intnCount,•intnTabPositions,•LPINTlpnTabStopPositions,•intnTabOrigin•);•CSizeTabbedTextOut(•intx,•inty,•constCString&str,•intnTabPositions,•LPINTlpnTabStopPositions,•intnTabOrigin•);6.2文本属性•文本的属性包括文本的对齐方式、字符间距、映射模式以及文本的颜色和文本的背景颜色等。•在上一节的示例中,使用的文本属性均为默认设置。•下面对文本属性的各个方面进行详细介绍。6.2.1对齐方式•在CDC类中,调用SetTextAlign()函数可以设置文本的对齐方式。•该函数的原型如下:•UINTSetTextAlign(UINTnFlags);•其中,参数nFlags表示用于指定文本的对齐方式。•该参数的常用取值如表6.2所示。•调用GetTextAlign()函数可以获取当前文本的对齐方式。•该函数的原型如下:•UINTGetTextAlign()const;图6.4程序sample0605的运行结果6.2.2字符间距•在CDC类中,调用SetTextCharacterExtra()函数可以设置字符间距。•该函数的原型如下:•intSetTextCharacterExtra(intnCharExtra);•其中,参数nCharExtra表示用于指定加入到每个字符串的额外间距值。•如果想要获取当前的字符间距,可以调用GetTextCharacterExtra()函数。•该函数的原型如下:•intGetTextCharacterExtra()const;图6.5程序sample0606的运行结果6.2.3背景模式•在CDC类中,调用SetBkMode()函数可以设置文本背景模式,确定文本输出背景颜色的显示方式。•该函数的原型如下:•intSetBkMode(intnBkMode);•如果想要获取当前文本的背景模式,可以调用GetBkMode()函数。•该函数的原型如下:•intGetBkMode()const;图6.6程序sample0607的运行结果6.2.4文本颜色•在CDC类中,调用成员函数SetTextColor()可以设置文本的颜色。•该函数的原型如下:•virtualCOLORREFSetTextColor(COLORREFcrColor);•其中,参数crColor用于设置输出文本的颜色,可以通过RGB()函数指定。•RGB()函数的原型如下:•COLORREFRGB(•BYTEbRed;•BYTEbGreen,•BYTEbBlue•);•如果想要获取当前文本的颜色,可以调用GetTextColor()函数。•该函数的原型如下:•COLORREFGetTextColor()const;图6.7程序sample0608的运行结果6.2.5背景颜色•在CDC类中,调用成员函数SetBkColor()可以设置文本的背景颜色。•该函数的原型如下:•virtualCOLORREFSetBkColor(COLORREFcrColor);•如果想要获取当前文本的颜色,可以调用GetBkColor()函数。•该函数的原型如下:•COLORREFGetBkColor()const;图6.8程序sample0609的运行结果6.2.6字符属性•字符属性是指字符的宽度、高度、字符的间距和行间距等。•在MFC中,提供了一个TEXTMETRIC结构用于描述字符的属性。•该结构的原型如下:•typedefstructtagTEXTMETRIC{•inttmHeight;•inttmAscent;•inttmDescent;•inttmInternalLeading;•inttmExternalLeading;•inttmAveCharWidth;•inttmMaxCharWidth;•inttmWeight;•BYTEtmItalic;•BYTEtmUnderlined;•BYTEtmStruckOut;•BYTEtmFirstChar;•BYTEtmLastChar;•BYTEtmDefaultChar;•BYTEtmBreakChar;•BYTEtmPitchAndFamily;•BYTEtmCharSet;•inttmOverhang;•inttmDigitizedASPectX;•inttmDigitizedAspectY;•}TEXTMETRIC;•在CDC类中,调用GetTextMetrics()可以获取当前使用字体的字符属性。•该函数的原型如下:•BOOLGetTextMetrics(LPTEXTMETRIClpMetrics)const;图6.9程序sample0610的运行结果6.3字体•在Windows中,提供了一些字体,这些字体被称为库存字体。•在多数情况下,使用库存字体就能满足程序的要求。•另外,用户可以自定义字体来满足程序的特殊要求。6.3.1使用库存字体•在Windows中,其提供的库存字体一共有6种,如表6.3所示。•在程序的编写过程中,用户可以直接调用SelectStockObject()函数将这些字体选入设备上下文。•该函数的原型如下:•virtualCGdiObject*SelectStockObject(intnIndex);图6.10程序sample0611的运行结果6.3.2使用CreateFont创建字体•在MFC类库中,提供了专门用于处理字体的类CFont。•通过CFont类可以实现自定义字体。•调用CreateFont()函数就可以创建自定义字体。•该函数的原型如下:•BOOLCreateFont(•intnHeight,•intnWidth,•intnEscapement,•intnOrientation,•intnWeight,•BYTEbItalic,•BYTEbUnderline,•BYTEcStrikeOut,•BYTEnCharSet,•BYTEnOutPrecision,•BYTEnClipPrecision,•BYTEnQuality,•BYTEnPitchAndFamily,•LPCTSTRlpszFacename•);图6.11程序sample0612的运行结果6.3.3使用CreateFontIndirect创建字体•在CDC类中,还可以使用CreateFontIndirect()函数来创建逻辑字体。•该函数的原型如下:•BOOLCreateFontIndirect(constLOGFONT*lpLogFont);•其中,参数lpLogFont指的是LOGFONT结构对象。•LOGFONT结构的原型如下:•typedefstructtagLOGFONT{•LONGlfHeight;•LONGlfWidth;•LONGlfEscapement;•LONGlfOrientation;•LONGlfWeight;•BYTElfItalic;••BYTElfUnderline;•BYTElfStrikeOut;•BYTElfCharSet;•BYTElfOutPrecision;•BYTElfClipPrecision;•BYTElfQuality;•BYTElfPitchAndFamily;•TCHARlfFaceName[LF_FACESIZE];•}LOGFONT;图6.12程序sample0613的运行结果小结•本章主要介绍了在Windows中如何对文本和字体的处理。•主要内容包括文本函数、文本属性和字体。•其中,在用于输出文本的函数众多,请读者熟知各个函数的功能与相应参数。•文本属性包括文本的对齐方式、字符间距、映射模式以及文本的颜色和文本的背景颜色等。•第7章将要介绍对话框的相关知识。上机指导•实验一:输出颜色为红色的字体•实验内容•创建一个单文档的应用程序TestOne,在里面输出一行红色的字体,运行结果如图6.13所示。•实验目的•掌握文本的基本属性,熟练地设置文本的字体。图6.13实验一的运行结果•实现思路•在6.2.3节中输出了不是默认颜色的字体。•本实验套用6.2.3节的示例代码即可。•实验二:使用库存字体输出文本,并测试字体的宽度和高度•实验内容•创建一个单文档的应用程序TestTwo,并选用一种库存字体进行文本输出。•在程序中要对选用的库存字体的宽度和高度进行计算,运行结果如图6.14所示。图6.14实验二的运行结果•实验目的•熟练使用各种库存字体,并能通过代码获取所选用字体的宽度和高度。•实现思路•在6.3.1节中使用了各种库存字体,本实验读者请随意选用;然后利用字符的宽度和高度这两个属性,来输出所选用字体的宽度和高度。•实验三:使用自定义字体•实验内容•创建一个单文档的应用程序TestThree,然后使用自定义的字体进行文本输出。•该自定义的字体宽度为15,高度为30,字符倾斜度为20,磅重为100,字体为斜体,有下画线,其他属性默认。•运行结果如图6.15所示。图6.15实验三的运行结果•实验目的•掌握如何创建自定义字体。•实现思路•在6.3.2节和6.3.3节分别使用CreateFont()和CreateFontIndirect()函数创建自定义的字体。•本实验可以选择两者中的一个,均可达到图6.15所示的效果。