您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Visual_C++面向对象与可视化程序设计_windows_API_text_font
FACULTYOFSOFTWARE1VisualC++面向对象与可视化程序设计--------WINDOWSAPI编程之textandfontFACULTYOFSOFTWARE2第4讲文本与字体使用定义好的与设备无关的字体集,Windows就能维护它的设备无关性,提供“所见即所得”的好处,即屏幕所见与设备输出的文本是一样的Windows经常使用GDI进行文本输出。在一定意义上,任何内容都可以看成图形实体图形和文本并没有明显的界限文本操作先要获得文本句柄设置字体、字符大小、字符颜色等有关属性将这些属性选入设备环境FACULTYOFSOFTWARE35.1设置文本的设备环境字体逻辑字体定义的字符集是设备无关的,它可以精确标度,因此得到广泛应用描述所要显示的文本的大小、类型和外形物理字体是为特殊设备设计的,因而是设备相关的Win系统提供了七种基本字体字体说明ANSI_FIXEDANSI标准的固定宽度的字体ANSI_VARANSI标准的可变宽度的字体DEFAULT_GUI当前GUI的缺省字体OEM_FIXED由标准原设备制造商(OEM)提供DEVICE_DEFAULT当前图形设备的字体SYSTEM_FIXEDWindows的标准固定宽度的字体SYSTEMWindows提供的可变宽度的字体常作为缺省字体Win用它作为系统界面字体FACULTYOFSOFTWARE4在内定的DC中选择的字体称为系统字体,能够由GetStockObject的SYSTEM_FONT参数识别。这是固定的ANSI字符集字体。在GetStockObject中指定SYSTEM_FIXED_FONT,可以获得等宽字体的句柄。在希望所有的字体都具有相同宽度时,这是很方便的。备用字体OEM_FIXED_FONT也称为终端机字体,是Windows在MS-DOS命令提示窗口中使用的字体,它包括与原始IBM-PC扩展字符集兼容的字符集。Windows在窗口标题列、菜单和对话框的文字中使用DEFULT_GUI_FONT。当将新字体选入DC时,必须使用GetTextMetrics计算字符的高度和平均宽度。如果选择了固定字体,那么一定要注意,字符的平均宽度只是个平均值,某些字符会比它宽或比它窄。FACULTYOFSOFTWARE5字体型态Windows支持两大类字体,即所谓的「GDI字体」和「设备字体」。GDI字体储存在硬盘的文件中,而设备字体是输出设备本来就有的。GDI字体有三种样式:点阵字体,笔划字体和TrueType字体。点阵字体的每个字符都以位图像素图案的形式储存,每种点阵字体都有特定的纵横比和字符大小。Windows通过简单地复制图素的行或列就可以由GDI点阵字体产生更大的字符。点阵字体的主要优点是显示性能(显示速度很快)和可读性(因为是手工设计的,所以尽可能清晰)。FACULTYOFSOFTWARE6笔划字体是以「连结点」的方式定义的一系列线段,笔划字体可以连续地缩放,这意味着同样的字体可以用于具有任何分辨率的图形输出设备,并且字体可以放大或缩小到任意尺寸。不过,它的性能不好,小字体的可读性也很糟,而大字体由于笔划是单根直线而显得很单薄。笔划字体有时也称为绘图机字体,因为它们特别适合于绘图机,但是不适合于别的场合。TrueType字体的单个字符是通过填充的直线和曲线的轮廓来定义的。Windows可以通过改变定义轮廓的坐标对TrueType字体进行缩放。当程序开始使用特定大小的TrueType字体时,Windows「点阵化」字体。这就是说Windows使用TrueType字体文件中包括的「提示」对每个字符的连结直线和曲线的坐标进行缩放。这些提示可以补偿误差,避免合成的字符变得很难看。然后,每个字符的合成轮廓用于建立字符的位图,这些位图储存在内存以备将来使用。FACULTYOFSOFTWARE7(1)定义字体句柄变量:HFONThF;//hF为字体的句柄(2)调函数GetStockObject获得系统字体句柄它返回的是系统的缺省字体hF=GetStockObject():(3)调用函数SelectObject将字体选入设备环境SelectObject(hdc,hF);选择系统字体的步骤FACULTYOFSOFTWARE8逻辑字体逻辑字体是一个GDI对象,它的句柄储存在HFONT型态的变量中,逻辑字体是字体的描述。和逻辑画笔及逻辑画刷一样,它是抽象的对象,只有当应用程序调用SelectObject将它选入DC时,它才成为真实的对象。逻辑字体的建立和选择:可以透过调用CreateFont或CreateFontIndirect来建立逻辑字体。CreateFontIndirect函数接受一个指向LOGFONT结构的指针,该结构有14个字段。CreateFont函数接受14个参数,它们与LOGFONT结构的14个字段形式相同。它们是仅有的两个建立逻辑字体的函数。因为很难记住14个字段,所以很少使用CreateFont。FACULTYOFSOFTWARE95.1.2创建自定义字体若需要定义系统以外的字体,可以调用函数GreateFont自行创建HFont=CreateFont(intifHeight,//字体高度,0采用系统缺省值,使用逻辑单位intifWidth,//字体宽度,取0则由系统根据高宽比取最佳值intifEscapement,//每行文字相对于页底的角度,单位为0.1度intifOrienation,//每个文字相对于页底的角度,单位为0.1度DWORDifWeight,//字体粗细度,范围为0~1000DWORDifltalic,//如果要求字体倾斜,则取非零DWORDifUnderline,//如果要求下划线,则取非零DWORDifStrikeout,//如果要求中划线,则取非零DWORDifCharset,//字体所属字符集DWORDifOutputPrecision,//输出精度,一般取缺省值OUT_DEFAULT_PRECISDWORDifClipPrecision,//剪裁精度,常取缺省值CLIP_DEFAULT_PRECISDWORDifQuality,//输出质量,一般取缺省值DEFAULT_QUALITYDWORDifPitchAndFamily,//字体间距及系列缺省值DEFAULT_PITCHDWORDifFaceName//字体名)可选的系统字符集:ANSI_CHARSETOEM_CHARSETSYMBOL_CHARSETDEFAULT_CHARSETSHIFTJIS_CHARSETFACULTYOFSOFTWARE10ifHeight,如果为正,就是设置单元高度;如果为负,就是设置字符高度。ifEScapement使字符串能够以一定的角度书写(但每个字符的基准线仍与水平轴平行),而ifOrientation使单个字符倾斜。要注意单位是十分之一度,逆时针方向旋转。它很容易输入一个值使范例字符串消失!因此,请使用0到-600或3000到3600之间的值。lfWeight这个字段能够指定粗体。WINGDI.H表头文件定义了可用于这个字段的一组值.可以对标准字使用0或400,对粗体使用700。注意lfCharSet字段是唯一不用零表示默认值的字段。零值相当于ANSI_CHARSET,ANSI字符在美国和西欧使用。DEFAULT_CHARSET代码等于1,表示程序执行的机器上内定的字符集。FACULTYOFSOFTWARE11ifFaceName这是关于字样的实际文字名称。这个字段是宽度为LF_FACESIZE(或32个字符)的字节数组。如果要得到TrueType的斜体或粗体字体,有两种方法。在lfFaceName字段中使用完整的字体名称(如TimesNewRomanItalic),或者可以使用基本名称(即TimesNewRoman),并设定lfItalic字段。例:lf.lfFaceName=“黑体”FACULTYOFSOFTWARE12逻辑字体结构可以调用CreateFont来建立逻辑字体,它是具有14个参数的函数。一般,定义一个LOGFONT型态的结构LOGFONTlf;然后再定义该结构的字段会更容易一些。完成后,可以使用指向该结构的指针调用CreateFontIndirect:hFont=CreatFontIndirect(&lf);不必设定LOGFONT结构的每个字段。如果逻辑字体结构定义为静态变量,那么所有的字段都会初始化为0,0一般是默认值。然后,可以不用更改而直接使用这个结构,CreateFontIndirect会传回字体的句柄。FACULTYOFSOFTWARE13LOGFONTlf;lf.lfHeight=-(int)(fabs(pt.y)/10.0+0.5);lf.lfWidth=0;lf.lfEscapement=0;lf.lfOrientation=0;lf.lfWeight=iAttributes&EZ_ATTR_BOLD?700:0;lf.lfItalic=iAttributes&EZ_ATTR_ITALIC?1:0;lf.lfUnderline=iAttributes&EZ_ATTR_UNDERLINE?1:0;lf.lfStrikeOut=iAttributes&EZ_ATTR_STRIKEOUT?1:0;lf.lfCharSet=DEFAULT_CHARSET;lf.lfOutPrecision=0;lf.lfClipPrecision=0;lf.lfQuality=0;lf.lfPitchAndFamily=0;lstrcpy(lf.lfFaceName,szFaceName);hFont=CreateFontIndirect(&lf);FACULTYOFSOFTWARE14建立、选择和删除逻辑字体1.通过调用CreateFont或CreateFontIndirect建立逻辑字体,这些函数传回HFONT型态的逻辑字体句柄。2.使用SelectObject将逻辑字体选入设备内容,Windows会选择与逻辑字体最匹配的真实字体。3.使用GetTextMetrics(及可能用到的其它函数)确定真实字体的大小和特征。在该字体选入设备内容后,可以使用这些信息来适当地设定文字的间距。4.在使用完逻辑字体后,调用DeleteObject删除逻辑字体,当字体选入有效的设备内容时,不要删除字体,也不要删除备用字体。FACULTYOFSOFTWARE155.1.3设置字体和背景颜色设置字体颜色:SetTextColor(hdc,crColor);设置背景颜色:SetBkColor(hdc,crColor);crColor为设置的颜色字体及背景颜色的设置在开发过程中非常重要设置背景模式:SetBkMode(hdc,iMode);FACULTYOFSOFTWARE16SetBkMode(hdc,iMode);更改背景模式,其中iMode的值为OPAQUE或TRANSPARENT。内定的背景模式为OPAQUE,它表示Windows使用背景颜色来填充矩形的背景。SetBkColor(hdc,rgbColor);来改变背景颜色。rgbColor的值是转换为纯色的值。内定背景色是白色。如果两行文字靠得太近,其中一个的背景矩形就会遮盖另一个的文字。由于这种原因,通常希望内定的背景模式是TRANSPARENT。在背景模式为TRANSPARENT的情况下,Windows会忽略背景色,也不对矩形背景区域着色。Windows也使用背景模式和背景色对点和虚线之间的空隙及阴影刷中阴影间的区域着色。FACULTYOFSOFTWARE175.2文本的输出过程确定后续文本坐标确定换行时文本坐标文本输出过程获取字体信息格式化文本调用函数输出文本FACULTYOFSOFTWARE18获取字体信息输出文本之前要获取字体的信息,如字符高度等,以确定输出格式和下一行字符的位置GetTextMetrics(hdc,&tm);//
本文标题:Visual_C++面向对象与可视化程序设计_windows_API_text_font
链接地址:https://www.777doc.com/doc-3395832 .html