2010-06-23 65 views
3

我想在我的程序加载中安装特定字体,并在呈现程序文本时使用该字体。如何以编程方式从WinCE 6上的.NET CF安装字体。如何以编程方式安装字体

回答

0

将字体* .ttf文件复制到Windows \ Fonts文件夹中,可能需要重新启动设备。

+0

我不能重新启动设备,它恢复到原来的状态时,重新启动。所以,我必须在每次启动程序时安装字体。再加上,没有Windows \ Font文件夹。任何其他方式? – VOX 2010-06-23 19:51:09

2

This blog entry显示如何使用本机代码枚举和添加Windows CE中的字体。对于托管代码,这将工作:

internal class FontHelper 
{ 
    private delegate int EnumFontFamProc(IntPtr lpelf, IntPtr lpntm, uint FontType, IntPtr lParam); 
    private List<string> m_fonts = new List<string>(); 

    public FontHelper() 
    { 
     RefreshFontList(); 
    } 

    public void RefreshFontList() 
    { 
     m_fonts.Clear(); 

     var dc = GetDC(IntPtr.Zero); 
     var d = new EnumFontFamProc(EnumFontCallback); 
     var ptr = Marshal.GetFunctionPointerForDelegate(d); 
     EnumFontFamilies(dc, null, ptr, IntPtr.Zero); 
    } 

    public string[] SupportedFonts 
    { 
     get { return m_fonts.ToArray(); } 
    } 

    private const int SIZEOF_LOGFONT = 92; 
    private const int LOGFONT = 28; 
    private const int LF_FACESIZE = 32; 
    private const int LF_FULLFACESIZE = 64; 

    [DllImport("coredll", SetLastError = true)] 
    private static extern IntPtr GetDC(IntPtr hwnd); 

    [DllImport("coredll", SetLastError = true)] 
    private static extern int EnumFontFamilies(IntPtr hdc, string lpszFamily, IntPtr lpEnumFontFamProc, IntPtr lParam); 

    private int EnumFontCallback(IntPtr lpelf, IntPtr lpntm, uint FontType, IntPtr lParam) 
    { 
     var data = new byte[SIZEOF_LOGFONT + LF_FACESIZE + LF_FULLFACESIZE]; 

     Marshal.Copy(lpelf, data, 0, data.Length); 
     var fontName = Encoding.Unicode.GetString(data, SIZEOF_LOGFONT, LF_FULLFACESIZE).TrimEnd('\0'); 
     Debug.WriteLine(fontName); 
     m_fonts.Add(fontName); 

     return 1; 
    } 
} 
+1

这是很棒的文章。感谢ctacke。 – VOX 2010-06-25 16:00:10

+0

请问您可以将C++代码翻译成C#吗? – VOX 2010-06-29 22:49:02