• 如何取得字符点阵数据(GetGlyphOutline函数简单应用)


    近日做的程式需要取得字符点阵数据的功能,研究了一下,费了点周折才成功,现将方法总结如下。

           取得字符点阵主要用GetGlyphOutline函数:

    DWORD GetGlyphOutline

    (

    UINT nChar,

    UINT nFormat,

    LPGLYPHMETRICS lpgm,

    DWORD cbBuffer,

    LPVOID lpBuffer,

    const MAT2 FAR* lpmat2

    )

    他需要类型为GLYPHMETRICS、MAT2的变量;MAT2 结构要手动填充, GLYPHMETRICS结构则由GetGlyphOutline填充;GLYPHMETRICS包含了点阵数据的一些有用的信息:

    typedef struct _GLYPHMETRICS {

        UINT    gmBlackBoxX;      //点阵数据轮廓矩形的宽

        UINT    gmBlackBoxY;     //点阵数据轮廓矩形的高

        POINT   gmptGlyphOrigin;       

        short   gmCellIncX;

        short   gmCellIncY;

    } GLYPHMETRICS, FAR *LPGLYPHMETRICS;

           GetGlyphOutline函数要调用两次,第一次调用将LPVOID lpBuffer指定为NULL,函数将返回点阵数据需要的缓冲区大小(以字节为单位),将他传给cbBuffer参数,并依此值申请内存,将内存指针传给lpBuffer,再次调用GetGlyphOutline函数,lpBuffer缓冲区将被填充。

    CClientDC DC(this);

    . . . . . .

    //获取本字符需要的缓冲区大小

    cbBuffer=DC.GetGlyphOutline(nChar,GGO_BITMAP,&lpgm,0,NULL,&mat2);

    if(cbBuffer <0 ) return NULL;      //调用失败将返回负数

    //开辟缓冲区

    lpvBuffer=new BYTE[cbBuffer];

    //填充字符图像缓冲区lpvBuffer

    cbBuffer=DC.GetGlyphOutline(nChar,GGO_BITMAP,&lpgm,cbBuffer,lpvBuffer,&mat2);

          

           lpBuffer缓冲区内的数据是DWORD对齐的,即假如取得点阵宽度是12位,只需要三个字节存放一行数据(一个位对应一个点),但实际要占用四个字节;再如,假如点阵宽度是17位,则一行数据占用8个字节。数据的提取方式因应用的不同而不同,再次不再赘述。

    注:以上只针对点阵数据提取,即UINT nFormat 的值是GGO_BITMAP,轮廓提取请参考MSDN。

  • 相关阅读:
    【Redis】集群NetCore实战
    【Redis】集群教程(Windows)
    【Redis】入门
    【SQL SERVER】索引
    【SQL SERVER】锁机制
    【SQL SERVER】数据内部存储结构简单探索
    Windows软件包管理工具
    Git常用命令记录
    【ASP.NET Core学习】远程过程调用
    CouchDB学习-API
  • 原文地址:https://www.cnblogs.com/94YY/p/2043505.html
Copyright © 2020-2023  润新知