C#查询MeasureString时标签是否忽略空格?

时间:2015-08-21 07:57:41

标签: c# measurestring

我一直在尝试在自动收报机磁带类型应用程序中找到错误。 希望这个背景不长。

背景 自动收报机磁带需要从右侧开始显示字符,然后向左滚动。 我需要使用标签(或者我?),因为应用程序是Windows窗体并且需要背景颜色才能透明。有问题使用不同的控件。 控件大小和字体未知,必须在运行时计算。

自动收报机磁带的主要情况首先是我们需要PAD到显示字符串左侧的开始。

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

应该向右移动最后一个字符的结尾,直到最后一个字符全部在左边。然后该消息就完成了。

我有2个关于这个问题的功能:

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);

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这解决了与MeasureString相关的问题:

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

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

谢谢GSerg!