【发布时间】:2013-05-17 23:35:04
【问题描述】:
我想在 .NET 应用程序中调用在 GDI+ 中找不到的 GDI 方法。
特别是this method,它获取指定字体的字距调整对。我想在目前不支持的 HTML5 画布上实现字距调整(字母间距),我认为最好的方法是在我的服务器上拉出字距调整对并将字距调整表返回给客户端。
您如何在 .NET 中使用这样的 Windows 库函数?
【问题讨论】:
标签: c# javascript .net gdi kerning
我想在 .NET 应用程序中调用在 GDI+ 中找不到的 GDI 方法。
特别是this method,它获取指定字体的字距调整对。我想在目前不支持的 HTML5 画布上实现字距调整(字母间距),我认为最好的方法是在我的服务器上拉出字距调整对并将字距调整表返回给客户端。
您如何在 .NET 中使用这样的 Windows 库函数?
【问题讨论】:
标签: c# javascript .net gdi kerning
你可以在Windows API找到这个方法来调用这个方法:
System.Runtime.InteropServices命名空间添加到您的项目中2 : 将API 类添加到您的项目中并让它使用GetKerningPairs 方法
请记住,这个函数使用了一个名为 KERNINGPAIR 的结构,我们需要确保它在我们的类中定义,否则我们会得到编译错误!
class API
{
[DllImport("gdi32.dll")]
static extern uint GetKerningPairs(IntPtr hdc, uint nNumPairs,
[Out] KERNINGPAIR[] lpkrnpair);
[StructLayout(LayoutKind.Sequential)]
struct KERNINGPAIR
{
public ushort wFirst; // might be better off defined as char
public ushort wSecond; // might be better off defined as char
public int iKernAmount;
public KERNINGPAIR(ushort wFirst, ushort wSecond, int iKernAmount)
{
this.wFirst = wFirst;
this.wSecond = wSecond;
this.iKernAmount = iKernAmount;
}
public override string ToString()
{
return (String.Format("{{First={0}, Second={1}, Amount={2}}}", wFirst, wSecond, iKernAmount));
}
}
}
现在你可以通过API类调用这个方法
【讨论】:
我觉得你运气不好。
似乎没有与字距调整相关的类。字形将为字形索引和前进宽度生成合理的默认值。
也许可以尝试pinvoke,但正如该帖子下的注释所述
请注意:返回的数据似乎仅适用于默认的 unicode 块。
可能有一种方法可以通过更改代码页来获取更多信息(我只是猜测)。
我能够获得所有字距调整数据的唯一方法是直接解析文件;至少可以说不容易。
【讨论】: