在 .NET DrawString 中换行时禁用断字

2023-12-19

我正在使用 .NET 将字符串绘制到有限的空间中。我希望字符串尽可能大。我对字符串分成更多行没有问题(如果它留在矩形内)。现在的问题是:我不希望 .NET 在单词中间的不同行中断开字符串。 例如,字符串“Test”以大字体打印在一行上。字符串“Testing”应以较小的字体打印在一行上(而不是一行上的“Testi”和另一行上的“ng”),字符串“Test Test”应以相当大的字体打印在两行上。

有人知道如何限制 .NET 不违背我的话吗?

我目前正在使用这样的代码:

        internal static void PaintString(string s, int x, int y, int height, int maxwidth, Graphics g, bool underline)
    {
        FontStyle fs = FontStyle.Bold;
        if (underline)
            fs |= FontStyle.Underline;
        Font fnt = new System.Drawing.Font("Arial", 18, fs);
        SizeF size = g.MeasureString(s, fnt, maxwidth);
        while (size.Height > height)
        {
            fnt = new System.Drawing.Font("Arial", fnt.Size - 1, fs);
            size = g.MeasureString(s, fnt, maxwidth);
        }
        y = (int)(y + height / 2 - size.Height / 2);
        g.DrawString(s, fnt, new SolidBrush(Color.Black), new Rectangle(x, y, maxwidth, height));
    }

找到字符串中最长的单词并使用MeasureString确保它适合一根线:

internal static void PaintString(string s, int x, int y, int maxHeight, int maxWidth, Graphics graphics, bool underline)
{
    FontStyle fontStyle = FontStyle.Bold;
    if (underline)
    {
        fontStyle |= FontStyle.Underline;
    }

    var longestWord = Regex.Split(s, @"\s+").OrderByDescending(w => w.Length).First();
    using (var arial = new FontFamily("Arial"))
    using (var format = new StringFormat(StringFormatFlags.LineLimit)) // count only lines that fit fully
    {
        int fontSize = 18;
        while (fontSize > 0)
        {
            var boundingBox = new RectangleF(x, y, maxWidth, maxHeight);
            using (var font = new Font(arial, fontSize, fontStyle))
            {
                int charactersFittedAll, linesFilledAll, charactersFittedLongestWord, linesFilledLongestWord;
                graphics.MeasureString(s, font, boundingBox.Size, format, out charactersFittedAll, out linesFilledAll);
                graphics.MeasureString(longestWord, font, boundingBox.Size, format, out charactersFittedLongestWord, out linesFilledLongestWord);

                // all the characters must fit in the bounding box, and the longest word must fit on a single line
                if (charactersFittedAll == s.Length && linesFilledLongestWord == 1)
                {
                    Console.WriteLine(fontSize);
                    graphics.DrawString(s, font, new SolidBrush(Color.Black), boundingBox, format);
                    return;
                }
            }

            fontSize--;
        }

        throw new InvalidOperationException("Use fewer and/or shorter words");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .NET DrawString 中换行时禁用断字 的相关文章

  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • 从同步上下文调用异步方法

    我在代码中通过 HTTP 调用服务 最终使用 HttpClient SendAsync 方法 然后从 WebAPI 控制器操作调用此代码 大多数情况下 它工作得很好 测试通过 但是当我在 IIS 上部署时 我遇到了死锁 因为异步方法调用的调
  • 为什么要加密 ASP.NET 中的查询字符串?

    我正在开发一个用 C ASP NET 编写的 Web 应用程序 该应用程序的原始设计者选择使用加密的查询字符串和Viewstate控制应用程序的 安全 和 状态 在此之前 我来自 GET POST 世界 我没有很好的基础来理解为什么人们会经
  • 从标签 ID 更改整个 gridview 单元格颜色

    试图弄清楚当我有标签 ID 时如何更改 gridview 单元格的背景颜色
  • 没有端点在 net.pipe://localhost/ 上监听

    我有两个 WCF 服务托管在 Windows Server 2003 计算机上的单个 Windows 服务中 如果 Windows 服务需要访问任一 WCF 服务 例如发生定时事件时 它将使用公开的五个命名管道端点之一 不同的服务协定 该服
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • Global.asax PostAuthenticateRequest 事件绑定是如何发生的?

    我怎样才能使用发布验证请求Global asax 事件 我正在跟进本教程 http www asp net security tutorials forms authentication configuration and advanced
  • 终结器线程的范围是什么 - 每个应用程序域或每个进程?

    根据我的所有阅读 应该有一个 GC 线程来调用所有终结器 现在的问题是这个 一个 线程的范围是什么 每个进程或每个应用程序域 因为域的整体目的是在一个进程空间中分离并创建 独立 的不同应用程序 I read here http dn cod
  • DateTime.Parse("2012-09-30T23:00:00.0000000Z") 始终转换为 DateTimeKind.Local

    我想解析一个表示 UTC 格式的日期时间的字符串 我的字符串表示形式包括 Zulu 时间规范 该规范应指示该字符串表示 UTC 时间 var myDate DateTime Parse 2012 09 30T23 00 00 0000000
  • idleTimeout 和 ShutdownTimeout 之间的区别

    我正在尝试放宽网站的会话过期策略 以便用户可以指定会话超时间隔 我需要弄清楚应该指定哪些网站相关设置 以免过多限制用户 例如 可能需要 1 天的间隔 我将使用门票来实现这一点 现在 我知道我可以在网站的 web config 文件中指定id
  • 如何禁用 Alt + F4 关闭表单?

    What is the best way to disable Alt F4 in a c win form to prevent the user from closing the form 我使用表单作为弹出对话框来显示进度条 但我不希
  • 有没有基于 WPF 的 Markdown 渲染器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们有基于 WPF 的应用程序 我们有单独的字符串存储库 其中的文本在网络中进行编辑 在我们的 WPF
  • C# 如何使用 CallNtPowerInformation 和 Interop 来获取 SYSTEM_POWER_INFORMATION

    我正在尝试编写一个小程序 该程序作为服务运行并监视用户是否处于活动状态 如果用户空闲 没有鼠标 键盘 一个小时 则某些进程将被终止 如果用户使用 user32 dll 中的 LASTINPUTINFO 运行它 它就可以工作 但它不能作为服务
  • 签署.net核心程序集的正确方法

    我正在尝试签署 net core 库 但我不确定我是否正确执行了所有操作 1 使用VS命令提示符IS调用sn k mykey snk 2 复制mykey snk到我的项目文件夹 3 in project json添加了密钥文件 framew
  • 记录共享和映射的诊断上下文

    据我所知 其他人做了什么来解决 Commons Logging 项目 针对 NET 和 Java 不支持映射或嵌套诊断上下文这一事实 执行摘要 我们选择直接使用实现者日志框架 在我们的例子中为 log4j 长答案 您是否需要一个抽象日志框架
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 将 dll 注册到 GAC 或从 ASP.NET 中的 bin 文件夹引用它们是否更好

    如果答案是 视情况而定 您能否提供一个简短的解释 GAC 旨在包含以下组件跨多个应用程序共享 如果是这种情况 您应该对程序集进行强命名并向 GAC 注册 如果不是 请将程序集保留为私有程序集并将其作为项目 dll 引用进行引用 PS 没有真

随机推荐