在 MFC(Microsoft Foundation Classes)中,CDC::GetGlyphOutline 方法用于检索与指定的 TrueType 字体中的指定字符关联的轮廓。

以下是 GetGlyphOutline 方法的签名和简要说明:
DWORD GetGlyphOutline(
   UINT nChar,
   UINT nFormat,
   LPGLYPHMETRICS lpgm,
   DWORD cbBuffer,
   LPVOID lpBuffer,
   const MAT2* lpmat2
) const;

参数说明:
  •  nChar:要检索轮廓的字符的 Unicode 编码。

  •  nFormat:指定输出的格式。可以是 GGO_BITMAP、GGO_GRAY2_BITMAP、GGO_GRAY4_BITMAP、GGO_GRAY8_BITMAP 等。

  •  lpgm:指向 GLYPHMETRICS 结构的指针,用于接收字符的度量信息。

  •  cbBuffer:lpBuffer 缓冲区的大小。

  •  lpBuffer:指向用于接收轮廓数据的缓冲区的指针。

  •  lpmat2:指向 MAT2 结构的指针,用于指定坐标变换。


返回值:
  •  如果函数成功,返回值表示实际的字节数。

  •  如果函数失败,则返回 GDI_ERROR。


使用示例:
CClientDC dc(this); // 假设 this 是一个窗口或控件的指针

CFont font;
font.CreateFont(
    -12,                      // 高度
    0,                        // 宽度
    0,                        // 角度
    0,                        // 方向
    FW_NORMAL,                // 字体粗细
    FALSE,                    // 斜体
    FALSE,                    // 下划线
    0,                        // 删除线
    ANSI_CHARSET,             // 字符集
    OUT_TT_ONLY_PRECIS,       // 输出精度
    CLIP_DEFAULT_PRECIS,      // 裁剪精度
    DEFAULT_QUALITY,          // 输出质量
    DEFAULT_PITCH | FF_DONTCARE, // 字间距和字体系列
    _T("Arial")               // 字体名称
);

CFont* pOldFont = dc.SelectObject(&font);

// 获取字符 'A' 的轮廓数据
UINT nChar = 'A';
DWORD cbBuffer = dc.GetGlyphOutline(nChar, GGO_NATIVE, NULL, 0, NULL, NULL);

if (cbBuffer != GDI_ERROR) {
    // 分配缓冲区
    BYTE* pBuffer = new BYTE[cbBuffer];

    // 获取实际轮廓数据
    DWORD dwActualSize = dc.GetGlyphOutline(nChar, GGO_NATIVE, NULL, cbBuffer, pBuffer, NULL);

    // 现在 pBuffer 包含了字符 'A' 的轮廓数据,可以根据需要使用它们

    delete[] pBuffer; // 不再需要时记得释放内存
}

dc.SelectObject(pOldFont); // 恢复原来的字体

这个方法通常用于在字体绘图中获取字符的轮廓数据,以便进行更高级的文本渲染或图形操作。


转载请注明出处:http://www.pingtaimeng.com/article/detail/17111/MFC/CDC