【问题标题】:How to get the maxlength of the string a specific RichTextBox control can show on the same line?如何获取特定 RichTextBox 控件可以在同一行显示的字符串的最大长度?
【发布时间】:2013-10-25 05:33:46
【问题描述】:

我正在为在 .NET Framework 2.0 上运行的 WinForm 应用程序使用常规的 System.Windows.Form.RichTextBox 控件来显示状态日志。由于 Form 和其他几个子控件具有 AutoSize=True,因此应用程序在不同设置上的外观并不总是相同。我无法提前知道控件的确切大小,无论如何我想每个特定配置的比率(字体外观)/(gui 尺寸)都有一些含义。

所以现在让我们描述最动态的场景。我想知道字符串的确切最大长度是多少,给定的 RichTextBox 可以显示在同一行(不超过边框或自动换行),这样的 RichTextBox 使用的是通用且已知的 monospaced font 和大小。

如果没有任何直接的方法来完成这个结果,是否知道我是否可以使用任何技巧,比如注入一个递增的测试字符串,直到一些奇怪的事件被触发?

【问题讨论】:

  • 如果您的意思是 length 是字符数,答案是 it depends on the Font 和字符本身。您最初的问题似乎与Scaling有关,无论如何winforms中的Scaling很难满足,但它至少支持一些automatic scaling,手动缩放并不容易,顺便说一句,您的问题看起来不像当你说the application does not always look the same way 时如此严肃,我认为这就是你必须接受的,关键是你的GUI 没有损坏太多,它只需要保持可用和可访问。
  • 是的,字符串的长度当然是字符数。我理解您强调的缩放点,无论如何,我只是想最终进一步抽象问题到您只想在运行时为给定系统获取我要求的信息的程度。我的具体问题只是制作一个可以在 RichTextBox 上填充整行并保持标题在中心对齐的标题。我用我发布的代码作为我自己问题的答案解决了这个问题,但我仍然很想知道任何最终不那么臃肿的解决方案。

标签: c# .net winforms richtextbox


【解决方案1】:

这就是我到目前为止所得到的。我使用了TextRenderer 类和我对上述问题的预期策略。当然,只有当控件使用等宽字体时才有意义。尽管它适用于我的问题,但我仍然很想知道是否有人知道实现相同目标的更好方法。所以这个问题还要待一段时间。

int maxStringLength = GetMaxStringLengthPerLine(myRichTextBox);

int GetMaxStringLengthPerLine(RichTextBox textbox) {
   return GetMaxStringLength(textbox.Size.Width, textbox.Font);
}

int GetMaxStringLength(int width, Font font) {
   int i = 0;
   while(TextRenderer.MeasureText(new string('A',++i), font).Width<=width);
   return --i;
}

【讨论】:

  • 你应该声明一个变量来保存TextRenderer.MeasureText("A",font).Width的值,然后将width除以那个值,你会得到比实际结果更大的近似结果。那么你的循环会更快,你的i 将是decreased
  • 注意,使用这个TextRenderer有点棘手,你应该提供IDeviceContext(可以是Graphics的一个实例)作为第一个参数以获得确切的结果,它还取决于TextFormatFlags 作为最后一个参数。我尝试了一些重载和不同的参数,即使有某些重载和参数,你也不需要任何循环,只需获取 1 个字符的 Width 并将 width 除以该值。
  • 我意识到我有点夸大了只是为了解释这个概念:D 是的,你是对的.. 当你在几次迭代后已经有了一个非常好的估计时,循环 1by1 是没有意义的(即使只是正如您指出的那样,一个可能就足够了)。感谢您提供宝贵而详细的建议。
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
相关资源
最近更新 更多