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。

  • 相关阅读:
    Ackerman 函数奇怪的函数
    HDU2871 Memory Control 线段树区间合并
    HDU3667 Hotel 线段树 经典空间合并
    图论
    HDU3016 Man Down 线段树
    HDU1878 欧拉回路 判定是否存在欧拉回路
    从今开始
    如何打开注册表编辑器
    ASP.NET中TextBox控件设置ReadOnly="true"后台取不到值
    学习笔记(2011年5月到9月)
  • 原文地址:https://www.cnblogs.com/94YY/p/2043505.html
Copyright © 2011-2022 走看看