Как я Встраиваю шрифт со своим приложением C#? (использующий Visual Studio 2005)

Я тестировал это на gdb 7.6, который уже доступен, но он не работает на gdb 7.2 и, вероятно, на gdb 7.1:

Итак, это main.cpp:

int a()
{
  int p = 0;
  p = p +1;
  return  p;
}

int b()
{
  return a();
}

int c()
{
  return a();
}

int main()
{
  c();
  b();
  a();
  return 0;
}

Тогда g ++ -g main.cpp

Это my_check.py:

class MyBreakpoint (gdb.Breakpoint):
    def stop (self):
        if gdb.selected_frame().older().name()=="b":
          gdb.execute("bt")
          return True
        else:
          return False

MyBreakpoint("a")

И вот как это работает:

4>gdb -q -x my_check.py ./a.out
Reading symbols from /home/a.out...done.
Breakpoint 1 at 0x400540: file main.cpp, line 3.
(gdb) r
Starting program: /home/a.out
#0  a () at main.cpp:3
#1  0x0000000000400559 in b () at main.cpp:10
#2  0x0000000000400574 in main () at main.cpp:21

Breakpoint 1, a () at main.cpp:3
3         int p = 0;
(gdb) c
Continuing.
[Inferior 1 (process 16739) exited normally]
(gdb) quit
16
задан Gary Willoughby 7 April 2009 в 18:36
поделиться

4 ответа

Это сообщение в блоге должно помочь Вам.

В основном Вы добавляете шрифт, поскольку встроенный ресурс затем загружает его в объект PrivateFontCollection.

15
ответ дан 30 November 2019 в 16:50
поделиться

Вот ответ Will, переведенный в (непротестированный) C#:

PrivateFontCollection pfc = new PrivateFontCollection();

using (Stream fontStream = GetType().Assembly.GetManifestResourceStream("Alphd___.ttf"))
{
    if (null == fontStream)
    {
        return;
    }

    int fontStreamLength = (int) fontStream.Length;

    IntPtr data = Marshal.AllocCoTaskMem(fontStreamLength);

    byte[] fontData = new byte[fontStreamLength];
    fontStream.Read(fontData, 0, fontStreamLength);

    Marshal.Copy(fontData, 0, data, fontStreamLength);

    pfc.AddMemoryFont(data, fontStreamLength);

    Marshal.FreeCoTaskMem(data);
}

наряду с их Краской () метод:

protected void Form1_Paint(object sender, PaintEventArgs e)
{
    bool bold = false;
    bool italic = false;

    e.Graphics.PageUnit = GraphicsUnit.Point;

    using (SolidBrush b = new SolidBrush(Color.Black))
    {
        int y = 5;

        foreach (FontFamily fontFamily in pfc.Families)
        {
            if (fontFamily.IsStyleAvailable(FontStyle.Regular))
            {
                using (Font font = new Font(fontFamily, 32, FontStyle.Regular))
                {
                    e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                }
                y += 40;
            }
            if (fontFamily.IsStyleAvailable(FontStyle.Bold))
            {
                bold = true;
                using (Font font = new Font(fontFamily, 32, FontStyle.Bold))
                {
                    e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                }
                y += 40;
            }
            if (fontFamily.IsStyleAvailable(FontStyle.Italic))
            {
                italic = true;
                using (Font font = new Font(fontFamily, 32, FontStyle.Italic))
                {
                    e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                }
                y += 40;
            }

            if(bold && italic)
            {
                using(Font font = new Font(fontFamily, 32, FontStyle.Bold | FontStyle.Italic))
                {
                    e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                }
                y += 40;
            }

            using (Font font = new Font(fontFamily, 32, FontStyle.Underline))
            {
                e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
                y += 40;
            }

            using (Font font = new Font(fontFamily, 32, FontStyle.Strikeout))
            {
                e.Graphics.DrawString(font.Name, font, b, 5, y, StringFormat.GenericTypographic);
            }
        }
    }
}
12
ответ дан 30 November 2019 в 16:50
поделиться

Его более легкое, чем это кажется; можно встроить шрифт как ресурс в приложении и получить доступ к нему как к свойству со строгим контролем типов в пространстве имен Свойств приложения. Но данная ссылка должна быть хорошей начальной точкой.


Для VB-disabled:

Добавьте шрифт как ресурс в Вашем приложении. Назовите ресурс MyFontLol. Можно получить доступ к этому ресурсу (как массив байтов) от Свойств. Ресурсы. MyFontLol.

Я не протестировал следующее, но это, кажется, осуществимо:

public void LoadMyFontLolKThx()
{
    // get our font and wrap it in a memory stream
    byte[] myFont = Properties.Resources.MyFontLol;
    using (var ms = new MemoryStream(myFont))
    {
        // used to store our font and make it available in our app
        PrivateFontCollection pfc = new PrivateFontCollection();
        // The next call requires a pointer to our memory font
        // I'm doing it this way; not sure what best practice is
        GCHandle handle = GCHandle.Alloc(ms, GCHandleType.Pinned);
        // If Length > int.MaxValue this will throw
        checked
        {
            pfc.AddMemoryFont(
                handle.AddrOfPinnedObject(), (int)ms.Length); 
        }
        var font = new Font(pfc.Families[0],12);

        // use your font here
    }
}

Одно последнее примечание. PFC хранит шрифт как GDI + шрифт. Они не совместимы с некоторыми средствами управления формами. Из документов:

Для использования шрифта памяти текст на управлении должен быть представлен с GDI +. Используйте метод SetCompatibleTextRenderingDefault, передавая верный, для установки GDI + представляющий на приложении, или на отдельных средствах управления путем установки свойства UseCompatibleTextRendering управления на истинный. Некоторые средства управления не могут быть представлены с GDI +.

11
ответ дан 30 November 2019 в 16:50
поделиться

Возможно, это не лучший способ, но не могли бы вы просто включить шрифт в свои ресурсы, а затем скопировать его в папку шрифта в директории Windows?

-2
ответ дан 30 November 2019 в 16:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: