• 文本和客户区的尺寸(3)


    TextOut 函数

    TextOut 函数是在客户区指定位置显示文本的 GDI 函数,它的原型如下:

    BOOL TextOut(
      HDC hdc,           // 设备环境句柄
      int nXStart,       // 开始位置的 x 坐标
      int nYStart,       // 开始位置的 y 坐标
      LPCTSTR lpString,  // 要显示的字符串
      int cbString       // 要显示字符个数(如果是 Unicode 字符则为原本的两倍)
    );

    文本的尺寸

    1、TEXTMETRIC 结构用于存放字符尺寸的各种值,最常用的有 7 个值:

    typedef struct tagTEXTMETRIC { 
      LONG tmHeight;          // 字符高度(tmAscent 与 tmDescent)之和
      LONG tmAscent;          // 基线之上的最大高度
      LONG tmDescent;         // 基线之下的最大高度
      LONG tmInternalLeading; // 内部间距(包含于 tmAscent 之中,通常为了显示重音符号)
      LONG tmExternalLeading; // 外部间距,行间距
      LONG tmAveCharWidth;    // 小写字符的加权平均宽度
      LONG tmMaxCharWidth;    // 最宽的字符的宽度
      // 其他字段
    } TEXTMETRIC, *PTEXTMETRIC;

    2、GetTextMetrics 函数用于获取字体的尺寸,它的第一个参数是当前的设备环境句柄,第二个参数是要填充的 TEXTMETRIC 结构的地址:

    BOOL GetTextMetrics(
      HDC hdc,            // 当前设备环境句柄
      LPTEXTMETRIC lptm   // 要填充的 TEXTMETRIC 结构的地址
    );

    Windows 运行时,系统字体不会变化。所以程序只需要调用一次 GetSystemMetrics 函数(最好在处理 WM_CREATE 消息的时候)

    获取系统字体的宽度和高度的示例代码:

    // ......
    // cxChar 为平均字符宽度,cyChar 为字符总高度,cxCaps 为大写字符的平均宽度
    static int cxChar, cyChar, cxCaps;
    TEXTMETRIC tm;
    // ......
    case WM_CREATE:
        hdc = GetDC(hwnd);
    
        GetTextMetrics(hdc, &tm);
    
        cxChar = tm.tmAveCharWidth;
        // tmPitchAndFamily 字段的低位决定字体是否为等宽字体,1为变宽,0为等宽。变宽时 cxCaps 是 cxChar 的1.5倍,等宽时 cxCaps 等于 cxChar
    
        cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
        cyChar = tm.tmHeight + tm.tmExternalLeading;
    
        ReleaseDC(hwnd, hdc);
        return 0;
    // ......

    文本的对齐

    调用 SetTextAlign 函数可以指定显示文本使用的坐标从文本区域的何处开始计算,示例如下:

    // 指定坐标从文本区域的右上角开始计算
    SetTextAlign(hdc, TA_RIGHT | TA_TOP);

    客户区的尺寸

    当窗口大小发生变化时,Windows 会向窗口过程发送一条 WM_SIZE 消息,相应的 lParam 变量的低位字是客户区的宽度,高位字是客户区的高度。示例代码如下:

    // ......
    case WM_SIZE:
        cxClient = LOWORD(lParam); // 低位字为客户区宽度
        cyClient = HIWORD(lParam); // 高位字为客户区高度
        
        // WM_SIZE 消息响应代码
        
        return 0;
    // ......
  • 相关阅读:
    SQL注入
    mysq笔记
    白话内存管理(一):从开国大典说起
    【转载】光纤协议中 WWPN 编码规则及实例解析
    利用django打造自己的工作流平台(三):任务的批量分派和跟踪
    利用django打造自己的工作流平台(二):疫情统计系统
    利用django打造自己的工作流平台(一):从EXCEL到流程化运作
    驾驭git merge——git merge的规范化操作
    一款用于绘制状态机转换图和流程图的web在线绘图工具
    利用python+graphviz绘制数据结构关系图和指定目录下头文件包含关系图
  • 原文地址:https://www.cnblogs.com/yenyuloong/p/9076978.html
Copyright © 2020-2023  润新知