win32 字体 api学习总结

来源:互联网 发布:网络兼职申请表 编辑:程序博客网 时间:2024/05/25 18:10

TrueType字体

TrueType字体,中文名称全真字体,是由Apple公司和Microsoft公司联合提出的一种采用新型数学字形描述技术的计算机字体。它用数学函数描述字体轮廓外形,含有字形构造、颜色填充、数字描述函数、流程条件控制、栅格处理控制、附加提示控制等指令。TrueType字体与PostScript字体、OpenType字体是主要的三种计算机矢量字体(又称轮廓字体、描边字体)。
中文名 全真 外文名 Truetype
目录
1 优势
2 应用
3 示例
4 辨析
优势
TrueType字体,中文名称全真字体。它具有如下优势:
1)真正的所见即所得字体。由于TrueType字体支持几乎所有输出设备,因而无论在屏幕、激光打印机、激光照排机上,还是在彩色喷墨打印机上,均能以设备的分辨率输出,因而输出很光滑。
2)支持字体嵌入技术。存盘时可将文件中使用的所有TrueType字体采用嵌入方式一并存入文件之中,使整个文件中所有字体可方便地传递到其它计算机中使用。嵌入技术可保证未安装相应字体的计算机能以原格式使用原字体打印。
3)操作系统的兼容性。MAC和PC机均支持TrueType字体,都可以在同名软件中直接打开应用文件而不需要替换字体。
应用
当程序开始使用特定大小的TrueType字体时,Windows「点阵化」字体。这就是说Windows使用TrueType字体档案中包括的「提示」对每个字元的连结直线和曲线的坐标进行缩放。这些提示可以补偿误差,避免合成的字元变得很难看(例如,在某些字体中,大写H的两竖应该一样宽,但盲目地缩放字体可能会导致其中一竖的图素比另一竖宽。有了提示就可以避免这些现象发生)。然後,每个字元的合成轮廓用于建立字元的点阵图,这些点阵图储存在记忆体以备将来使用。
示例
最初,Windows使用了13种TrueType字体,它们的字体名称如下:
Courier New
Courier New Bold
Courier New Italic
Courier New Bold Italic
Times New Roman
Times New Roman Bold
Times New Roman Italic
Times New Roman Bold Italic
Arial
Arial Bold
Arial Italic
Arial Bold Italic
Symbol
在新的Windows版本中有更多的TrueType字体。现在Windows Vista简体版的默认字体是微软雅黑体,Windows XP也可改装。
辨析
三个主要字体系列与点阵字体相似。Courier New是定宽字体,它看起来就像是打字机输出的字体。Times New Roman是Times字体的复制品,该字体最初为《Times of London》设计,并用在许多印刷材料上,它具有很好的可读性。Arial是Helvetica字体的复制品,是一种sans serif字体。Symbol字体包含了手写符号集。
========

OpenType

http://www.microsoft.com/typography/fontinfo/zh-chs/


OpenType 是一种由 Microsoft 和 Adobe 联合开发的字体格式,这是 Apple 的 TrueType 字体格式的扩充。OpenType 提供潜在的丰富排印调色及多语言支持。Microsoft Windows 同时支持 TrueType 和 OpenType 字体以及旧版 PostScript Type 1 字体。


OpenType 字体
OpenType 字体
可以缩放,保持字母形状。.
点阵字体
点阵字体
放大时呈锯齿状,不可缩放。.
OpenType 字体均为轮廓字体。轮廓字体可被缩放成各种尺寸且形状保持不变(不同于位图字体,特定于某个尺寸和分辨率,尺寸变大时,可能呈锯齿状)。


OpenType 与 TrueType 一样,基于 Unicode,该系统是用于全球所有书写系统的编码方式。OpenType 字体可能包含数千个字符。这就是说,一个 OpenType 字体可能包含多个字母表(比如拉丁语、希腊语和西里尔字母;或供日语使用的汉字、假名及罗马字)。OpenType 字体还可能包含字型排印优化,如真小型大写字母、各种不同的数字样式和丰富多样的连字符和替换符,以及齐备的重音符及变音符。不同应用程序对所有 OpenType 功能的支持等级也有所不同。
========

WindowsAPI学习笔记三 - 字体设置与输出

http://www.cppblog.com/sunshinealike/archive/2009/03/11/76242.html
Windows 系统中经常使用 GDI 进行文本输出,从某种意义上来说,图形和文本并没有本质上的界限,很多时候 windows 把文本也当作图形对待。在 windows 编程中,文本操作首先要获得文本句柄,此外,还要设置字体,字符大小,字符颜色等有关属性,并将它们选入设备环境。 

Ÿ           设置文本的设备环境
1.         自定义字体 
可以使用函数 CreateFont 自定义字体
HFONT hFont = HFONT CreateFont(
  int nHeight,  int nWidth,                 // 字体高,宽
  int nEscapement,           // 文字相对于页底的角度
  int nOrientation,        // 每个文字相对于页底的角度
  int fnWeight,         // 字体粗细,范围 0~1000 , 400 为正常字体, 700 为黑体
  DWORD fdwItalic,           // 取非零值则为斜体
  DWORD fdwUnderline,        // 取非零值则下划线
  DWORD fdwStrikeOut,        // 取非零值则中划线
  DWORD fdwCharSet,          // 字体所属字符集
  DWORD fdwOutputPrecision,  // 输出精度(一般取默认值)
  DWORD fdwClipPrecision,    // 剪裁精度(一般取默认值)
  DWORD fdwQuality,          // 输出质量(一般取默认值)
  DWORD fdwPitchAndFamily,   // 字体间距及字体系列(一般取默认值)
  LPCTSTR lpszFace           // 字体名
);
一般情况下使用系统默认提供的字体就可以了。
2.         字体句柄 
windows 系统提供了七种基本字体: 
ANSI_FIXED_FONT , DEFAULT_GUI_FONT , ANSI_VAR_FONT
DEVICE_DEFAULT_FONT , SYSTEM_FIXED_FONT , 
SYSTEM_FONT (系统默认字体) 
调用函数 GetStockObject ()即可获得系统默认字体 
获得字体之后,有时候还需要设置字体颜色和背景色,可以使用下面两个函数: 
SetTextColor          // 设置字体颜色 
SetBkColor            // 设置背景颜色
 
Ÿ           文本输出过程 
设置了字体句柄,字体及字体颜色之后就可以把设置字体输入到相应的设备上。 Windows 系统在文本输出上有点小小的偷懒,把很多事情都丢给了程序员来做,应用程序必须自己管理换行,后续字符的位置等输出格式。虽提供了编程的自由,但是程序员的工作量也变的非常大。
文本输出过程包括获取字体信息,格式化文本,调用函数输出文本等过程。
1.         获取字体信息 
应用程序在输出字体之前必须先获取当前字体的有关信息,在 windows 程序中通过调用 GetTextMetrics 函数来获取当前字体的信息。其形式为: 
GetTextMetrics(hdc, &tm);          //tm 为 TEXTMETRIC 结构 
TEXTMETRIC 结构也非常复杂,其结构定义如下:
typedef struct tagTEXTMETRIC {
  LONG tmHeight;
  LONG tmAscent;
  LONG tmDescent;
  LONG tmInternalLeading;
  LONG tmExternalLeading;
  LONG tmAveCharWidth;
  LONG tmMaxCharWidth;
  LONG tmWeight;
  LONG tmOverhang;
  LONG tmDigitizedAspectX;
  LONG tmDigitizedAspectY;
  TCHAR tmFirstChar;
  TCHAR tmLastChar;
  TCHAR tmDefaultChar;
  TCHAR tmBreakChar;
  BYTE tmItalic;
  BYTE tmUnderlined;
  BYTE tmStruckOut;
  BYTE tmPitchAndFamily;
  BYTE tmCharSet;
} TEXTMETRIC, *PTEXTMETRIC;
具体各属性不解释,需要时可以查询 MSDN 。
2.         格式化文本 
格式化处理一般针对两种情况,一是文本行中确定后续文本的坐标,二是在换行时确定下一行的坐标。
(1)      确定后续文本坐标
应先获取当前字符的宽度,通过计算字符串起始坐标与字符串宽度之和即可得到后续文本的起始坐标。 
这里要使用到函数: 
BOOL GetTextExtentPoint32
(
       HDC hdc,
       LPCTSTR lpsxString,    // 指定的字符串
       int nLength,                  // 字符串中字符数
       LPSIZE lpSize        // 字符串宽度及高度的 SIZE 数据结构
)
(2)      确定换行时文本坐标 
通过计算当前文本行字符的高度与行间隔之和,即可得到换行时文本的起始坐标,而上述两个数值均可通过获取当前字体信息得到。
3.         文本输出
最常用的文本输出函数就是 TextOut ,其原型如下: 
BOOL TextOut
(
       HDC hdc,
       int x, int y,
       LPCTSTR lpString,
       int nCount
       )


Ÿ           文本操作实例
因为代码太长,全部贴出来页面不好看。故只给出WndProc函数的实现,程序其它部分可以参考以前的笔记。
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg,                          UINT wParam,                          LONG lParam){    HDC hdc;    HFONT hFont;    //字体句柄    PAINTSTRUCT ps;    TEXTMETRIC tm;    char lpszTx1[] = "红色的SYSTEM字体:好好学习,天天向上!";    char lpszTx2[] = "绿色自定义字体:保护眼睛,注意休息!";    char lpszTx3[] = "蓝色大号斜体并带有下划线!";    char lpszTx4[] = "两行文本输出到同一行里!";    char lpszTx5[] = "今天的学习就到这里,祝你成功!";    int x = 0, y = 0;    SIZE size;    switch(iMsg)    {    case WM_PAINT:            hdc = BeginPaint(hWnd, &ps);            SetTextColor(hdc, RGB(255, 0, 0));//文本为红色            TextOut(hdc, x, y, lpszTx1, strlen(lpszTx1));//字体输出            GetTextMetrics(hdc, &tm);    //获取系统当前字体            y = y + tm.tmHeight + tm.tmExternalLeading;//计算下一行坐标            hFont = CreateFont                        (                            20,0,    //高度20, 宽取0表示由系统选择最佳值                            0, 0,    //文本倾斜,与字体倾斜都为0                            FW_HEAVY,    //粗体                            0,0,0,        //非斜体,无下划线,无中划线                            GB2312_CHARSET,    //字符集                            OUT_DEFAULT_PRECIS,                                    CLIP_DEFAULT_PRECIS,                                    DEFAULT_QUALITY,        //一系列的默认值                            DEFAULT_PITCH | FF_DONTCARE,                                "自定义字体"    //字体名称                        );            SetTextColor(hdc, RGB(0, 255, 0));            SelectObject(hdc, hFont);            TextOut(hdc, x, y, lpszTx2, strlen(lpszTx2));            GetTextMetrics(hdc, &tm);    //将当前字体信息选入tm结构中            y = y + tm.tmHeight + 15 * tm.tmExternalLeading;//5倍行间距            hFont = CreateFont                        (                            40,0,    //高度40, 宽取0表示由系统选择最佳值                            0, 0,    //文本倾斜,与字体倾斜都为0                            FW_NORMAL,                                1,1,0,        //斜体,下划线,无中划线                            GB2312_CHARSET,    //字符集                            OUT_DEFAULT_PRECIS,                                CLIP_DEFAULT_PRECIS,                                DEFAULT_QUALITY,        //一系列的默认值                            DEFAULT_PITCH | FF_DONTCARE,                                "大号字体"    //字体名称                        );            SetTextColor(hdc, RGB(0, 0, 255));            SetBkColor(hdc, RGB(160, 160, 160));//设置背景颜色            SelectObject(hdc, hFont);            TextOut(hdc, x, y, lpszTx3, strlen(lpszTx3));            //获取系统提供的字体            hFont = (HFONT)GetStockObject(SYSTEM_FIXED_FONT);            y = y + tm.tmHeight + 25 * tm.tmExternalLeading;            SetTextColor(hdc, RGB(0, 0, 0));            SetBkColor(hdc, RGB(255, 255, 255));            SelectObject(hdc, hFont);            TextOut(hdc, x, y, lpszTx4, strlen(lpszTx4));            GetTextExtentPoint32(hdc, lpszTx4, strlen(lpszTx4), &size);//计算高宽            x = x + size.cx;            TextOut(hdc, x , y ,lpszTx5, strlen(lpszTx5));            EndPaint(hWnd, &ps);            DeleteObject(hFont);            break;    case WM_DESTROY:        PostQuitMessage(0);        break;    default:        return DefWindowProc(hWnd, iMsg, wParam, lParam);    }    return 0;}


========

Windows CreateFont:创建自己的字体


http://c.biancheng.net/cpp/html/2964.html
 
前面无论是使用文本输出函数还是 static 控件,字体都是默认的,比较丑陋,我们完全可以自己创建更加炫酷的字体。


创建字体使用 CreateFont 函数,它的原型是:
HFONT CreateFont(
    int cHeight,  //字体的逻辑高度
    int cWidth,  //字体的逻辑宽度
    int cEscapement,  //指定移位向量相对X轴的偏转角度
    int cOrientation,  //指定字符基线相对X轴的偏转角度
    int cWeight,  //设置字体粗细程度
    DWORD bItalic,  //是否启用斜体
    DWORD bUnderline,  //是否启用下划线
    DWORD bStrikeOut,  //是否启用删除线
    DWORD iCharSet,  //指定字符集
    DWORD iOutPrecision,  //输出精度
    DWORD iClipPrecision,  //剪裁精度
    DWORD iQuality,  //输出质量
    DWORD iPitchAndFamily,  //字体族
    LPCSTR pszFaceName  //字体名
);
上面的14个参数完全记住几乎不可能,下面是简单的说明,其他的“照猫画虎”即可。


1) 参数 cWidth 和 cHeight 通常取负值,且高度为宽度的2倍,如 -18 和 -9,即可指定 13.5 |(H+W)/2| 磅的字体。


2) 对于字体粗细程度 cWeight,可以使用 FW_ 开头的宏定义;一般取 FW_NORMAL (400),此参数需要值的值域为 [0,1000]。


3) 对于参数 bItalic、bUnderline、bStrikeOut,直接使用 TRUE 或 FALSE 传值即可。


4) 对于字符集 iCharSet,一般可以直接使用 DEFAULT_CHARSET 让系统自动处理。
注意:字体也是一种 GDI 对象,使用完后也要在 WM_DESTROY 消息中删除。
创建完字体后并不能立即使用,还需要手动触发 WM_SETFONT 消息,让Windows 将当前字体设置为我们创建的字体。


发送消息使用 SendMessage 函数,它可以让我们在必要时主动向窗口发送各种消息,原型为:
LRESULT SendMessage(
    HWND hWnd,  //发送消息的目标窗口句柄
    UINT msg,  //将要发送的消息
    WPARAM wParam,  //附加消息1
    LPARAM lParam  //附加消息2
);
这些参数和 WndProc 函数非常类似。没错,SendMessage 发送的消息就是由窗口过程来处理的。


设置字体的消息是 WM_SETFONT,只要向附加参数 wParam 传入 CreateFont 返回的句柄即可(需要转换到 WPARAM 类型)。请看下面的例子:
//窗口过程
LRESULT CALLBACK WndProc(
    HWND hWnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam
){
    PAINTSTRUCT ps;
    HDC hdc;
    static HFONT hFont; //声明一个逻辑字体句柄为静态变量
    static HWND labExample; //在初期,我们将其声明为静态变量
    switch (message){
        case  WM_CREATE:
            //创建逻辑字体
            hFont = CreateFont(
                -15/*高度*/, -7.5/*宽度*/, 0/*不用管*/, 0/*不用管*/, 400 /*一般这个值设为400*/,
                FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,
                DEFAULT_CHARSET,  //这里我们使用默认字符集,还有其他以 _CHARSET 结尾的常量可用
                OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,  //这行参数不用管
                DEFAULT_QUALITY,  //默认输出质量
                FF_DONTCARE,  //不指定字体族*/
                L"微软雅黑"  //字体名
            );
            //创建静态文本框控件
            labExample = CreateWindow(
                L"static",  //静态文本框的类名
                L"你好,欢迎来到C语言中文网" ,  //控件的文本
                WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/,
                60 /*X坐标*/, 60/*Y坐标*/, 150/*宽度*/, 100/*高度*/, hWnd/*父窗口句柄*/,
                (HMENU)1,  //为控件指定一个唯一标识符
                hInst,  //当前实例句柄
                NULL
            );
            //设置控件字体
            SendMessage(
                labExample,  //欲设置字体的控件句柄
                WM_SETFONT,  //消息名(消息类型)
                (WPARAM)hFont,  //字体句柄
                NULL  //传空值即可
            );
            break;
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO:  在此添加任意绘图代码...
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            //请做好善后工作
            DeleteObject(hFont);//删除创建的字体
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
运行效果:


如上设置字体的方法几乎适用于所有的 Win32 标准控件。
========

Win32自定义字体

http://blog.csdn.net/zsc2014030403015/article/details/49154315


//自定义字体  
        {  
             HFONT hFont;    //字体句柄  
             hFont = CreateFont  
                        (  
                            50,20,    //高度20, 宽取0表示由系统选择最佳值  
                            0, 0,    //文本倾斜,与字体倾斜都为0  
                            FW_HEAVY,    //粗体  
                            0,0,0,        //非斜体,无下划线,无中划线  
                            GB2312_CHARSET,    //字符集  
                            OUT_DEFAULT_PRECIS,          
                            CLIP_DEFAULT_PRECIS,          
                            DEFAULT_QUALITY,        //一系列的默认值  
                            DEFAULT_PITCH | FF_DONTCARE,      
                            (TCHAR*)"华文细黑"    //字体名称  
                        );  
             SelectObject(hdc, hFont);  
        } 
========

Win32API-使用自定义字体

http://blog.sina.com.cn/s/blog_46c569b30100ftko.html


使用自定义字体,并给控件设置相应的字体。
 
//----------------------变量定义
 LOGFONT logFont;
 HFONT hFont;
 HDC hdc;
//----------------------在处理WM_CREATE期间,先画控件然后使用自定义字体  
  hdc = GetDC(hwnd);
  logFont.lfHeight = MulDiv(13, GetDeviceCaps(hdc, LOGPIXELSY), 72);//13是字号大小
  ReleaseDC(hwnd, hdc);
  logFont.lfWidth = 0;
  logFont.lfEscapement = 0;
  logFont.lfOrientation = 0;
  logFont.lfWeight = FW_REGULAR;
  logFont.lfItalic = 0;
  logFont.lfUnderline = 0;
  logFont.lfStrikeOut = 0;
  logFont.lfCharSet = GB2312_CHARSET;
  logFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
  logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  logFont.lfQuality = PROOF_QUALITY;
  logFont.lfPitchAndFamily = VARIABLE_PITCH  | FF_ROMAN;
  strcpy(logFont.lfFaceName, "华文细黑"); 
  hFont = CreateFontIndirect(&logFont);
//---------------------------发送WM_SETFONT消息给控件
  SendMessage(hwndInput, WM_SETFONT, (WPARAM)hFont, TRUE);
========
原创粉丝点击