zoukankan      html  css  js  c++  java
  • 如何取得字符点阵数据(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。

  • 相关阅读:
    segmentation fault(core dumped)
    (LIS LCS 例题)Max Sum Advanced Fruits Super Jumping! Jumping! Jumping!
    几种数学公式(环排列 母函数 唯一分解定理 卡特兰数 默慈金数 贝尔数 那罗延数)
    map set 详解
    算法录 之 二分和三分
    LIS 最长上升子序列 LCS 最长公共子序列 模板
    JAVA 大数据 例题
    Java 实现大数算法
    7 21 第一次团队赛——————写给队友
    离散化+unique()+二分查找
  • 原文地址:https://www.cnblogs.com/94YY/p/2043505.html
Copyright © 2011-2022 走看看