Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NET中使用非';GDI中的t+;?_C#_Javascript_.net_Gdi_Kerning - Fatal编程技术网

C# 如何在.NET中使用非';GDI中的t+;?

C# 如何在.NET中使用非';GDI中的t+;?,c#,javascript,.net,gdi,kerning,C#,Javascript,.net,Gdi,Kerning,我想调用在.NET应用程序的GDI+中找不到的GDI方法 特别是获取指定字体的字距对。我想在HTML5画布上实现当前不支持的字距调整(字母间距),我认为最好的方法是在服务器上提取字距调整对,并将字距调整表返回给客户端 如何使用.NET中的windows库函数?我想你运气不好 据 似乎对紧排对没有相关的类。字形将为字形索引和前进宽度生成合理的默认值 也许可以尝试一下,但正如那篇文章下面的注释所说 请注意:返回的数据似乎仅用于默认unicode块 可能有一种方法可以通过更改代码页来获取更多信息(严格

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

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


如何使用.NET中的windows库函数?

我想你运气不好

似乎对紧排对没有相关的类。字形将为字形索引和前进宽度生成合理的默认值

也许可以尝试一下,但正如那篇文章下面的注释所说

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

可能有一种方法可以通过更改代码页来获取更多信息(严格地说,这是我的猜测)

我能够获得所有内核数据的唯一方法是直接解析文件;至少说来不容易


我想你运气不好

似乎对紧排对没有相关的类。字形将为字形索引和前进宽度生成合理的默认值

也许可以尝试一下,但正如那篇文章下面的注释所说

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

可能有一种方法可以通过更改代码页来获取更多信息(严格地说,这是我的猜测)

我能够获得所有内核数据的唯一方法是直接解析文件;至少说来不容易


您可以在
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
class

调用此方法。您可以在
windowsapi
中找到此方法来调用此方法:

  • 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
class

调用这个方法了,这个问题是专门询问是否可以通过.NET获得紧排对,没有提到我在问题中链接到的方法。另一个答案@Mehran显示了调用该方法的方法,您是否尝试过调用该GDI方法?似乎这正是我所需要的。@dormisher-是的,我发布的第二个链接(pinvoke)正是Mehran建议的,需要注意的是,您只能获取默认Unicode块的数据。如果这对你来说没问题,那么你就可以排序了。啊,我明白了,你所说的“你只能获取默认Unicode块的数据”到底是什么意思了。@domisher-我是从pinvoke网站上引用的,但我想它指的是与Windows中当前的区域/语言/区域设置相对应的Unicode块。啊,好吧,我想这对我来说已经足够好了。感谢您的帮助。这个问题专门询问是否有可能通过.NET获得紧排对,没有提到我在问题中链接的方法。另一个答案@Mehran显示了调用该方法的方法,您是否尝试过调用该GDI方法?似乎这正是我所需要的。@dormisher-是的,我发布的第二个链接(pinvoke)正是Mehran建议的,需要注意的是,您只能获取默认Unicode块的数据。如果这对你来说没问题,那么你就可以排序了。啊,我明白了,你所说的“你只能获取默认Unicode块的数据”到底是什么意思了。@domisher-我是从pinvoke网站上引用的,但我想它指的是与Windows中当前的区域/语言/区域设置相对应的Unicode块。啊,好吧,我想这对我来说已经足够好了。谢谢你的帮助。很棒的东西,非常感谢!我将尝试一下,看看返回的紧排对是否准确。你有使用这种方法的经验吗?不客气,我恐怕没有,但如果提供的输入格式正确,你就不必担心这一点,顺便说一句,这是一个非常有用的
winAPI
网站,非常感谢!我将尝试一下,看看返回的紧排对是否准确。你有使用这种方法的经验吗?不客气,我恐怕没有,但如果提供的输入格式正确,你不必担心这一点,顺便说一句,这是一个非常有用的
winAPI