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.

Člen

Zobrazeno 18 zpráv z 18.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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)
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.
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
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:
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...
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.
Tak bohužel ani toto nepomohlo jen se mi změnila velikost fontu v
richtextboxu, protože v labelu mám 14.
Díky...
pokud je ten font šiřitelný, bylo by zajímavé tu dát odkaz ke stažení.
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
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.
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.
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.
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.