2

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

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

自动收报机的主要场景首先是我们需要在显示字符串左侧填充的开始。

我们去掉前面的字符并添加字符的中间仍然需要显示。

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

4

2 回答 2

1

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

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

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

谢谢GSerg!

于 2015-08-21T08:27:12.990 回答
0
SizeF size = g.MeasureString(text, tstLabel.Font, tstLabel.ClientSize,
    new StringFormat(StringFormatFlags.MeasureTrailingSpaces));

但是,如果您想使用与 WinForms 相同的渲染,请改用TextRenderer.MeasureTextand TextRenderer.DrawText。从 .NET 2.0 开始,Graphics.MeasureStringDrawStringUseCompatibleTextRendering属性为 true 时使用。

于 2015-08-21T08:26:03.230 回答