使用自动换行垂直滚动文本

时间:2015-02-19 15:19:43

标签: c# forms c#-4.0

我有一些可变长度的文本,必要时,我想垂直滚动。这里可以看到一个例子: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;
    }
}

1 个答案:

答案 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!)

enter image description here