作者: zzllvlv
查看: 2067|回复: 0
打印 上一主题 下一主题

[求助] 关于GetGlyphOutline()方法调用的问题

[复制链接]
跳转到指定楼层
楼主
zzllvlv 发表于 2017-6-10 12:39:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
查看: 2067|回复: 0

我想做一个获取字符位图数据的工具,想用C#调用windows API的GetGlyphOutline()方法,代码如下:
//定义字体
Font font = new Font("宋体", 16);
char c = 'a';
//初始化字符信息结构
GLYPHMETRICS metrics = new GLYPHMETRICS();
//设置变换矩阵
MAT2 matrix = new MAT2();

matrix.eM11.value = 1;
matrix.eM12.value = 0;
matrix.eM21.value = 0;
matrix.eM22.value = 1;
//获得环境句柄
IntPtr hdc = g.GetHdc();
//设置GGO_BitMap参数并第一次调用函数,获得字符需要的缓存大小
int bufferSize = (int)GetGlyphOutline(hdc, (uint)c, (uint)1, out metrics, 0, IntPtr.Zero, ref matrix);
//根据获得的缓存大小请求缓存

IntPtr buffer = Marshal.AllocHGlobal((int)bufferSize);
//第二次调用函数,获得字符缓存
int ret = GdiNativeMethods.GetGlyphOutline(hdc, (uint)c, (uint)1, out metrics, (uint)bufferSize, buffer, ref matrix);

我在测试过程中,发现编译器总是提示IntPtr buffer = Marshal.AllocHGlobal((int)bufferSize);需要足够的缓存大小,检查后发现如果把bufferSize值设置为uint,则该值非常大,所以导致该值设置为int值后变成了-1。我想是不是因为值太大,溢出了int的取值范围。将该值设置为uint后,编译器又提示uint值不能转换为system.intprt类型,请问怎么办?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播
回复 论坛版权

使用道具 举报

您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2024-5-8 21:20, Processed in 0.683145 second(s), 31 queries , Gzip On.

快速回复 返回顶部 返回列表