我一直在尝试在自动收报机磁带类型应用程序中找到错误。 希望这个背景不长。
背景 自动收报机磁带需要从右侧开始显示字符,然后向左滚动。 我需要使用标签(或者我?),因为应用程序是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);
答案 0 :(得分:0)
SizeF size = g.MeasureString(text, tstLabel.Font, tstLabel.ClientSize,
new StringFormat(StringFormatFlags.MeasureTrailingSpaces));
但是,如果要使用与WinForms相同的呈现,请改用TextRenderer.MeasureText
和TextRenderer.DrawText
。从.NET 2.0开始Graphics.MeasureString
和DrawString
仅在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!