gpt4 book ai didi

c# - 查找面板中文本的高度

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:09 24 4
gpt4 key购买 nike

我有自己定制的面板。我用它来显示文本。但有时该文本太长并换行到下一行。有什么方法可以自动调整面板大小以显示所有文本吗?

我正在使用 C# 和 Visual Studio 2008 以及紧凑型框架。


这是我要调整大小的代码:
(注:HintBox是我自己的类,继承自panel。所以我可以根据需要修改。)

public void DataItemClicked(ShipmentData shipmentData)
{
// Setup the HintBox
if (_dataItemHintBox == null)
_dataItemHintBox = HintBox.GetHintBox(ShipmentForm.AsAnObjectThatCanOwn(),
_dataShipSelectedPoint,
new Size(135, 50), shipmentData.LongDesc,
Color.LightSteelBlue);


_dataItemHintBox.Location = new Point(_dataShipSelectedPoint.X - 100,
_dataShipSelectedPoint.Y - 50);
_dataItemHintBox.MessageText = shipmentData.LongDesc;
// It would be nice to set the size right here
_dataItemHintBox.Size = _dataItemHintBox.MethodToResizeTheHeightToShowTheWholeString()
_dataItemHintBox.Show();

}

我将向 Will Marcouiller 给出答案,因为他的代码示例最接近我的需要(并且看起来可以正常工作)。然而,这就是我想我会使用的:

public static class CFMeasureString
{
private struct Rect
{
public readonly int Left, Top, Right, Bottom;
public Rect(Rectangle r)
{
this.Left = r.Left;
this.Top = r.Top;
this.Bottom = r.Bottom;
this.Right = r.Right;
}
}

[DllImport("coredll.dll")]
static extern int DrawText(IntPtr hdc, string lpStr, int nCount,
ref Rect lpRect, int wFormat);
private const int DT_CALCRECT = 0x00000400;
private const int DT_WORDBREAK = 0x00000010;
private const int DT_EDITCONTROL = 0x00002000;

static public Size MeasureString(this Graphics gr, string text, Rectangle rect,
bool textboxControl)
{
Rect bounds = new Rect(rect);
IntPtr hdc = gr.GetHdc();
int flags = DT_CALCRECT | DT_WORDBREAK;
if (textboxControl) flags |= DT_EDITCONTROL;
DrawText(hdc, text, text.Length, ref bounds, flags);
gr.ReleaseHdc(hdc);
return new Size(bounds.Right - bounds.Left, bounds.Bottom - bounds.Top +
(textboxControl ? 6 : 0));
}
}

这使用操作系统级别的调用来绘制文本。通过 P-Invoking 它我可以获得我需要的功能(多行换行)。请注意,此方法不包括任何边距。只是文本实际占用的空间。

这段代码不是我写的。我从http://www.mobilepractices.com/2007/12/multi-line-graphicsmeasurestring.html得到的.那篇博文有我的确切问题和这个修复。 (虽然我确实做了一个小调整,使它成为一种扩展方法。)

最佳答案

您可以使用 Graphics.MeasureString()方法。

如果您需要在面板上分配文本的代码示例,我或许可以提供使用 MeasureString() 方法的代码示例。

我无法知道 Graphics.MeasureString() 方法是否是 Compact Framework 的一部分,因为我链接的页面上没有说明。

编辑#1

Here's a link我在这里回答了另一个与文本大小相关的问题,同时我正在寻找为您编写示例。 =)

编辑#2

Here's another link related你的问题。 (接下来编辑的是示例代码。=P)

编辑#3

public void DataItemClicked(ShipmentData shipmentData) { 
// Setup the HintBox
if (_dataItemHintBox == null)
_dataItemHintBox = HintBox.GetHintBox(ShipmentForm.AsAnObjectThatCanOwn(),
_dataShipSelectedPoint,
new Size(135, 50), shipmentData.LongDesc,
Color.LightSteelBlue);

// Beginning to measure the size of the string shipmentData.LongDesc here.

// Assuming that the initial font size should be 30pt.
Single fontSize = 30.0F;
Font f = new Font("fontFamily", fontSize, FontStyle.Regular);

// The Panel.CreateGraphics method provides the instance of Graphics object
// that shall be used to compare the string size against.
using (Graphics g = _dataItemHintBox.CreateGraphics()) {
while (g.MeasureString(shipmentData.LongDesc, f).Width > _dataItemHintBox.Size.Width - 5) {
--fontSize;
f = new Font("fontFamily", fontSize, FontStyle.Regular);
}
}

// Font property inherited from Panel control.
_dataItemHintBox.Font = f;

// End of font resizing to fit the HintBox panel.

_dataItemHintBox.Location = new Point(_dataShipSelectedPoint.X - 100,
_dataShipSelectedPoint.Y - 50);
_dataItemHintBox.MessageText = shipmentData.LongDesc;
// It would be nice to set the size right here
_dataItemHintBox.Size = _dataItemHintBox.MethodToResizeTheHeightToShowTheWholeString()
_dataItemHintBox.Show();
}

免责声明:此代码未经测试,超出我的想象。一些更改可能是强制性的,以便您对其进行测试。这提供了实现您似乎想要完成的目标的指南。可能有更好的方法来做到这一点,但我知道这个有效。好吧,正如您在我的其他答案中看到的那样,该算法有效。

代替行:

SizeF fontSize = 30.0F;

您还可以执行以下操作:

var fontSize = _dataItemHintBox.Font.Size;

Why is this?

因为 Font.Size 属性是只读。因此,您需要创建 System.Drawing.Font 的新实例每次 Font.Size 都会改变时的类。

在你的比较中,而不是有这条线:

while (g.MeasureString(shipmentData.LongDesc, f)...)

你还可以:

while (g.MeasureString(shipmentData.LongDesc, _dataItemHintBox.Font)...)

这将消除对第二个 Font 类实例的需求,即 f

请随时发布反馈,因为我可以根据收到的反馈更改我的示例以适应您的实际情况,以便更好地帮助您。 =)

希望对您有所帮助! =)

关于c# - 查找面板中文本的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3024943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com