【问题标题】:How do you use windows GDI methods in .NET that aren't in GDI+?如何在 .NET 中使用 GDI+ 中没有的 windows GDI 方法?
【发布时间】:2013-05-17 23:35:04
【问题描述】:

我想在 .NET 应用程序中调用在 GDI+ 中找不到的 GDI 方法。

特别是this method,它获取指定字体的字距调整对。我想在目前不支持的 HTML5 画布上实现字距调整(字母间距),我认为最好的方法是在我的服务器上拉出字距调整对并将字距调整表返回给客户端。

您如何在 .NET 中使用这样的 Windows 库函数?

【问题讨论】:

    标签: c# javascript .net gdi kerning


    【解决方案1】:

    你可以在Windows API找到这个方法来调用这个方法:

    • 1:将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.net 是一个非常有用的网站 @ 987654329@
    【解决方案2】:

    我觉得你运气不好。

    根据this thread

    似乎没有与字距调整相关的类。字形将为字形索引和前进宽度生成合理的默认值。

    也许可以尝试pinvoke,但正如该帖子下的注释所述

    请注意:返回的数据似乎仅适用于默认的 unicode 块。

    可能有一种方法可以通过更改代码页来获取更多信息(我只是猜测)。

    我能够获得所有字距调整数据的唯一方法是直接解析文件;至少可以说不容易。

    【讨论】:

    • 该问题专门询问是否可以通过 .NET 获取字距调整对,没有提及我在问题中链接到的方法。另一个答案@Mehran 显示了一种调用该方法的方法,您是否尝试过调用该 GDI 方法?看来这可能正是我所需要的。
    • @dormisher - 是的,我发布的第二个链接 (pinvoke) 正是 Mehran 所建议的,需要注意的是您只能获取默认 Unicode 块的数据。如果没问题,那么你就被排序了。
    • 啊,我明白了,“您只能获取默认 Unicode 块的数据”到底是什么意思。
    • @dormisher - 我是从 pinvoke 网站引用的,但我认为它是指与您在 Windows 中当前区域/语言/区域设置相对应的 Unicode 块。
    • 嗯,好吧,我认为这对我来说已经足够好了。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2010-12-08
    • 2011-11-05
    • 2011-01-17
    • 2014-09-23
    • 2019-11-29
    • 2010-10-19
    相关资源
    最近更新 更多