win32 GDI知识字体相关

常分为三种字体

  • 点阵字体:用得很少
  • 笔画字体:
  • 矢量字体

HFONT 字体句柄

//使用系统默认的字体
GetStockObject( _In_ int i);

GetStockObject函数参数

参数 说明
WHITE_BRUSH 白色画刷
LTGRAY_BRUSH 亮灰色画刷
GRAY_BRUSH 灰色画刷
DKGRAY_BRUSH 暗灰色画刷
BLACK_BRUSH 黑色画刷
NULL_BRUSH 空画刷
HOLLOW_BRUSH 空画刷(相当于NULL_BRUSH)
WHITE_PEN 黑色画笔
BLACK_PEN 白色画笔
NULL_PEN 无画笔
OEM_FIXED_FONT 原始设备制造商字体
ANSI_FIXED_FONT 在Windows中为固定间距(等宽)系统字体
ANSI_VAR_FONT 在Windows中为变间距(比例间距)系统字体
SYSTEM_FONT 系统字体
DEVICE_DEFAULT_FONT 在WindowsNT中为设备相关字体
DEFAULT_PALETTE 缺省调色板,该调色板由系统调色板中的静态色彩组成
SYSTEM_FIXED_FONT 固定间距(等宽)系统字体,该对象仅提供给兼容16位Windows版本

自定义字体

//自定义字体
CreateFont(_In_ int cHeight,           //指定字体的字符单元或字符的逻辑单位高度
           _In_ int cWidth,            //指定所要求字体的字符的逻辑单位的平均宽度
           _In_ int cEscapement,       //
           _In_ int cOrientation,      //指定每个字符的基线和设备X轴之间的角度
           _In_ int cWeight,           //在0到1000之间指定字体的权值
           _In_ DWORD bItalic,         //如果设置为TRUE,则字体设置为斜体
           _In_ DWORD bUnderline,      //如果设置为TRUE,则字体增加下划线
           _In_ DWORD bStrikeOut,      //如果设置为TRUE,则字体增加删除线
           _In_ DWORD iCharSet,        //指定字符集,下列值是预定义的
           _In_ DWORD iOutPrecision,   //指定输出精度,输出精度义输出与要求的字体高度、宽度、字符定位、移位、字符间距和字符类型的匹配程序
           _In_ DWORD iClipPrecision,  //指定裁剪精度,裁剪精度定义如何裁剪部分超出裁剪区的字符,它可取一个或多个下列值
           _In_ DWORD iQuality,        //指向输出质量
           _In_ DWORD iPitchAndFamily, //指定字体间距和字体族,低端二位指定字体的字符间距
           _In_opt_ LPCSTR pszFaceName);//向指定字体的字样名的、以\0结束的字符串指针,字符串的长度不能超过32个字符

创建字体各个参数说明

  1. cHeight:指定字体的字符单元或字符的逻辑单位高度,字符的高度值(也被称为em高度)是指字符单元高度值减去内部标头值。字体映射器以如下方式解释nHeight指定的值,各值含义为:

    >0:字体映射器转换这个值以设备单位,并和已有字体的单元高度相匹配。

    0:字体映射器转换在选择匹配时用一个缺省的高度值。

    <0:字体映射器转换这个值到设备单位,并将它的绝对值和已有字体的字符高度相匹配。

    比较所有的高度,字体映射器选择不超过要求大小的最大字体。

    此映射当字体第一次被使用时发生。

    对于MM_TEXT映射方式,可以用下面的公式为一种指定了点大小的字体确定高度:

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

  2. cWidth:指定所要求字体的字符的逻辑单位的平均宽度。如果此值为0,字体映射器选择一个closest match值,closest match值是由比较当前设备的特征系数与可使用字体的数字化特征系数之差的绝对值而确定的。

  3. cEscapement:指定移位向量和设备X轴之间的一个角度,以十分之一度为单位。移位向量平行于正文行的基线。

    Windows NT:当图形设备设置为GM_ADVANCED时,可以不依赖字符串的字符的定位角而指定字符串的移位角。

    当图形模式被设置为GM_COMPATIBLE时,nEscapement同时指定移位角和定位角,可以设置nEscapement和nOrientation为相同的值。

  4. cOrientation:指定每个字符的基线和设备X轴之间的角度。

  5. cWeight:在0到1000之间指定字体的权值,如400表示标准体,700表示黑(粗)体,如果此值为0,则使用缺省的权值。

    以下为权值说明

    描述 说明
    FW_DONTCARE 0
    FW_THIN 100
    FW_EXTRALIGHT 200
    FW_ULTRALIGHT 200
    FW_LIGHT 300
    FW_NORMAL 400
    FW_MEDIUM 500
    FW_SEMIBOLD 600
    FW_DEMIBOLD 600
    FW_BOLD 700
    FW_EXTRABOLD 800
    FW_HEAVY 900
  6. bItalic:如果设置为TRUE,则字体设置为斜体。

  7. bUnderline:如果设置为TRUE,则字体增加下划线。

  8. bStrikeOut:如果设置为TRUE,则字体增加删除线。

  9. iCharSet:指定字符集,下列值是预定义的:

    ANSI_CHARSET; BALTIC_CHARSET; CHINESEBIG5_CHARSET; DEFAULT_CHARSET;

    EASTEUROPE_CHARSET; GB2312_CHARSET; GREEK_CHARSET; HANGUL_CHARSET; MAC_CHARSET; OEM_CHARSET; RUSSIAN_CHARSET; SHIFTJIS_CHARSET;

    SYMBOL_CHARSET; TURKISH_CHARSET。

    韩国Windows:JOHAB_CHARSET;

    中东地区Windows:HEBREW_CHARSSET; ARABIC_CHARSET

    泰国Windows:THAI_CHARSET

    OEM_CHARSET指定的字符集与操作系统有关。

    可以使用DEFAULT_CHARSET值来允许字体的名字和大小来充分描述逻辑字体。如果指定的字体名不存在,任何字符集的字体都可以替代指定的字体,所以应该小心地用DEFAULT_CHARSET来避免不期望的结果出现。

    操作系统中存在其他字符集的字体。如果一个应用程序用一种未知字符集的字体,则应用程序不会试图去翻译或解释用那种字体写出来的字符串。

    在字体映射过程中此参数很重要。为确保获得一致的结果,指定一个特殊的字符集。如果在lpszFace参数中指定了一个字体名,确定fdwCharSet值与由lpszFace指定的字体字符集是否匹配。

  10. iOutPrecision:指定输出精度,输出精度义输出与要求的字体高度、宽度、字符定位、移位、字符间距和字符类型的匹配程序,它可取下列值之一:

    精度值 说明
    OUT_CHARACTER_PRECIS 未用
    OUT_DEFAULT_PRECIS 指定缺省的字体映射器状态
    OUT_DEVICE_PRECIS 指示字体映射器在当系统里有多种字体使用同一个字体使用同一个名字时选择一种设备字体
    OUT_OUTLINE_PRCIS 在Windows NT中此值指示字体映射器从TrueType和其他基于边框的字体中选择
    OUT_RASTER_PRECIS 指示字体映射器在当系统里有多种字体使用同一个名字时选择一种光栅字体
    OUT_STRING_PRECIS 此值没有被字全映射器使用,但是当扫描字体被列举时作为返回值
    OUT_STROKE_PRECIS 在Windows NT中此值没有被字体映射器使用,但是当TrueType字体、其他基于边框的字体和向量字体被列举时,作为返回值
    Windows 95 此值没有被字体映射器使用,但是当TrueType字体或向量字体被列举时,作为返回值。
    OUT_TT_ONLY_PRECIS 指示字体映射器仅从TrueType字体中选择,如果系统中没有安装TrueType字体,则字体映射返回缺省状态
    OUT_TT_PRECIS 指示字体映射器在当系统里有多种同名的字体时选择一种TrueType字体

    当操作系统含有多种与指定名字同名的字体时,应用程序可以使用OUT_DEVICE_PRECIS,OUT_RASTER_PRECIS和OUT_TT_PRECIS值来控制字体映射器如何选择一种字体,例如,如果操作系统含有名字Symbol的光栅和TrueType两种字体,指定OUT_TT_PRECIS使字体映射器选择TrueType方式。指定OUT_TT_ONLY_PRECIS使字体映射器选择一种TrueType字体,尽管这会给TrueType字体换一个名字。

  11. iClipPrecision:指定裁剪精度,裁剪精度定义如何裁剪部分超出裁剪区的字符,它可取一个或多个下列值

    说明
    CLIP_DEFAULT_PRECIS 指定缺省裁剪状态
    CLIP_CHARACTER_PRECIS 未用
    CLIP_STROKE_PRECIS 未被字体映射器使用,但是当[光栅字体、向量字体或TrueType字体被列举时作为返回值。在Windows环境下,为保证兼容性,当列举字体时这个值总被返回
    CLIP_MASK 未用
    CLIP_EMBEDDED 要使用嵌入式只读字体必须使用此标志
    CLIP_LH_ANGLES 当此值被使用时,所有字体的旋转依赖于坐标系统的定位是朝左的还是朝右的
    CLIP_TT_ALWAYS 未用

    如果未使用此值CLIP_LH_ANGLES,设备字体总是逆时针方向旋转,但其他字体的旋转依赖于坐标系统的定向。要得到更多关于坐标系统定向的信息,参见参数orientation。

  12. iQuality:指向输出质量,输出质量定义GDI如何仔细地将逻辑字体属性与实际物理字体属性相匹配。它可取下列值之一

    说明
    DEFAULT_QUALITY 字体的外观不重要
    DRAFT_QUALITY 字体外观的重要性次于使用PROOF_QUALITY时,对GDI光栅字体,缩放比例是活动的,这意味着多种字体大小可供选择,但质量可能不高,如果有必要,粗体、斜体、下划线、strikeout字体可被综合起来使用。
    PROOF_QUALITY 字符质量比精确匹配逻辑字体字体属性更重要。对GDI扫描字体,缩放比例是活动的,并选择最接近的大小。尽管当使用PROOF_QUALITY时,选择字体大小并不完全匹配,但字体的质量很高,并没有外观上的变形。如果有必要,粗体、斜体、下划线、strikeout字体可被综合起来使用。
  13. iPitchAndFamily:指定字体间距和字体族,

    低端二位指定字体的字符间距,它可取下列值之一

    低端二位指定字体的字符间距 说明
    DEFAULT_PITCH
    FIXED_PITCH
    VARIABLE_PITCH

    高端四位指定字体族,可取下列值之一

    说明
    FF_DECORATIVE 新奇的字体,如老式英语(Old English)
    FF_DONTCARE 不关心或不知道
    FF_MODERN 笔划宽度固定的字体,有或者无衬线。如Pica、Elite和Courier New
    FF_ROMAN 笔划宽度变动的字体,有衬线。如MS Serif
    FF_SCRIPT 设计成看上去象手写体的字体。如Script和Cursive
    FF_SWISS 笔划宽度变动的字体,无斜线。如MS Sans Serif

    应用程序可以用运算符OR将字符间距和字体族组合起来给fdwPitchAndFamily赋值。

    字体族描述一种字体的普通外观,当所有的精确字样都不能使用时,可用它们来指定字体。

  14. pszFaceName:指向指定字体的字样名的、以\0结束的字符串指针,字符串的长度不能超过32个字符(包括字符\0),函数EnumFontFamilies可用来列举所有当前可用字体的字样名。

    如果lpszFace为NULL或指向一个空串,GDI使用能匹配其他属性的第一种字体。

    返回值:如果函数调用成功,返回值是一种逻辑字体句柄;如果函数调用失败,返回值为NULL。

    Windows NT:若想获得更多错误信息,请调用GetLastError函数。

字体的输出

//字体输出函数
TextOut( _In_ HDC hdc,                  //设备环境句柄
         _In_ int x,                    //字体输出的起始点X坐标
         _In_ int y,                    //字体输出的起始点Y坐标
         _In_reads_(c) LPCSTR lpString, //输出的字符串
         _In_ int c);                   //输出的字符串长度

//区域中显示文字
int DrawText(
             HDC hDC,          // 设备描述表句柄
             LPCTSTR lpString, // 将要绘制的字符串
             int nCount,       // 字符串的长度
             LPRECT lpRect,    // 指向矩形结构RECT的指针
             UINT uFormat      // 正文的绘制选项
			 );

//修改文字显示区域的对齐方式
UINT SetTextAlign(
				  HDC hdc,    // 设备环境句柄
				  UINT fMode);// 文本对齐选项

//设置文字颜色
COLORREF SetTextColor(
					  _In_ HDC      hdc,      // 设备环境句柄
					  _In_ COLORREF crColor); //要设置的颜色,可以使用RGB宏根据红绿蓝分量合成颜色值

SetTextAlign函数第二个参数如下

说明
TA_BASELINE 基准点在正文的基线上。
TA_BOTTOM 基准点在限定矩形的下边界上。
TA_TOP 基准点在限定矩形的上边界上。
TA_CENTER 基准点与限定矩形的中心水平对齐。
TA_LEFT 基准点在限定矩形的左边界上。
TA_RIGHT 基准点在限定矩形的右边界上。
TA_RTLREADING 对于中东Windows版,正文从右到左的阅读顺序排列,与缺省的从左到右正好相反。
TA_NOUPDATECP 只有当被选择的字体是Hebrew或Arabic时,此值才有用。每次文字输出调用后当前基准点不改变。基准点是传输给正文输出函数的位置。
TA_UPDATECP 每次文字输出调用后当前基准点改变。当前位置作为基准点。
VTA_BASELINE 准点在正文的基线上。
VTA_CENTER 基准点与限定矩形的中心垂直对齐。

缺省值是TA_LEFT, TA_TOP和TA_NOUPDATECP。

如果函数调用成功,返回值是文字对齐方式的前一个设置;

如果函数调用失败,返回值是GDI_ERROR。

Windows NT:若想获得更多错误信息,请调用GetLastError函数。

代码演示如下

//WndProc消息处理函数中
switch (message)
{
    //鼠标的左键按下
    case WM_LBUTTONDOWN: 
    {
        hdc = GetDC(hWnd);
        //字体句柄
        HFONT hfont = nullptr;
        //使用系统默认字体
        hfont = (HFONT)GetStockObject(OEM_FIXED_FONT);
        //自己创建字体
        hfont = CreateFont(40,     //字体高度
        				   0,      //字体宽度,如果给出了高度,宽度给0,自动匹配宽高
                           1800,   //文字的倾斜角度 10就表示1度
                           0,      //基线的倾斜角度
                           900,    //笔画的粗细,400以下为细体,700以上为粗体
                           true,   //true表示斜体
                           true,   //true表示有下划线
                           true,   //true表示有水平删除线
                           GB2312_CHARSET,     //设置字符集
                           0,
                           0,
                           0,
                           0,
                           _T("楷体"));   //字样名,需要在字符集中有才能设定
        //锚点默认在左上角
        //没修改前hdc上的所有文字显示都会以左上角为锚点
        //修改文字显示区域的对齐方式
        SetTextAlign(hdc,TA_BOTTOM|TA_RIGHT);
        //修改后hdc上的所有文字显示都会以右下角为锚点
        //设置文字的颜色
        SetTextColor(hdc,RGB(255,0,0));
        
        //字符串信息窗口0,0位置输出
        TextOut(hdc,0,0,_T("abcd"),_tcslen(_T("abcd")));
        ReleaseDC(hWnd,hdc);
    }
        break;
}

设置背景相关

setbkcolor(),该函数用指定的颜色值来设置当前的背景色,如果指定的颜色值超出了当前设备的表示范围,则设置为最近似的、设备可以表示的颜色。

SetBKMode();设置指定DC的背景混合模式,背景混合模式用于与文本,填充画刷和当画笔不是实线时。

//设置背景颜色
COLORREF SetBkColor(HDC hdc,         // 设备环境句柄
                    COLORREF color); // 要设置的背景颜色

//设置背景模式
int SetBkMode(_In_ HDC hdc,      // 设备环境句柄
              _In_ int iBkMode); // 要设置的模式,
//模式其值可以为 OPAQUE 或 TRANSPARENT
//OPAQUE方式是用当前背景的画刷的颜色输出显示文字的背景
//TRANSPARENT是使用透明的输出,也就是文字的背景是不改变的。

代码演示

//WndProc消息处理函数中
switch (message)
{
    //鼠标的左键按下
    case WM_LBUTTONDOWN: 
    {
        hdc = GetDC(hWnd);
        //字体句柄
        HFONT hfont = nullptr;
        //自己创建字体
        hfont = CreateFont(40,     //字体高度
        				   0,      //字体宽度,如果给出了高度,宽度给0,自动匹配宽高
                           1800,   //文字的倾斜角度 10就表示1度
                           0,      //基线的倾斜角度
                           900,    //笔画的粗细,400以下为细体,700以上为粗体
                           true,   //true表示斜体
                           true,   //true表示有下划线
                           true,   //true表示有水平删除线
                           GB2312_CHARSET,     //设置字符集
                           0,
                           0,
                           0,
                           0,
                           _T("楷体"));   //字样名,需要在字符集中有才能设定
        //设置文字颜色
        SetTextColor(hdc,RGB(255,0,0));
        //设置背景颜色
        SetBkColor(hdc,RGB(255,255,0));
        //设置文字背景模式 
        //OPAQUE,系统默认,用自身背景色来填充整个背景,TRANSPARENT为透明模式
        SetBkMode(hdc,TRANSPARENT);
        //字符串信息窗口0,0位置输出
        TextOut(hdc,0,0,_T("abcd"),_tcslen(_T("abcd")));
        ReleaseDC(hWnd,hdc);
    }
        break;
}
原创文章 38 获赞 9 访问量 4517

猜你喜欢

转载自blog.csdn.net/Limit_Fly/article/details/105803497