Ik probeer nu al even om een embedded font te gebruiken in mijn applicatie. Er staan meerdere voorbeelden op internet, maar toch krijg ik het niet voor elkaar. (Op veel fora staat een voorbeeld dat voor een iemand werkt met daarna veel replies dat het niet werkt).
Ik heb op dit moment twee manieren geprobeerd. De eerste manier is een font (.otf in mijn geval) toevoegen aan het project en de build action op embed zetten. Het bestand heet EmigreEigth.otf. Dan probeer ik de font op de volgende manier te laden. (Op deze manier staat het vaak op internet).
Hier krijg ik dus telkens een file not found exception, terwijl ik wel een stream kan maken van de embedded resource
. (Als ik hier wat anders in typ blijft fontStream gewoon null).
Nu heb ik het via de ResurceManager geprobeerd.Aan het bestand Resources.resx heb ik het font weer toegevoegd, de resource name is nu EmgireEight. (zonder .otf). Dat levert de volgende code op.
Ook hier weer een fileNotFound exception, ondanks dat ik nu via de resource manager echt 100% zeker weet dat het bestand er is. Ik ben echt radeloos.
. Kan iemand me een duw in de goede richting geven, het embedded van een font zou toch niet zo moeilijk moeten zijn.
Edit: En een derde variant heeft hetzelfde probleem (overal is de fontBuffer trouwens een goed gevulde byte[])
(Verder heb ik nog een belangrijke show-stopper gevonden, om er voor te zorgen dat je font ook daadwerkelijk gerenderd wordt, moet je applicatie GDI+ compatible gerendered worden -> zet dus in de controls waarin je dit font wil gebruiken "UseCompatibleTextRendering" op true... dat was ook lastig te vinden, maarja zover was ik nog niet, maar heb zo wel andere mensen kunnen helpen ).
Ik heb op dit moment twee manieren geprobeerd. De eerste manier is een font (.otf in mijn geval) toevoegen aan het project en de build action op embed zetten. Het bestand heet EmigreEigth.otf. Dan probeer ik de font op de volgende manier te laden. (Op deze manier staat het vaak op internet).
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| private Font LoadFont[() { string nameSpace = Assembly.GetExecutingAssembly().GetName().Name.ToString(); Assembly assembly = Assembly.GetExecutingAssembly(); Stream fontStream = assembly.GetManifestResourceStream(nameSpace + ".EmigreEight.otf"); // hierbij ook nameSpace + ".Resources.EmigreEight.otf" geprobeerd maar dan is fS null. if (fontStream != null) { byte[] fontBuffer = new Byte[fontStream.Length]; fontStream.Read(fontBuffer, 0, (int)fontStream.Length); IntPtr memPointer = Marshal.AllocCoTaskMem(fontBuffer.Length); if (memPointer != null) { Marshal.Copy(fontBuffer, 0, memPointer, fontBuffer.Length); fontCollection = new PrivateFontCollection(); fontCollection.AddMemoryFont(memPointer, fontBuffer.Length); //FileNotFoundException Font emigreEightFont = new Font(fontCollection.Families[0].Name, 20f); Marshal.FreeCoTaskMem(memPointer); return emigreEightFont; } } else { throw new Exception(); } return null; } |
Hier krijg ik dus telkens een file not found exception, terwijl ik wel een stream kan maken van de embedded resource

Nu heb ik het via de ResurceManager geprobeerd.Aan het bestand Resources.resx heb ik het font weer toegevoegd, de resource name is nu EmgireEight. (zonder .otf). Dat levert de volgende code op.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| private Font LoadEmbeddedFont(string name) { Object font = Resources.ResourceManager.GetObject(name); if (font != null) { byte[] fontBuffer = (byte[])font; IntPtr memPointer = Marshal.AllocCoTaskMem(fontBuffer.Length); if (memPointer != null) { Marshal.Copy(fontBuffer, 0, memPointer, fontBuffer.Length); fontCollection = new PrivateFontCollection(); fontCollection.AddMemoryFont(memPointer, fontBuffer.Length); //fileNotFound exception return new Font(fontCollection.Families[0].Name, 20f); } } return null; } |
Ook hier weer een fileNotFound exception, ondanks dat ik nu via de resource manager echt 100% zeker weet dat het bestand er is. Ik ben echt radeloos.

Edit: En een derde variant heeft hetzelfde probleem (overal is de fontBuffer trouwens een goed gevulde byte[])
C#:
1
2
3
4
5
6
7
8
9
| private Font LoadEmbeddedFont2(string name) { byte[] fontBuffer = (byte[])(Resources.ResourceManager.GetObject(name)); var handle = GCHandle.Alloc(fontBuffer, GCHandleType.Pinned); var ptr = Marshal.UnsafeAddrOfPinnedArrayElement(fontBuffer, 0); fontCollection = new PrivateFontCollection(); fontCollection.AddMemoryFont(ptr, fontBuffer.Length); return new Font(fontCollection.Families[0].Name, 10f); } |
(Verder heb ik nog een belangrijke show-stopper gevonden, om er voor te zorgen dat je font ook daadwerkelijk gerenderd wordt, moet je applicatie GDI+ compatible gerendered worden -> zet dus in de controls waarin je dit font wil gebruiken "UseCompatibleTextRendering" op true... dat was ook lastig te vinden, maarja zover was ik nog niet, maar heb zo wel andere mensen kunnen helpen ).
[ Voor 8% gewijzigd door roy-t op 04-06-2010 10:11 ]