Как вы используете методы Windows GDI в .NET, которых нет в GDI+?

Я хочу вызвать метод GDI, который не могу найти в GDI+ в приложении .NET.

В частности, этот метод который получает пары кернинга для указанного шрифта. Я хочу реализовать кернинг (расстояние между буквами) на холсте HTML5, который в настоящее время не поддерживается, и я решил, что лучший способ - вытащить пары кернинга на моем сервере и вернуть таблицу кернинга клиенту.

Как вы используете такие функции библиотеки Windows из .NET?


person jcvandan    schedule 22.05.2013    source источник


Ответы (2)


вы можете найти этот метод в 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

person Mehran    schedule 22.05.2013
comment
Отличный материал, большое спасибо! Я попробую это и посмотрю, являются ли возвращаемые пары кернинга точными или нет. Есть ли у вас опыт использования этого метода? - person jcvandan; 22.05.2013
comment
Пожалуйста, боюсь, что нет, но если введенные данные представлены в правильном формате, вам не стоит об этом беспокоиться, и, кстати, pinvoke.net — очень полезный веб-сайт для winAPI - person Mehran; 22.05.2013

Я думаю, вам не повезло.

Согласно этой теме

Кажется, нет подходящих классов для пары кернинга. Глифы будут генерировать разумные значения по умолчанию для индексов глифов и расширенной ширины.

Можно попробовать pinvoke, но, как говорится в примечании к этому сообщению

Обратите внимание: кажется, что возвращаемые данные относятся только к блоку юникода по умолчанию.

Может быть способ получить больше информации, изменив кодовую страницу (строго предположение с моей стороны).

Единственный способ, которым я смог получить ВСЕ данные кернинга, — это проанализировать файлы напрямую; мягко говоря не легко.

person Roger Rowland    schedule 22.05.2013
comment
В этом вопросе конкретно спрашивается, можно ли получить пары кернинга через .NET, не упоминается метод, на который я ссылался в вопросе. Другой ответ @Mehran показывает способ вызова этого метода, вы когда-нибудь пытались вызвать этот метод GDI? Кажется, это может быть как раз то, что мне нужно. - person jcvandan; 22.05.2013
comment
@dormisher - да, вторая ссылка, которую я разместил (pinvoke), - это именно то, что предлагает Мехран, и предостережение в том, что вы можете получить данные только для блока Unicode по умолчанию. Если это нормально, то вы в порядке. - person Roger Rowland; 23.05.2013
comment
Ах, я понимаю, что именно вы имеете в виду, говоря, что вы можете получить данные только для блока Unicode по умолчанию. - person jcvandan; 23.05.2013
comment
@dormisher - я цитировал сайт pinvoke, но я предполагаю, что это означает блок Unicode, соответствующий вашим текущим настройкам региона / языка / локали в Windows. - person Roger Rowland; 23.05.2013
comment
Ах хорошо хорошо, что это достаточно хорошо для меня, я думаю. Спасибо за вашу помощь. - person jcvandan; 23.05.2013