Diskuze: c# form - přidání vlastního fontu do aplikace
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


HONZ4:23.5.2017 20:24
Font přidej přes vlastnosti projektu v záložce Resources (Prostředky).
PrivateFontCollection private_fonts = new PrivateFontCollection();
private void UTorrentWebUIForm_Load(object sender, EventArgs e)
{
GetFont(Properties.Resources.MySpecialFont); // tady zvol svůj zdroj
richTextBoxInfoLog.Font = new Font(private_fonts.Families[0], 12);
}
private void GetFont(byte[] resdata)
{
try
{
IntPtr memdata = IntPtr.Zero;
try
{
memdata = Marshal.AllocCoTaskMem(resdata.Length);
Marshal.Copy(resdata, 0, memdata, resdata.Length);
private_fonts.AddMemoryFont(memdata, resdata.Length);
}
catch (Exception)
{
throw;
}
finally
{
if (memdata != IntPtr.Zero)
Marshal.FreeCoTaskMem(memdata);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
nezapomeň změnit:
Application.SetCompatibleTextRenderingDefault(true);
malá oprava:
private void GetFont(byte[] resdata)
{
IntPtr memdata = IntPtr.Zero;
try
{
memdata = Marshal.AllocCoTaskMem(resdata.Length);
Marshal.Copy(resdata, 0, memdata, resdata.Length);
private_fonts.AddMemoryFont(memdata, resdata.Length);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (memdata != IntPtr.Zero) Marshal.FreeCoTaskMem(memdata);
}
}
(měl jsem tam pozůstatek testu)
+20 Zkušeností
+2,50 Kč
Michaal.K:24.5.2017 9:31
Ahoj,
díky za rady. Ale zatím mi to nějak nefunguje. Font jsem přidal tak jak si
psal přes vlastnosti projektu do resources.
Písmo se mi ale nezmění a když pak program krokuji, tak v:
private_fonts.Families[0]
kterou jsem si vložil do watch mi to píše: Name = The name 'name' does not
exist in the current context
Takže to vypadá že to písmo vůbec nenašlo. Kód viz níže:
private void NactiFont(byte[] resdata)
{
IntPtr memdata = IntPtr.Zero;
try
{
memdata = Marshal.AllocCoTaskMem(resdata.Length);
Marshal.Copy(resdata, 0, memdata, resdata.Length);
private_fonts.AddMemoryFont(memdata, resdata.Length);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (memdata != IntPtr.Zero) Marshal.FreeCoTaskMem(memdata);
}
}
private void UTorrentWebUIForm_Load(object sender, EventArgs e)
{
NactiFont(Properties.Resources.windows_command_prompt);
richTextBoxInfoLog.Font = new Font(private_fonts.Families[0], 12);
}
Na obrázku níže je vidět přidaný font v resources.
A ještě nevím kde změnit toto:
Application.SetCompatibleTextRenderingDefault(true);
Díky za pomoc a rady.
Michaal.K:24.5.2017 13:26
Ahoj,
tak jsem to v program.cs změnil, ale pořád to nejde
Písmo se nezměnilo a když krokuju
tak v
private_fonts.Families[0]
kterou jsem si vložil do watch mi to píše: Name = The name 'name' does not
exist in the current context
Díky za pomoc
HONZ4:24.5.2017 20:49
Mě to funguje normálně. (Pro jiné formáty než .ttf by mohl být
problém).
Důkaz a postup v obrázcích:
Michaal.K:25.5.2017 7:33
Ahoj,
tak jsem se posunul o kousek dál
Zkusil jsem založit nový projekt a postupoval jsem přesně podle
tvého foto návodu. Spustil jsem program a ono to fungovalo, normálně se mi v
labelu změnil font po stisku na tlačítko. Zkusil jsem tedy přidat
richTextBox a změnit font a to už mi nejde, viz. kód:
private void button1_Click(object sender, EventArgs e)
{
GetFont(Properties.Resources.windows_command_prompt);
label1.Font = new Font(private_fonts.Families[0], 14);
richTextBox1.AppendText("Testovaci Text!!");
richTextBox1.AppendText("\nTestovaci text 2!!");
richTextBox1.SelectAll();
richTextBox1.SelectionFont = new Font(private_fonts.Families[0], 14);
}
Ale je zajímavé že pokud dám:
richTextBox1.SelectionFont = new Font("Times New Roman", 14);
tak se text změní na font Times New Roman. Takže to vypadá, že richTextBox
nepodporuje tento typ písma. Je to možné?
Díky...
Michal Štěpánek:25.5.2017 8:09
Je divné, že by Label písmo podporoval a RichTextBox ne. Zkusil sis tam ten font dosadit názvem a ne výběrem podle indexu z kolekce?
Zkusil bych (když ten label to má správně)
richtext.SelectionFont = label1.Font;
výsledek bez vyzkoušení netuším, ale každopádně nebudeš mít zytečně
v paměti 2 (datově) stejné objekty.
Michaal.K:25.5.2017 9:15
Tak bohužel ani toto nepomohlo jen se mi změnila velikost fontu v
richtextboxu, protože v labelu mám 14.
Díky...
HONZ4:25.5.2017 20:38
pokud je ten font šiřitelný, bylo by zajímavé tu dát odkaz ke stažení.
Michaal.K:26.5.2017 6:31
Jj font je volně šiřitelný, stáhl jsem ho odsud:
http://www.dafont.com/…-prompt.font
je to font z příkazového řádku.
Díky
HONZ4:26.5.2017 20:07
tak jsem to testoval, (nevím jestli je to někde i popsáno), vypadá to
tak, že v RichTextBox jdou použít pouze nainstalovaná písma.
Takže, jako nejjednodušší řešení, doporučuji šířit aplikaci pomocí
instalátoru a fonty nainstalovat.
Omlouvám se, že jsem tohle hned nevěděl.
Michaal.K:29.5.2017 9:06
Aha, tak to mě štve, že to nejde. A jinak ten font přidat nejde?
Předpokládám, že textbox se bude chovat stejně jako richtextbox.
Díky za rady a pomoc.
Michaal.K:29.5.2017 10:17
Tak jsem si stím ještě chvíli hrál a zjistil jsem zajímavou věc. Pokud načtu font přímo do aplikace tak mi to v richTextBox normálně funguje, viz kód níže:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Reflection;
namespace Pridani_fontu
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
PrivateFontCollection pfc = new PrivateFontCollection();
private void button2_Click(object sender, EventArgs e)
{
richTextBox1.AppendText("Testovaci Text 3!!");
richTextBox1.AppendText("\nTestovaci text 4!!");
}
private void Form1_Load(object sender, EventArgs e)
{
pfc.AddFontFile(Application.StartupPath + "\\" + "windows_command_prompt.ttf");
richTextBox1.Font = new Font(pfc.Families[0], 22);
}
}
}
Tak teď nevím proč nefunguje tvůj postup načtení fontu z
resources....
Nenapadá tě něco?
Díky.
Michaal.K:29.5.2017 13:03
Tak jsem se do toho ponořil a něco jsem vygoogloval a funguje to i pro richtextbox. Viz kód níže:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Reflection;
namespace Pridani_fontu
{
public partial class Form1 : Form
{
[DllImport("gdi32.dll")]
private static extern IntPtr AddFontMemResourceEx(IntPtr pbfont, uint cbfont, IntPtr pdv, [In] ref uint pcFonts);
FontFamily ff;
Font font;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
loadFont();
AllocFont(font, this.richTextBox2, 12);
}
private void loadFont()
{
byte[] fontArray = Pridani_fontu.Properties.Resources.windows_command_prompt;
int dataLength = Pridani_fontu.Properties.Resources.windows_command_prompt.Length;
IntPtr ptrData = Marshal.AllocCoTaskMem(dataLength);
Marshal.Copy(fontArray, 0, ptrData, dataLength);
uint cFonts = 0;
AddFontMemResourceEx(ptrData, (uint)fontArray.Length, IntPtr.Zero, ref cFonts);
PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddMemoryFont(ptrData, dataLength);
Marshal.FreeCoTaskMem(ptrData);
ff = pfc.Families[0];
font = new Font(ff, 14f, FontStyle.Bold);
}
private void AllocFont(Font f, Control c, float size)
{
FontStyle fontStyle = FontStyle.Regular;
c.Font = new Font(ff, size, fontStyle);
}
private void button3_Click(object sender, EventArgs e)
{
richTextBox2.AppendText("Testovaci retezec!!\n");
richTextBox2.AppendText("Testovaci retezec!!\n");
}
}
}
Tak kdyby někdo náhodou řešil podobný problém, tak je to možné
řešení 
Zobrazeno 18 zpráv z 18.

