1.拖一个timerl控件:
2.拖一个panel控件用于覆盖滚动条(起到隐藏滚动条的效果):
3.再拖一个skinWaterTextBox控件到panel上面(演示用),名称为skinWaterTextBox1,text属性添加内容:
4.窗体加载事件中添加启动定时器代码:
// 项目简介滚动
this.timer1.Interval = 1000;
this.timer1.Tick += timer1_Tick;//到时间的时候执行事件;
this.timer1.Start();
5.继续添加如下方法:
// 发送消息
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
// 获取滚动条位置
[DllImport("user32.dll")]
public static extern int GetScrollPos(IntPtr hwnd, int nBar);
// 设置滚动条位置
[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);
public const int EM_LINESCROLL = 0xb6;
private void timer1_Tick(object sender, EventArgs e)
{
int i = GetScrollPos(this.skinWaterTextBox1.Handle, 1);
// 向下滚动一行
SendMessage(this.skinWaterTextBox1.Handle, EM_LINESCROLL, 0, 1); // 0,1代表垂直滚动条向下滚动
// 判断是否有位置变化,如果没有则说明到了底部,返回开始处
if (i == GetScrollPos(this.skinWaterTextBox1.Handle, 1))
{
// 回到顶部,这里用SetScrollPos似乎有问题,滚动条和文字不是同步更新
this.skinWaterTextBox1.SelectionStart = 0;
this.skinWaterTextBox1.SelectionLength = 1;
this.skinWaterTextBox1.ScrollToCaret();
this.skinWaterTextBox1.SelectionLength = 0;
}
Console.WriteLine(i);
}
private void textBox1_MouseEnter(object sender, EventArgs e)
{
this.timer1.Stop();
}
private void textBox1_MouseLeave(object sender, EventArgs e)
{
this.timer1.Start();
}
6.分别将textBox1_MouseEnter和textBox1_MouseLeave方法添加到skinWaterTextBox1的mouseHover和mouseLeave事件:
附加panel定时循环滚动方法:
//----------------------------写在窗口加载方法中-------------------------//
this.timer2.Interval = 1000;
this.timer2.Tick += timer2_Tick;//到时间的时候执行事件
this.timer2.Start();
//----------------------------写在定时器方法中---------------------------//
/// <summary>
/// panel定时循环滚动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer2_Tick(object sender, EventArgs e)
{
int maximum = skinPanel16.VerticalScroll.Maximum;
int smallChange = skinPanel16.VerticalScroll.SmallChange;
int largeChange = skinPanel16.VerticalScroll.LargeChange;
int minimum = skinPanel16.VerticalScroll.Minimum;
int currtValue = skinPanel16.VerticalScroll.Value;
// 判断是否有位置变化,如果没有则说明到了底部,返回开始处
if ((currtValue + largeChange) >= maximum)
{
skinPanel16.VerticalScroll.Value = 0;
}
else
{
skinPanel16.VerticalScroll.Value += 20;
}
}