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

C#在查询MeasureString时,标签是否会忽略空白?,c#,measurestring,C#,Measurestring,我一直在试图在一个自动售票机磁带类型的应用程序中找到一个错误。 希望这个背景不会太长 背景: 股票行情磁带需要从右开始显示字符,然后向左滚动。 由于应用程序是windows窗体,我需要使用标签(或者我需要吗?),并且需要透明的背景色。使用不同的控件时出现问题。 控件大小和字体未知,必须在运行时计算 股票行情带有几个主要场景,首先是我们需要在显示字符串的左侧填充的开始 我们删除前面字符并添加字符的中间部分仍然需要显示 将最后一个字符向右移动一段距离,直到最后一个字符全部向左移动。消息就完成了 我有

我一直在试图在一个自动售票机磁带类型的应用程序中找到一个错误。 希望这个背景不会太长

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

股票行情带有几个主要场景,首先是我们需要在显示字符串的左侧填充的开始

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

将最后一个字符向右移动一段距离,直到最后一个字符全部向左移动。消息就完成了

我有两个问题涉及的功能:

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 spaceSize=getSize(“”);
字符串文本=”;
if(currentCharacter但是,如果要使用与WinForms相同的呈现方式,请改用
TextRenderer.MeasureText
TextRenderer.DrawText
。从.NET 2.0
图形开始。仅当
UseCompatibleTextRendering
属性为true时,才使用MeasureString
DrawString

这解决了相关问题从测量到测量:

 StringFormat strFormat = new StringFormat(StringFormat.GenericTypographic)
                        {
                            FormatFlags = StringFormatFlags.MeasureTrailingSpaces

                        };
                        size = g.MeasureString(text, tstLabel.Font, tstLabel.Size.Width, strFormat);

谢谢GSerg!

这就是它的设计方式。你还想听到什么?为什么你首先要使用空白填充?这是标签控制或测量功能的问题吗?我如何确认它是如何设计的。我在这里没有看到任何问题。这两个功能只是行为不同,但这完全没问题。为什么不呢你只是移动标签,而不是填充文本?
 StringFormat strFormat = new StringFormat(StringFormat.GenericTypographic)
                        {
                            FormatFlags = StringFormatFlags.MeasureTrailingSpaces

                        };
                        size = g.MeasureString(text, tstLabel.Font, tstLabel.Size.Width, strFormat);