C# winform实现字幕向上滚动

wc_ling 2016-03-07 05:01:23
文字如下:
1111111111111111111111
2222222222222222222222222
3333333333333333333333333
4444444444444444444444
5555555555555555555555555
5555555555555555555555555
5555555555555555555555555

文字是有一定格式的
想实现一个winform程序实现以上文字向上滚动

也就是说窗口只能显示3行,当4行出显时,顶掉第一行

求。。。
...全文
906 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sp1234_maJia 2016-03-15
  • 打赏
  • 举报
回复
SetLocationY(0); 改为 SetLocationY(yd + c.Height); 或许更好一些。
  • 打赏
  • 举报
回复
嗯,把 tmr 声明到外边持续引用它吧:
System.Threading.Timer tmr;

private void ScrollStart()
{
    panel1.Controls.Clear();
    UserControl1 c;
    int height;
    do
    {
        c = new UserControl1();
        panel1.Controls.Add(c);
        height = SetLocationY(0);
    } while (height - c.Height < panel1.Height);
    var d = 5;  //每次移动5像素。你可以自由调整此值
    c = (UserControl1)panel1.Controls[0];
    c.Dock = DockStyle.None;
    tmr = new System.Threading.Timer(h =>
    {
        panel1.BeginInvoke((Action)delegate
        {
            var loc = c.Location;
            var yd = loc.Y - d;
            if (yd <= -c.Height)
                SetLocationY(0);
            else
                SetLocationY(yd);
        });
    }, null, 200, 200);
}

private int SetLocationY(int y)
{
    foreach (UserControl1 c in panel1.Controls)
    {
        c.Location = new Point(0, y);
        y += c.Height;
    }
    return y;
}
  • 打赏
  • 举报
回复
这可以在任意 Panel 中任意滚动你的 UserControl!显然,这个用户控件里边你可以放入任何东西,绝不仅仅是什么几行文字。 其实原理也比较简单。 1. 首先,在 While 之前的部分的代码,你要在 Panel 中从上至下地、重复复制 n 个 UserControl1 实例,直到它完全充满 Panel,并且还要高出一点。因为有滚动出去的部分,所有panel 内容要准备高出 panel 高度恰好 c.Height 那么多。 2. 然后,在While下边的代码就是创建一个定时器,以0.2秒移动5个像素的步长,向上滚动 Panel 中的内容。当滚动出去“那一块”恰好达到 c.Height,这时候说明Panel底部没有更多的内容要滚入了,这时候就重新从 0 高度开始再显示所有 usercontrol,看上去就是连续滚动了!
  • 打赏
  • 举报
回复
这个原理模式很简单,我给你说一下过程。 1. 先创建一个 UserControl,假设名为 UserControl1,里边拖入 label、MonthCalendar、checkbox 等等随便什么控件。 2. 编译一下工程,然后回到 Form1 窗体设计画面,在“工具箱”中应该能看到此 usercontrol 图标出现,说明可动态添加内容了。 3. 在 Form1 中拖入一个 Panel 作为容器,它用来剪切滚动内容。 4. 最后编写滚动代码:
private void ScrollStart()
{
    panel1.Controls.Clear();
    UserControl1 c;
    int height;
    do
    {
        c = new UserControl1();
        panel1.Controls.Add(c);
        height = SetLocationY(0);
    } while (height - c.Height < panel1.Height);
    var d = 5;  //每次移动5像素。你可以自由调整此值
    c = (UserControl1)panel1.Controls[0];
    c.Dock = DockStyle.None;
    var tmr = new System.Threading.Timer(h =>
    {
        panel1.BeginInvoke((Action)delegate
        {
            var loc = c.Location;
            var yd = loc.Y - d;
            if (yd <= -c.Height)
                SetLocationY(0);
            else
                SetLocationY(yd);
        });
    }, null, 200, 200);
}

private int SetLocationY(int y)
{
    foreach (UserControl1 c in panel1.Controls)
    {
        c.Location = new Point(0, y);
        y += c.Height;
    }
    return y;
}
你可以把这个封装为一个通用控件(因为输入模式很简单),我就懒得弄了。
兵工厂三剑客 2016-03-15
  • 打赏
  • 举报
回复
这是我弄的2行文字竖着且循环滚的:
private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Location = new Point(label1.Location.X, label1.Location.Y - 10);
            label2.Location = new Point(label2.Location.X, label2.Location.Y - 10);
            if (label1.Location.Y < -100)
            {
                label1.Location = new Point(label1.Location.X, this.ClientSize.Height);
            }
            if (label2.Location.Y < -100)
            {
                label2.Location = new Point(label2.Location.X, this.ClientSize.Height);
            }
        }
你的这个也不难。方法很多。不过用7楼的方法貌似最简单。
飞天凤凰601 2016-03-08
  • 打赏
  • 举报
回复
实现超简单。我做过这种东西 你用panel作为显示板, 然后把label作为显示内容, 向上滚动,不就是改变label.top吗?当top为负数时,就向上移动了……。 你试试就知道
Justin-Liu 2016-03-08
  • 打赏
  • 举报
回复
网上搜搜网上有
bingdaoice 2016-03-08
  • 打赏
  • 举报
回复
用一个listBox 将数据插入到listBox,再用一个timer控件, private void timerCar_Tick(object sender, EventArgs e) { #region ListBox从下向上滚动 if (listBox.Top < -listBox.Height) { listBox.Top = this.panel.Height; } listBox.Top = listBox.Top - 1; this.Focus(); #endregion }
bingdaoice 2016-03-08
  • 打赏
  • 举报
回复
将ListBox放到panel中
wizzly 2016-03-07
  • 打赏
  • 举报
回复
要做看板的样子,自己写个控件
crystal_lz 2016-03-07
  • 打赏
  • 举报
回复
引用 2 楼 wc_ling 的回复:
[quote=引用 1 楼 xian_wwq 的回复:] 就这么点数据, 每轮显示更新下数据源就行了
大哥,以上数据只是个例子,真数据有几千个汉字呢[/quote] 才几千个汉字而已 紧张个啥? 直接把它读取到一个 string[] 中不就搞定了 每次从里面取出三行 放入 textbox 不就搞定了
wc_ling 2016-03-07
  • 打赏
  • 举报
回复
引用 1 楼 xian_wwq 的回复:
就这么点数据, 每轮显示更新下数据源就行了
大哥,以上数据只是个例子,真数据有几千个汉字呢
xian_wwq 2016-03-07
  • 打赏
  • 举报
回复
就这么点数据, 每轮显示更新下数据源就行了

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧