.net framework里面提供的一些取字体库的函数取出来的字体不全,很少。
例如 
FontFamily.GetFamilies(IntPtr intPtrHandle);
FontFamily.Families;
InstalledFontCollection installedFontCollection = new InstalledFontCollection();
installedFontCollection.Families;
之类,取出来的东西都一样,字体太少。另外跟系统装的字体没关系,运行别的程序取出来的字体,比通过上述一些函数取得的字体多些
例如@System,前面带@的字体,为什么上述函数取不出来。想通过 Api 遍历所有字体 EnumFontFamiliesEx ,可是不清楚第一个参数的hdc 是从哪里取得的?是当前窗体的Handle还是其他什么的?高手们帮忙回答下上面的小小问题,谢谢啦。

解决方案 »

  1.   

    System.Drawing.Text.InstalledFontCollection
      

  2.   

    楼上的你也谈快了吧?可怜我的CDMA啊,跟牛车似的
    private void Form1_Load(object sender, System.EventArgs e)
    {
    //获取系统已经安装的字体
    InstalledFontCollection MyFont=new InstalledFontCollection();
    FontFamily[] MyFontFamilies=MyFont.Families;
    int Count=MyFontFamilies.Length;
    for(int i=0;i<Count;i++)
    {
    string FontName=MyFontFamilies[i].Name;
    this.comboBox1.Items.Add(FontName);
    }
                     }
      

  3.   

    private   void   Form1_Load(object   sender,   System.EventArgs   e) 

    //获取系统已经安装的字体 
    InstalledFontCollection   MyFont=new   InstalledFontCollection(); 
    FontFamily[]   MyFontFamilies=MyFont.Families; 
    int   Count=MyFontFamilies.Length; 
    for(int   i=0;i <Count;i++) 

    string   FontName=MyFontFamilies[i].Name; 
    this.comboBox1.Items.Add(FontName); 

    }
      

  4.   

    Graphics g = this.CreateGraphics();
    FontFamily[] familys = FontFamily.GetFamilies(g);
    for(int i = 0; i < familys.Length; ++i)
    {
    cobFont.Items.Add(familys[i].Name);
    cobSub1Font.Items.Add(familys[i].Name);
    cobSub2Font.Items.Add(familys[i].Name);
    }
    g.Dispose();
    this.DrawSealImage();
    以上方法可得到所有已安装字体
      

  5.   

    //如何获得系统字体列表 
    System.Drawing.Text.InstalledFontCollection fonts=new System.Drawing.Text.InstalledFontCollection(); 
    foreach(System.Drawing.FontFamily ff in fonts.Families) 

       this.comboBox1.Items.Add(ff.Name); 
    }
      

  6.   

    大哥们啊,你们怎么回答问题都不看我的问题说明呢?
    FontFamily.GetFamilies(IntPtr   intPtrHandle); 
    FontFamily.Families; 
    InstalledFontCollection   installedFontCollection   =   new   InstalledFontCollection(); 
    installedFontCollection.Families; 
    这些取出来的东西都一样,就是因为他们取出来的字体不全,所以才想用api 来自己取。
      

  7.   

    我的Word字体Combo与上面几位的代码运行的结果是一致
    楼主所指的别的程序,不知是指哪些程序?
      

  8.   

    你引用的时候函数的时候可能写成这样了
    [DllImport("gdi32.dll")]
    static extern int EnumFontFamiliesEx(IntPtr hdc, [In,
    MarshalAs(UnmanagedType.LPStruct)] ref LOGFONT lpLogfont,
    EnumFontExDelegate lpEnumFontFamExProc, IntPtr lParam, uint
    dwFlags);
    容易引发Marshaling 问题。托管对象和非托管对象之间问题。
    LOGFONT 结构改成非托管的对象即可,至于hdc无关,取窗体hdc即可。函数引用如下
     [DllImport("gdi32.dll", EntryPoint = "EnumFontFamiliesEx",CharSet = CharSet.Unicode)]
     static extern int EnumFontFamiliesEx(IntPtr hdc
                                          ,[In] IntPtr intPtrLogFont
                                          , EnumFontExDelegate lpEnumFontFamExProc
                                          , IntPtr lParam
                                          , uint dwFlags);            LOGFONT logFont = ........
                IntPtr intPtrLogFont = Marshal.AllocHGlobal(Marshal.SizeOf(logFont));
                Marshal.StructureToPtr(logFont, intPtrLogFont, true);            // Calls the win32 function
                int intResult = EnumFontFamiliesEx(hDC, intPtrLogFont, .......            Marshal.FreeHGlobal(intPtrLogFont);然后遍历的时候应该注意,charset问题,设成Unicode可以避免乱码的出现。
      

  9.   

    InstalledFontCollection   MyFont   =   new   InstalledFontCollection(); 
    FontFamily[]   MyFontFamilies   =   MyFont.Families; 
    int   Count   =   MyFontFamilies.Length; 
    for   (int   i   =   0;   i   <   Count;   i++) 

    Console.WriteLine(MyFontFamilies[i].Name); 
    }
    EnumFontFamilies