Tag: 字体

使用对EnumFontFamiliesEx的DLL调用在C#中枚举活动字体让我知道了

我的最终目标是在Windows计算机上列出所有活动字体。 例如,如果您启动写字板或Word,您将看到它们全部。 其中一些字体来自windows \ fonts文件夹,但不是全部。 有些是使用gdi32.dll调用AddFontResource(…)动态注册的。 现在,你会认为C#支持检索整个列表,如果有,请告诉我! 但是,在花了好几个小时后,常规的C#调用获取安装的系统字体只检索实际上活动的所有字体中的一些。 例如,InstalledFontCollection.Families没有找到AddFontResource添加的任何字体(它找到了wordpad中列出的大约25%的字体!) 虽然我想在C#中执行此操作,但似乎我必须使用更多gdi32.dll调用。 这样就开始了我的EnumFontFamiliesEx问题。 我已经设法让以下代码工作到我正在获得一堆字体回调。 但是,结构ENUMLOGFONTEX似乎已损坏,例如lpelfe.elfFullName通常包含几个方形字符,而不是真实姓名。 也许我在编组或结构定义中犯了一个错误,不太确定。 我尝试了很多迭代和无休止的谷歌搜索,但无济于事。 任何帮助将非常感谢。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Windows.Media; using System.Runtime.InteropServices; using Microsoft.Win32; namespace FontRetriever { public partial class TestForm : Form { [DllImport(“gdi32.dll”)] static extern int EnumFontFamiliesEx(IntPtr hdc, [In] […]

如何以及何时为WinForms控件处理Font

当分配任何控件的Font属性时,静态代码分析工具(来自HP的Fortify)抱怨Visual Studio Designer生成的WinForms代码。 分析工具抱怨: line 143: this.mCopyrightLabel.Font = new System.Drawing.Font(“Microsoft Sans Serif”, 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); AboutWindowForm.cs中的函数InitializeComponent()无法正确处理第143行上Font()分配的非托管系统资源。 说明: 该程序无法正确处置使用非托管系统资源的托管对象。 无法正确处置使用非托管系统资源的托管对象至少有两个常见原因: 错误条件和其他特殊情况。 混淆程序的哪个部分负责释放资源。 在这种情况下,有一些程序路径,在第143行的AboutWindowForm.cs中分配的资源没有正确处理。 托管.NET对象的一小部分使用非托管系统资源。 .NET的垃圾收集器可能无法以可预测的方式释放原始托管对象。 因此,应用程序可能耗尽可用内存,因为垃圾收集器不知道非托管资源所消耗的内存。 大多数非托管资源泄漏问题导致一般软件可靠性问题,但如果攻击者可以故意触发非托管资源泄漏,则攻击者可能会通过耗尽非托管资源池来启动拒绝服务攻击。 我已经搜索了关于在Windows窗体中处理字体一段时间的主题,这些是我收集的要点: 创建字体将占用GDI对象,这是一个非托管资源,因此在不再需要时释放非常重要 由于GDI对象昂贵且稀缺,WinForm会缓存它们。 Dispose WinForms控件还将处理其所有子控件并“释放获得的非托管资源” 如果表格是无模式的,表格将在关闭时处理 因此,我想得出结论,在VS生成的代码中没有必要显式分配给控件的Font,并且我们不应该这样做,因为字体是缓存的? 我创建了一个非常简单的表单测试程序:通过单击一个按钮,我创建了一个使用不同字体的新空表单。 关闭新打开的表单后,任务管理器中的GDI对象计数立即关闭。 这是上述要点的证据,不是吗? 然而静态分析仪似乎不相信。 它认为Font最终将由GC发布。 它还认为这对非托管资源不利,因为消耗的内存位于GC的知识之外,因此GC不会及时触发,因为GC感觉没有内存压力。 这为攻击者提供了故意触发耗尽非托管池的机会。 你能帮我理解分析仪给出的解释吗? 它对WinFroms有效吗? 手动处理创建的每个Font会很繁琐。 确切地说: 在控件的Dispose期间是否立即明确地处理Font,或者Control释放对Font的引用并让GC处理所有左边的? 谢谢! 我的问题的进一步更新:我做的另一个实验是:我在TaskManager和内存分析器中监视我的测试WinForm应用程序。 主窗体有一个按钮,用于打开另一个窗体,其单击时字体不同。 我注意到当我单击按钮并打开新窗体时,TaskManager中的GDI对象计数会增加。 因此,内存分析器观察到Font对象的计数。 但是,当我关闭新窗体时,TaskManager中的GDI对象数量立即下降。 内存探查器中Font对象的数量没有变化,这意味着GC没有发生。 但是,这些Font对象在内存分析器中被标记为“已处置但未收集”。 它给我这种感觉,当Form关闭时,Font对象设置为WinForms […]

直接从C#中的文件加载字体

有没有办法做这样的事情? FontFamily fontFamily = new FontFamily(“C:/Projects/MyProj/free3of9.ttf”); 我尝试了各种各样的变化,但却无法让它发挥作用。 更新: 这有效: PrivateFontCollection collection = new PrivateFontCollection(); collection.AddFontFile(@”C:\Projects\MyProj\free3of9.ttf”); FontFamily fontFamily = new FontFamily(“Free 3 of 9”, collection); Font font = new Font(fontFamily, height); // Use the font with DrawString, etc.

从文件系统中的字体加载族(而不是字体)名称

我正在从文件系统加载字体。 通常我的代码工作得很好,但是当我通过PrivateFontCollection加载字体时,加载的FontFamily的名称是字体中TypeFace的名称(我可以在Windows的字体预览器中的字体名称下看到)而不是FontFamily名称… 因为我有一些字体具有相同的字体名称但另一种字体名称我希望能够区分它们。 任何人都知道如何获得真正的FontFamily名称? public Dictionary LoadFontsFromDirectory(string path) { Dictionary foundFonts = new Dictionary(); if (!Directory.Exists(path)) throw new Exception(“directory doesnt exist”); foreach(FileInfo fi in new DirectoryInfo(path).GetFiles(“*.ttf”)) { PrivateFontCollection fileFonts = new PrivateFontCollection(); fileFonts.AddFontFile(fi.FullName); if (!foundFonts.ContainsKey(fileFonts.Families[0].Name)) { //add the font only if this fontfamily doesnt exist yet FontFamily family = new FontFamily(String.Format(“file:///{0}#{1}”, fi.FullName, fileFonts.Families[0].Name)); foundFonts.Add(family.Name, family); […]

UI控件在Windows窗体应用程序中重叠和字体问题

我制作了一个Windows窗体应用程序。 我有一个带有一些控件的表单。 控件重叠,并且字体也会自动更改,在某些地方,字体在按钮,文本框中变为白色。 我附上一张图片以便更多理解。 1 : 这在一些最终用户的系统中发生,我无法找到为什么会出现此问题。 任何帮助,将不胜感激。 Thnx提前

在客户端计算机上安装字体

我正在使用Visual Studio 2008和C#客户端应用程序的内置安装工具。 如何使用此安装程序在客户端计算机上安装字体(如果它还没有)?

如何使用C#在TextBox中获取Caret光标高度?

我有一些textBox具有多行function,具有不同的字体大小。 现在我想知道这个文本框文本的插入符光标高度作为一个简单的文本框,因此插入符号光标将能够根据字体更改等resize,换句话说我想知道textBox的行高或字体大小textBox。 int fontHeight ; using (Graphics g = textBox1.CreateGraphics()) { float points = textBox1.Font.SizeInPoints; fontHeight = Convert.ToInt16(points * g.DpiX / 72); } MessageBox.Show(“myFont size in pixels: ” + fontHeight ); 和… int fontHeight = Convert.ToInt32(textBox1.Font.Size); 为此我使用上面的代码,但没有给出完整的结果,那么如何使它更完美?

在MVC中,可以更改@ Html.DropDownListFor中每个列表项的字体(创建类似于MS office的字体下拉列表

在MVC 4中,我有类似下面的代码, @for (int i = 0; i < Model.dropDownControl.Count; i++) { @List fonts = (List)ViewBag.vFontlIst; @Html.DropDownListFor( model => model.dropDownControl[i].Font, fonts, new { style = “width: 100px; font-family:”+Model.dropDownControl[i].Font+””, id = “ddlFontDropDownList” }) } 在这里我尝试创建类似于我们在MS Office中用于字体选择的下拉列表,在上面的代码下拉字体样式对于完整列表总是相同的,这里selectlist包含所有可用字体控制器的列表,其具有以下代码: List liFonts = new List(); foreach (FontFamily font in System.Drawing.FontFamily.Families) { liFonts.Add(new SelectListItem { Text = font.Name, Value = font.Name […]

字体非常难看

我正在使用以下代码绘制一个字符串: public Image DrawString(String lString) { Image lImage = new Bitmap(128, 128); Rectangle rec = new Rectangle(0, 0, lImage.Width, lImage.Height); Graphics g = Graphics.FromImage(lImage); g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; drawFormat = new StringFormat(); drawFormat.Alignment = StringAlignment.Center; drawFormat.LineAlignment = StringAlignment.Center; Font font = new Font(“Arial”, 20, FontStyle.Regular); font = FindBestFitFont(g, lString, font, rec.Size); g.DrawString(lString, font, Brushes.Red, rec, drawFormat); […]

一个标签中的不同字体

有没有人知道如何使用两个不同的字体或至少两个不同的FontSize创建一个Label(WindowsForms)?