2010-06-23 70 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