windows字体

这篇博客详细介绍了在Windows中创建和管理字体的方法,包括使用CreateFont函数建立字体handle,通过LOGFONT结构体设置字体属性,以及如何理解并使用LOGFONT结构的各项参数。内容涵盖了字体高度、宽度的计算,字体斜度、粗细的设定,以及如何处理字体的显示质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.建立字体handle

请先看CreateFont函数的原型:

真嚇人,共有十四个参数,尽管你能记得设定字体要有哪些参数,但你也未必能記清楚每个参数的位置。CreateFont函数会传回HFONT字体handle,這是最直接、最快、算是最易用的字体函数了。

当中,字体高度和宽度是电脑逻辑长度,可用以下公式计算:

当中PointSize就是字体的大小(这数字就是在Microsoft Word中设定字体大小的数字)。

你亦可跟随Charles Petzold的计算方法,不过会比以上方法较复杂難明,但这方法也是最准确的方法(能准确计算字体的逻辑高度):

从以上例子可见,我们建立了十二点、中等粗细、非斜体、没加底线、没加删线的「标楷体」向量字型,利用 (点数 x 10 x 系统逻辑高度 / 72 + 0.5) 的绝对整数值 这公式就能计算字体的实际显示大小。

另外,我们利用SelectObject来载入字体handle,以后的文字输出均以该字体显示,直至DeleteObject为止,我们绝大部份时间都以上述程式码來设定字体。

第二种呼叫字体的方法

我们有CreateFont函数,亦有CreateFontIndirect函数来间接建立字体,但別以为这函数能简化你呼叫字体的步骤,这函数只可让你填入字体的外观資料到LOGFONT结构体,才建立字体,而不需直接把十四个参数输入CreateFont,先看看LOGFONT结构:

 

十四个参数一个不漏地呈现在LOGFONT结构中,把资料填入这结果,然后呼叫CreateFontIndirect就行了:

LOGFONT结构详解

在此,我们不妨说说LOGFONT结构。刚才也说明过lfHeight是逻辑高度,而lfWidth就是逻辑宽度,需要呼叫GetDeviceCaps来取得屏幕的DPI(每一吋有多少pixel),通常我们都会把lfWidth置零,置零代表字体宽度会跟随lfHeight来调整,以取得最合适最美观的长宽比例,当然你也可以自行设定lfWidth。

lfEscapement是字体斜度,以0.1度位单位,这角度是escapement vector和X轴的角度,而escapement vector是平行于底线的。与lfEscapement一样,lfOrientation也是设定斜度,应与lfEscapement的设定值一样(但在Windows NT/2000上,若绘图模式被设定为GM_ADVANCED,Orientation和Escapement是两回事,由于涉及复杂计计算,在此不作详谈)。

lfWeight是字体粗细,由0至900,其设定值必需为100的倍数,一般來说400是正常粗细,而700就是粗体,若该值设为0则代表以预计粗细显示文字。

随后的三个值lfItalic、lfUnderline、lfStrikeOut就是Microsoft Word让使用者设定为斜体、加底线和加刪线的功能,填入TRUE则开启选项,FALSE则关闭。

lfCharSet则让人设定字元集,例如我们想显示简体字,就会设定为GB2312_CHARSET,希腊符号就设定为SYMBOL_CHARSET,大五码为CHINESEBIG5_CHARSET,ANSI为ANSI_CHARSET等等,若本值设零则为DEFAULT_CHARSET,预设值在中文视窗中是CHINESEBIG5_CHARSET。

lfOutPrecision是设定字型显示的精确度,当大家设定了繁体的字体斜度粗细之后,精密的raster operation总会有点差错,这些差错可以靠修正部份字体设定来减轻,但不能消除,这时候你要决定舍弃字体的轮廓还是清晰度。因为我们用的都是TTF,所以我们都会把此值设为0,在TTF的世界不需要考虑字型会失真。

lfClipPrecision是设定部份字型被其他图像或框架覆盖时的显示精确度,和lfOutPrecision一样,我们一般都把此值设0。

lfQuality就关系到TTF,这是决定GDI处理字体显示的精确度,与字体的性质无关,在大部份情况也会设0代表使用预设值,我们也可设为PROOF_QUALITY使字体显示更精确,但运算时间也较长;你也可算择DRAFT_QUALITY来取得最乎合比例的字型,运算时间亦较短(别以为字体的运算时间是多不重要,大家用过Windows 2000的Notepad后就会认同我这番话)。

lfPitchAndFamily设定字型的端点和字系,假若你所选择的字体并未能在你的电脑上找到,这个参数就会找出补充语系来显示所需文字。

请留意,绝大部份情况下,我们都不需要刻意设定lfCharSet、lfOutPrecision、lfClipPrecision、lfQuality和lfPitchAndFamily,我们把它设为0或预计值便可 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值