Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找面板中文本的高度_C#_Visual Studio 2008_Compact Framework - Fatal编程技术网

C# 查找面板中文本的高度

C# 查找面板中文本的高度,c#,visual-studio-2008,compact-framework,C#,Visual Studio 2008,Compact Framework,我有我定制的面板。我用它来显示文本。但有时该文本太长,会换行到下一行。是否有某种方法可以自动调整面板大小以显示所有文本 我正在使用C和VisualStudio2008以及compact框架 以下是我想要调整大小的代码: 注意:HintBox是我自己从panel继承的类。所以我可以根据需要修改它 我将向Will Marcouiller给出答案,因为他的代码示例最接近我所需要的,并且看起来它会起作用。但是,我认为我将使用以下方法: public static class CFMeasureStrin

我有我定制的面板。我用它来显示文本。但有时该文本太长,会换行到下一行。是否有某种方法可以自动调整面板大小以显示所有文本

我正在使用C和VisualStudio2008以及compact框架

以下是我想要调整大小的代码: 注意:HintBox是我自己从panel继承的类。所以我可以根据需要修改它

我将向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调用它,我可以获得我需要的多行包装功能。请注意,此方法不包括任何边距。只是文本占用的实际空间

我没有写这段代码。我是从你那儿得到的。那篇博客文章有我的问题和这个修正。虽然我做了一个小小的调整,使之成为一个扩展方法。

你可以使用这个方法

如果您需要的话,我可以在您的面板上提供一个文本分配的代码示例,使用MeasureString方法提供一个代码示例

我无法知道Graphics.MeasureString方法是否是Compact框架的一部分,因为我链接的页面上没有提到

编辑1

在这里,我回答了另一个与文本大小相关的问题,同时我希望为您编写一个示例=

编辑2

回答你的问题。下一步编辑的是示例代码=P

编辑3

免责声明:此代码未经测试,我对此一无所知。为了测试它,某些更改可能是必须的。这为实现您似乎想要实现的目标提供了指导。也许有更好的方法,但我知道这个方法很有效。好的,这个算法是有效的,你可以从我的其他答案中看到

而不是行:

SizeF fontSize = 30.0F;
while (g.MeasureString(shipmentData.LongDesc, f)...)
您还可以执行以下操作:

var fontSize = _dataItemHintBox.Font.Size;
为什么会这样

因为Font.Size属性是只读的。因此,您需要在每次更改Font.Size时创建一个新的类实例

在您的比较中,不要使用该行:

SizeF fontSize = 30.0F;
while (g.MeasureString(shipmentData.LongDesc, f)...)
您还可以:

while (g.MeasureString(shipmentData.LongDesc, _dataItemHintBox.Font)...)
这将消除对第二个字体类实例的需求,即f

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

我希望这有帮助=

你可以用这个方法

如果您需要的话,我可以在您的面板上提供一个文本分配的代码示例,使用MeasureString方法提供一个代码示例

我无法知道Graphics.MeasureString方法是否是Compact框架的一部分,因为我链接的页面上没有提到

编辑1

在这里,我回答了另一个与文本大小相关的问题,同时我希望为您编写一个示例=

编辑2

回答你的问题。下一步编辑的是示例代码=P

编辑3

免责声明:此代码未经测试,我对此一无所知。为了测试它,某些更改可能是必须的。这为实现您似乎想要实现的目标提供了指导。也许有更好的方法,但我知道这个方法很有效。好的,这个算法是有效的,你可以从我的其他答案中看到

而不是行:

SizeF fontSize = 30.0F;
while (g.MeasureString(shipmentData.LongDesc, f)...)
您还可以执行以下操作:

var fontSize = _dataItemHintBox.Font.Size;
为什么会这样

因为Font.Size属性是只读的。因此,您需要在每次更改Font.Size时创建一个新的类实例

在您的比较中,不要使用该行:

SizeF fontSize = 30.0F;
while (g.MeasureString(shipmentData.LongDesc, f)...)
您还可以:

while (g.MeasureString(shipmentData.LongDesc, _dataItemHintBox.Font)...)
这将消除对第二个字体类实例的需求,即f

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


我希望这有帮助=

您可以使用任何适合您的重载。使用此函数,可以确定字符串的实际渲染大小,并相应地调整面板的大小

如果您试图在绘制事件内部进行测量,则可以在e.Graphics对象上使用MeasureString函数,但调整绘制内部的大小是不明智的。使用TextRenderer可以避免使用CreateGraphics创建图形对象,并在完成后将其处理掉

编辑

由于compact framework不支持TextRenderer,我第一次看到这个问题时就错过了标记,因此必须在图形对象上使用函数。大概是这样的:

public Size GetStringSize(string text)
{
    using(Graphics g = yourPanel.CreateGraphics())
    {
        return g.MeasureString(text, yourPanel.Font);
    }
}

您可以使用任何适合您的重载。使用此函数,可以确定字符串的实际渲染大小,并相应地调整面板的大小

如果您试图在绘制事件内部进行测量,则可以在e.Graphics对象上使用MeasureString函数,但调整绘制内部的大小是不明智的。乌辛 g TextRenderer避免了必须使用CreateGraphics创建图形对象,并在完成后将其处理掉

编辑

由于compact framework不支持TextRenderer,我第一次看到这个问题时就错过了标记,因此必须在图形对象上使用函数。大概是这样的:

public Size GetStringSize(string text)
{
    using(Graphics g = yourPanel.CreateGraphics())
    {
        return g.MeasureString(text, yourPanel.Font);
    }
}

唉,TextRenderer不是compact框架的一部分。但是如果我在一个普通的.net问题上遇到了这个问题,那就很好了。谢谢你的示例代码。但是,您发布的第二个度量也不是紧凑框架的一部分。此链接显示移动设备图标仅支持您使用的第一个,TextRenderer不是compact框架的一部分。但是如果我在一个普通的.net问题上遇到了这个问题,那就很好了。谢谢你的示例代码。但是,您发布的第二个度量也不是紧凑框架的一部分。此链接显示移动设备图标仅支持您使用的第一个图标。MeasureString是compact框架的一部分。我的作业很简单。我有我的面板,我为它设置了文本。我将把代码添加到我的问题中。由于我不想在Paint方法中调整大小,我猜我将不得不以某种方式创建一个图形实例。为此,请在“using”语句中使用control.CreateGraphics。感谢您对此的持续关注,但我不知道至少通过MeasureString是可能的,因为在紧凑的框架中不能为方法提供宽度。我必须制定自己的单词包装算法。这听起来很复杂,而且容易出错。您不必提供宽度。大小、高度和宽度是为测量方法提供的字体的一部分。然后,作为回报,您得到了一个Size类实例,然后您可以得到结果Height或Width.Graphics.MeasureString是compact框架的一部分。我的作业很简单。我有我的面板,我为它设置了文本。我将把代码添加到我的问题中。由于我不想在Paint方法中调整大小,我猜我将不得不以某种方式创建一个图形实例。为此,请在“using”语句中使用control.CreateGraphics。感谢您对此的持续关注,但我不知道至少通过MeasureString是可能的,因为在紧凑的框架中不能为方法提供宽度。我必须制定自己的单词包装算法。这听起来很复杂,而且容易出错。您不必提供宽度。大小、高度和宽度是为测量方法提供的字体的一部分。然后,作为回报,您得到了一个Size类实例,然后您可以得到结果的高度或宽度。+1因为紧凑型框架问题可能会带来不同于完整框架本身的解决方案。+1因为紧凑型框架问题可能会带来不同于完整框架本身的解决方案。