我想出了一个标签将一个单词滚动到一边,然后更改单词并滚动回另一个单词的想法
"ping "
" ping "
" ping "
" ping "
" ping "
" ping "
" ping "
" ping "
" ping "
" ping "
" ping "
" ping"
" pong"
" pong "
" pong "
" pong "
" pong "
" pong "
" pong "
" pong "
" pong "
" pong "
" pong "
"pong "
我希望它只在一个恒定的循环中做^^但我不知道如何开始这样做我真的很感激它,如果有人可以帮我这个。文本的最大长度必须为15个字符。
我不在乎它是否是平滑滚动。
我希望它成为Winforms应用程序并使用.Net framework 4.0。
答案 0 :(得分:1)
这就是我要做的事情,当我测试它时似乎工作得很好,我创建了一个带有计时器和标签的窗体。确保在打开表单时调用timer.Start(),它将开始在屏幕上弹跳。如果将iUBound更改为更大的值,它将在屏幕上移动更多空格。
string _sPing = "ping";
string _sPong = "pong";
bool bGoingUp = true;
int iUBound = 15;
int iCnt = 1;
public Form1()
{
InitializeComponent();
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (bGoingUp)
{
label1.Text = " " + label1.Text;
iCnt++;
}
else
{
label1.Text = label1.Text.Substring(1,label1.Text.Length - 1);
iCnt--;
}
if (iCnt == iUBound)
{
bGoingUp = false;
label1.Text = label1.Text.Replace(_sPing, _sPong);
}
else if (iCnt == 1)
{
bGoingUp = true;
label1.Text = label1.Text.Replace(_sPong, _sPing);
}
}
答案 1 :(得分:1)
我保持标签内容相同,只需移动标签,感觉它应该减少CPU负载,滚动会更顺畅。
答案 2 :(得分:0)
创建一个从0到11的for循环(15 - " ping"的长度)。使用new String(' ', i)
,您可以创建长i
个字符的字符串。然后将标签的文本设置为此空格字符串,连接单词" ping"。
现在你可以创建另一个循环,从11运行到0,执行相同的操作但是使用" pong"。
如果将两个循环包含在无限循环(while (true) { ... }
)中,这将无限期地运行。
您还可能希望每次使用Thread.Sleep(200)
设置标签文本后添加暂停。您指定的时间以毫秒为单位。
转到属性窗口中的“事件”选项卡,然后添加Shown
事件处理程序
private void frmMarquee_Shown(object sender, EventArgs e)
{
while (true) {
for (int i = 0; i <= 11; i++) {
label1.Text = new String(' ', i) + "ping";
System.Threading.Thread.Sleep(100);
Application.DoEvents();
}
for (int i = 11; i >= 0; i--) {
label1.Text = new String(' ', i) + "pong";
System.Threading.Thread.Sleep(100);
Application.DoEvents();
}
}
}
请注意,此解决方案并不完美,因为表单无法正常关闭。你将不得不中止该计划。使用计时器的解决方案将更顺畅,表单在关闭时将按预期运行,但这是一个简单明了的解决方案。
答案 3 :(得分:0)
我找到了this example。非常接近你想要的。这两个关键元素是:(1)使用StringBuilder函数追加字符;(2)使用异步委托将动画放在不同的线程中。
StringBuilder
的想法很棒,因为处理String
应该更有效率。我喜欢Asynchronous delegate
,因为它听起来比Timer