C#在查询MeasureString时,标签是否忽略空白

本文关键字:是否 空白 标签 查询 MeasureString | 更新日期: 2023-09-27 18:09:15

我一直在尝试在一个自动行情带类型的应用程序中查找错误。希望这种背景不会持续太久。

背景:自动行情带需要显示从右边开始的字符,然后向左滚动。我需要使用标签(或者我需要吗?(,因为应用程序是windows窗体,并且需要透明的背景色。使用不同的控件时出现问题。控件大小和字体未知,必须在运行时计算。

股票行情带有主要场景,首先是我们需要PAD到显示字符串左侧的开始。

我们删除前面的字符和添加字符的中间部分仍然需要显示。

应该向右PAD移动最后一个字符很长一段时间直到最后一个角色的结尾都是向左的。然后消息就完成了。

我有两个功能,这个问题是关于:

1( 它使用控件和字体来计算显示文本的大小。

2( 应用程序的核心是返回显示文本的函数。

问题:

开头和中间的场景非常完美,如果我用空格填充,结尾就不起作用,但如果我使用任何其他可见字符,比如".",它就起作用。

尺寸功能:

 Label tstLabel = new Label();
 tstLabel.Size = DisplaySize;
 tstLabel.Font = new Font(currentMessage.Font, currentMessage.Fonsize);
 var g = Graphics.FromHwnd(tstLabel.Handle);
 SizeF size = g.MeasureString(text, tstLabel.Font);
 return size;

显示文本功能:

SizeF spaceSize = getSize(" ");
string text = "";
if(currentCharacter < currentMessage.MessageText.Length )
{
     text = currentMessage.MessageText.Substring(0, currentCharacter + 1);
     SizeF displayTextSize = getSize(text);
     if (displayTextSize.Width <= DisplaySize.Width)
     {
          int numSpaces = Convert.ToInt32((DisplaySize.Width - displayTextSize.Width) / spaceSize.Width);
          text = text.PadLeft(numSpaces + text.Length, ' ');
                        currentCharacter++;
                        #endregion
                    }
                    else
                    {
                        #region Pop char off front
                        bool keepPadding = true;
                        do
                        {
                            text = text.Substring(1, text.Length - 1);
                            displayTextSize = getSize(text);
                            if (displayTextSize.Width <= DisplaySize.Width)
                            {
                                keepPadding = false;
                            }
                        } while (keepPadding);
                        currentCharacter++;
                        #endregion
                    }
                }
                else
                {
                    #region Pop char off front and Pad to right
                    text = currentMessage.MessageText.PadRight(currentCharacter+1,'.');
                    bool keepPadding = true;
                    do
                    {
                        text = text.Substring(1, text.Length - 1);
                        SizeF endTextSize = getSize(text);
                        if (endTextSize.Width <= DisplaySize.Width)
                        {
                            if ((DisplaySize.Width - endTextSize.Width) > spaceSize.Width)
                            {
                                do
                                {
                                    text += ".";
                                    endTextSize = getSize(text);
                                    currentCharacter++;
                                } while ((DisplaySize.Width - endTextSize.Width) > spaceSize.Width);
                            }
                            keepPadding = false;
                        }
                    } while (keepPadding);
                    currentCharacter++;
                    if (checkMessage(text))
                        nextMessage = true;
                }
                return text;

问题:

当在标签上执行下面的函数时,文本后面有空格,为什么它返回相同的大小?

SizeF size=g.MeasureString(text,tstLabel.Font(;

C#在查询MeasureString时,标签是否忽略空白

这修复了与MeasureString:相关的问题

 StringFormat strFormat = new StringFormat(StringFormat.GenericTypographic)
                        {
                            FormatFlags = StringFormatFlags.MeasureTrailingSpaces
                        };
                        size = g.MeasureString(text, tstLabel.Font, tstLabel.Size.Width, strFormat);

谢谢GSerg!

SizeF size = g.MeasureString(text, tstLabel.Font, tstLabel.ClientSize,
    new StringFormat(StringFormatFlags.MeasureTrailingSpaces));

但是,如果要使用与WinForms相同的渲染,请改用TextRenderer.MeasureTextTextRenderer.DrawText。从.NET 2.0开始,仅当UseCompatibleTextRendering属性为true时才使用Graphics.MeasureStringDrawString