.net framework里面提供的一些取字体库的函数取出来的字体不全,很少。
例如
FontFamily.GetFamilies(IntPtr intPtrHandle);
FontFamily.Families;
InstalledFontCollection installedFontCollection = new InstalledFontCollection();
installedFontCollection.Families;
之类,取出来的东西都一样,字体太少。另外跟系统装的字体没关系,运行别的程序取出来的字体,比通过上述一些函数取得的字体多些
例如@System,前面带@的字体,为什么上述函数取不出来。想通过 Api 遍历所有字体 EnumFontFamiliesEx ,可是不清楚第一个参数的hdc 是从哪里取得的?是当前窗体的Handle还是其他什么的?高手们帮忙回答下上面的小小问题,谢谢啦。
例如
FontFamily.GetFamilies(IntPtr intPtrHandle);
FontFamily.Families;
InstalledFontCollection installedFontCollection = new InstalledFontCollection();
installedFontCollection.Families;
之类,取出来的东西都一样,字体太少。另外跟系统装的字体没关系,运行别的程序取出来的字体,比通过上述一些函数取得的字体多些
例如@System,前面带@的字体,为什么上述函数取不出来。想通过 Api 遍历所有字体 EnumFontFamiliesEx ,可是不清楚第一个参数的hdc 是从哪里取得的?是当前窗体的Handle还是其他什么的?高手们帮忙回答下上面的小小问题,谢谢啦。
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);
}
}
{
//获取系统已经安装的字体
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);
}
}
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();
以上方法可得到所有已安装字体
System.Drawing.Text.InstalledFontCollection fonts=new System.Drawing.Text.InstalledFontCollection();
foreach(System.Drawing.FontFamily ff in fonts.Families)
{
this.comboBox1.Items.Add(ff.Name);
}
FontFamily.GetFamilies(IntPtr intPtrHandle);
FontFamily.Families;
InstalledFontCollection installedFontCollection = new InstalledFontCollection();
installedFontCollection.Families;
这些取出来的东西都一样,就是因为他们取出来的字体不全,所以才想用api 来自己取。
楼主所指的别的程序,不知是指哪些程序?
[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可以避免乱码的出现。
FontFamily[] MyFontFamilies = MyFont.Families;
int Count = MyFontFamilies.Length;
for (int i = 0; i < Count; i++)
{
Console.WriteLine(MyFontFamilies[i].Name);
}
EnumFontFamilies