GDI+学习及代码总结之------文本与字体

更新时间:2023-07-17 10:52:40 阅读: 评论:0

GDI+学习及代码总结之------⽂本与字体
字体系列
GDI+中将具有相同字样、包括不同风格的字体称为字体系列。字体从其系列中获得名称、重量(如粗体、规则、加亮)以及风格。例如Arial字体系列包含了下列4种字体:
Arial Regular(规则)、Arial Bold(⿊体)、Arial Italic(斜体)、Arial Bold Italic(粗斜体);
在GDI+中输出⽂本之前,需要构造⼀个FontFamily对象和⼀个Font对象。FontFamily类的构造函数如下:
FontFamily()
FontFamily(name, fontCollection)
name:字体系列名。
fontCollection:指向⼀个FontCollection对象(字体集),表明字体系列所属的私有字体集,默认为NULL
⽰例(定义⼀个Arial Regular字体对象font)
FontFamily fontFamily(L"Arial");
Font font(&fontFamily,16,FontStyleRegular,UnitPixel);
看⼏个结构类型
1、LOGFONTA和LOGFONTW
两个都是⼀样的,只是⼀个⽤于ASCII编码,⼀个⽤于UNICODE编码
字体⼤⼩单位枚举(Unit)
enum Unit{
UnitWorld,//世界坐标,⾮物理上的单位
UnitDisplay,//使⽤和输出设备相同的单位,如输出设备为显⽰器,其单位为像素
UnitPixel,//像素
UnitPoint,//点(磅),1点等于1/72英⼨
UnitInch,//英⼨
UnitDocument,//1/300英⼨
UnitMillimeter//毫⽶
};
字体风格枚举(FontStyle)
enum FontStyle{
FontStyleRegular    = 0,//常规
FontStyleBold      = 1,//加粗
FontStyleItalic    = 2,//斜体
形容食物好吃
FontStyleBoldItalic = 3,//粗斜
常熟虞山风景区>抽屉原理
FontStyleUnderline  = 4,//下划线
FontStyleStrikeout  = 8//强调线,即在字体中部划线
};
注意:在这⼏个样式中,常规、加粗、倾斜、粗斜不能同时使⽤。下划线和强调线风格可以同时使⽤,也就是说,字体风格由两部分组成,⼀部分与字体外形有关,另⼀部分是附加的线条风格(下划线和强调线),这两部分可以配合使⽤组成字体的整体风格。
例如,要描述⼀个带下划线和强调线的粗斜体风格的字体,可以使⽤下⾯的组合来完成:
FontStyleBoldItalic |FontStyleUnderline |FontStyleStrikeout
列举系统⽬前安装的字体信息
我们可以通过InstalledFontCollection类的成员函数GetFamilies枚举安装在计算机上的所有字体。GetFamilies函数返回的是⼀个FontFamily对象的数组。所以,在使⽤GetFamilies前,应该为FontFamily数组分配⾜够的内存空间。GetFamilies函数:
Status GetFamilies(
INT numSought,
FontFamily* gpfamilies,
INT* numFound
) const;
numSought:[in]字体集中的字体系列总数,通过InstalledFontCollection::GetFamilyCount()获取
gpfamilies:[out]存储返回的已安装的字体系列的数组;
numFound:[out]存储返回的字体系列总数,数值与numSought⼀样;
应⽤:列举出系统中的所有字体:
SolidBrush solidbrush(Color::Black);
FontFamily fontfamily(L"Arial");
Font font(&fontfamily,8,FontStyleRegular,UnitPoint);
int count=0;
int found=0;
WCHAR familyName[100];//这⾥为了简化程序,分配⾜够⼤的空间
WCHAR *familyList=NULL;
FontFamily pFontFamily[500];//同样,分配⾜够⼤的空间
CRect rect;
this->GetClientRect(&rect);
RectF r(0,0,rect.Width(),rect.Height());
InstalledFontCollection installedFontCollection;
count=installedFontCollection.GetFamilyCount();
installedFontCollection.GetFamilies(count,pFontFamily,&found);
familyList=new WCHAR[count*sizeof(familyName)];
wcscpy(familyList,L"");//先清空familyList,wcscpy实现对宽字节的复制操作
for(int j=0;j<count;j++){
pFontFamily[j].GetFamilyName(familyName);
wcscat(familyList,familyName);//把familyName添加到familyList的最后
wcscat(familyList,L",");//wcscat实现对宽字节字符的添加操作
}
烟机十大品牌
graphics.DrawString(familyList,-1,&font,r,NULL,&solidbrush);
delete[] familyList;
注意:wcscpy\wcscat函数分别实现了对双字节字符(宽字符)的复制、添加操作,在ASCII码中对应strcpy、strcat;
字体边沿平滑处理
⼤家都知道,当字体过⼤时,就会出现失真,边缘会出现锯齿,GDI+对字体边缘有⼀套⾃⼰的处理⽅式,是通过SetTextRenderingHint 来实现的;
Status SetTextRenderingHint(
TextRenderingHint newMode
);
其中TextRenderingHint是个枚举类,枚举了⼏种处理边缘的⽅式
enum TextRenderingHint{
TextRenderingHintSystemDefault = 0,//使⽤与系统相同的处理⽅式
TextRenderingHintSingleBitPerPixelGridFit,//不消除锯齿,使⽤⽹格匹配
TextRenderingHintSingleBitPerPixel,//不消除锯齿,不使⽤⽹格匹配
TextRenderingHintAntiAliasGridFit,//消除锯齿,使⽤⽹格匹配
TextRenderingHintAntiAlias,//消除锯齿,不使⽤⽹格匹配
TextRenderingHintClearTypeGridFit //在液晶显⽰器上使⽤ClearType技术增强字体清晰度
wifi发射器
};
看⽰例:
FontFamily fontfamily(L"宋体");
Font font(&fontfamily,60,FontStyleRegular,UnitPixel);
//使⽤与系统相同的处理⽅式
graphics.SetTextRenderingHint(TextRenderingHintSystemDefault);
graphics.DrawString(L"什么玩意",-1,&font,PointF(0,0),&SolidBrush(Color::Green));
//不消除锯齿,使⽤⽹格匹配
graphics.TranslateTransform(0,font.GetHeight(0.0f));
graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixelGridFit );
graphics.DrawString(L"什么玩意",-1,&font,PointF(0,0),&SolidBrush(Color::Green));
//不消除锯齿,不使⽤⽹格匹配
graphics.TranslateTransform(0,font.GetHeight(0.0f));
graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel );
graphics.DrawString(L"什么玩意",-1,&font,PointF(0,0),&SolidBrush(Color::Green));
//消除锯齿,使⽤⽹格匹配
graphics.TranslateTransform(0,font.GetHeight(0.0f));
graphics.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit );
graphics.DrawString(L"什么玩意",-1,&font,PointF(0,0),&SolidBrush(Color::Green));
//消除锯齿,不使⽤⽹格匹配
graphics.TranslateTransform(0,font.GetHeight(0.0f));
graphics.SetTextRenderingHint(TextRenderingHintAntiAlias );
graphics.DrawString(L"什么玩意",-1,&font,PointF(0,0),&SolidBrush(Color::Green));
/
/在液晶显⽰器上使⽤ClearType技术增强字体清晰度
graphics.TranslateTransform(0,font.GetHeight(0.0f));
graphics.SetTextRenderingHint(TextRenderingHintClearTypeGridFit );
graphics.DrawString(L"什么玩意",-1,&font,PointF(0,0),&SolidBrush(Color::Green));
回头一笑百媚生
从上⾯可以看出,列出的这六种边缘处理⽅式中,最后⼀种枚举成员TextRenderingHintClearTypeGridFit的处理效果最好。这种处理⽅式使⽤了Microsoft特有的ClearType技术。是专在液晶显⽰器上使⽤的⼀种增强字体清晰度的技术。但这种技术有时会出现问题,⽤投影仪投射到⽩⾊墙壁上,会出出字体显⽰不正常的情况,⽽且对于⽼式的CRT显⽰器是根本不⽀持的。操作系统也必须是XP及以上的系统才⾏。 所以⼀般⽤第⼀个参数,与系统处理⽅式相同就好。让系统决定我们适合哪种技术。
FontFamily和Font
在GDI+中输出⽂本之前,需要构造⼀个FontFamily对象和⼀个Font对象。FontFamily类的构造函数如下:
FontFamily()
FontFamily(name, fontCollection)
颖五笔怎么打
name:字体系列名。
fontCollection:指向⼀个FontCollection对象(字体集),表明字体系列所属的字体集,默认为NULL
再看看Font类的构造函数(先看这四个):
Font(hdc)
Font(HDC hdc, LOGFONTA* logfont)
Font(HDC hdc, LOGFONTW* logfont)
Font(hdc, hfont)
这四个都是GDI中的构造函数,这⾥就全不讲了,只说说最后两个纯正的GDI+中的Font构造函数
Font(family, emSize, style, unit) ;//⼀般⽤这个
Font(familyName, emSize, style, unit, fontCollection) ;//当⽤到私有字体集时,才会⽤这个构造
family、familyName:fontFamily对象
style:字体样式,是规则、粗体、斜体、粗斜体、下划线、强调线的枚举类,我们上⾯说过了
unit:字体⼤⼩
fontCollection:字体所属的字体集,这个是⽤来添加私有字体集的,下⾯我们将讲私有字体集。
表白的歌曲
构造私有字体集(PrivateFontCollection)
我们平时使⽤的字体集,只有在系统中注册过才能直接调⽤,但当我们使⽤⼀个别⼈系统中可能不存在的字体集时,我们可以从我们的字体⽂件中加载这个字体集,然后给⽤户使⽤,从⽂件中加载系统中没有注册的字体集的过程,就是创建私有字体集的过程。创建私有字体集⽤PrivateFontCollection类来实现,这⾥就不讲了,想了解的话,看《精通GDI+编程》P139。
Font的构造函数中的最后⼀个参数fontCollection就是从⽂件中加载的私有字体集;
字体尺⼨、字体系列尺⼨
字体尺⼨和字体系统尺⼨不是同⼀个概念,我们先看⼀下他们的共同部分,字体在⼏个距离上的概念:
⼏个概念:
基线:在英⽂中,会有基线的概念,这是个抽象的概念,所以GDI+并不⽀持对基线的设置,是指在四线格中的第三条线,这条线把字母分为上部和下部,如图中所⽰。
上部:是指从基线到上⾏字母顶部之间的距离。
下部:是从基线到下⾏字母底部的距离。
⾏距:是指上下两⾏基线之间的距离,包括基线之上的上部值、基线之下的下部值以及在上部之外的⼀些额外空间(通常⽤于形成⾏间距,对于这部分空间,GDI+也不提供函数直接访问操作。)
字体系列的尺⼨(FontFamily)
字体系列尺⼨,与实际显⽰的字体⼤⼩⽆关,它只与设计时的尺⼨有关,获取函数有:

本文发布于:2023-07-17 10:52:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1101236.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字体   系统   风格   部分   技术   函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图