我有一些可变长度的文本,必要时,我想垂直滚动。这里可以看到一个例子:https://social.msdn.microsoft.com/Forums/vstudio/en-US/77be2b96-b4b4-462c-b6d0-66c2c9739420/scroll-text-vertically 此示例中的解决方案的问题在于它不会对文本进行自动换行。我也看过一些例子,其中文本被绘制在一个矩形内,然后移动矩形以产生滚动文本的效果,但我不认为这对我有效。我有上下控件,我想滚动文字,文字高度高于屏幕高度。
我目前的OnPaintEvent:
private void JvsMessageLabelPaint(object sender, PaintEventArgs e)
{
e.Graphics.DrawString(this.mLabelToScrollVertically.Text,
this.mLabelToScrollVertically.Font, new SolidBrush(Color.Black),
this.mLabelToScrollVertically.Location.X, yPositionForLabel);
yPositionForLabel -= 5;
if (yPositionForLabel < this.mLabelToScrollVertically.Location.Y)
{
yPositionForLabel = this.mLabelToScrollVertically.Height;
}
}
答案 0 :(得分:0)
ScrollBars
创建控件的常见解决方法:将Panel
置于另一个Panel
内。制作外Panel
AutoScroll=true
并将内部Height
更改为您测量文本的内容。
以下是Paint
事件和结果:
private void pan_text_Paint(object sender, PaintEventArgs e)
{
string text = yourLongText;
SizeF size = e.Graphics.MeasureString(text, Font, pan_text.ClientSize.Width);
pan_text.Height = (int) size.Height;
e.Graphics.DrawString(text, Font, Brushes.Black, new RectangleF(PointF.Empty, size) );
}
ScrollBars
,那么相同的技巧就可以了。 只需不要制作外Panel AutoScroll
并添加Timer
:
private void StartButton_Click(object sender, EventArgs e)
{
timer1 = new Timer();
timer1.Interval = 15;
timer1.Tick += timer1_Tick;
timer1.Start();
}
void timer1_Tick2object sender, EventArgs e)
{
pan_image.Top -= 2;
if (pan_image.Top < -pan_image.Height) pan_image.Top = 0;
}
Panel
! 只需定义一个类变量来保存您想要在其中绘制文本的当前位置并使用此Tick
事件:
int curTop = 0;
void timer1_Tick(object sender, EventArgs e)
{
curTop -= 2;
if (curTop < -pan_image.Height) curTop = 0;
pan_image.Invalidate();
}
现在,如果您在DrawString
中使用它,则会显示相同的效果:
e.Graphics.DrawString(text, Font, Brushes.Black,
new RectangleF(new PointF(0, curTop), size) );
(当然,由于Panel
不再包含在外部版本中,因此您不会更改其Height
!)