首页 > 编程知识 正文

windows字体怎么变大,windows字体

时间:2023-05-05 04:00:41 阅读:268340 作者:2511

1.建立字体handle

请先看CreateFont函数的原型:

HFONT hFont = CreateFont(int nHeight, //字体高度int nWidth, //字体宽度int nEscapement, //字体斜度int nOrientation, //底线斜度int fnWeight, //字体粗细DWORD fdwItalic, //设定字体为斜体DWORD fdwUnderline, //设定字体底线DWORD fdwStrikeOut, //设定刪线DWORD fdwCharSet, //设定字符集DWORD fdwOutputPrecision, //字体输出精度DWORD fdwClipPrecision, //字型剪切精度DWORD fdwQuality, //字体轮廓质量DWORD fdwPitchAndFamily, //字体的外观参考(沒有所需字体時用)LPCTSTR lpszFace //字体名称);

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

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

nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

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

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

FontSize = 120; //即12 points,Microsoft Word的预设字体大小hFont = CreateFont(-(int)(fabs(FontSize*GetDeviceCaps(hdc,LOGPIXELSY)/72)/10.0+0.5),0,0,0,500,FALSE,FALSE,FALSE,0,0,0,0,0,"标楷体"); //建立字体SelectObject(hdc,hFont); //令HDC选择字体TextOut(hdc,100,100,"标楷体12点字体",8);DeleteObject(SelectObject(hdc,hFont);

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

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

第二种呼叫字体的方法

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

LOGFONT { LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE];}

 

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

LOGFONT lf;HFONT hFont;...... // 填入字体资料于LOGFONT结构中hFont = CreateFontIndirect(&lf);

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或预计值便可 
 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。