1

我的应用程序中有一行 CEikLabel 需要滚动文本。

想到的简单解决方案(但可能是幼稚的)就像..

[begin pseduo code]

 on timer.fire {
  set slightly shifted text in label
  redraw label
 }
 start timer

[end pseudo code]

在每次更新时使用 CPeriodic 类作为计时器和 label.DrawDeferred()。

您认为这是最好的方法吗,每秒重绘标签两到三遍可能效率很低..但是还有其他方法吗?

谢谢 :)

4

3 回答 3

1

我不知道是否有另一种方法可以做到,也不能说你脑海中的方法是否会效率低下。但是,您可能想看看这个线程,它讨论了与您的问题几乎相同的问题,并且还简要提到了与您构想的解决方案有些相同的解决方案。

于 2008-12-02T11:10:22.430 回答
1

我已经看到用于在列表框中滚动项目名称的基于计时器的解决方案。

需要注意的几件事是它在滚动时可能会闪烁,并且您需要确保放在标签上的文本不会太长,否则它会自动剪切字符串并添加省略号 (.. .)

用于TextUtils::ClipToFit获取适合标签的字符串并在将文本放在标签上之前删除它添加的省略号(KTextUtilClipEndChar在您剪切的字符串中搜索)。在将字符串传递给剪辑函数之前,您需要计算在字符串的开头要跳过多少个字符。

于 2008-12-02T11:47:59.110 回答
1

我已经这样做了

TTimeIntervalMicroSeconds32 scrolltime(70000);
iPeriodicScroll = CPeriodic::NewL(CActive::EPriorityIdle);
iPeriodicScroll->Start(scrolltime, scrolltime, TCallBack(CVisTagContainerView::ScrollTextL, this));

然后在重复的函数中

CEikLabel *label = iContainer->Label();
const TDesC16 *temp = label->Text();
if (temp->Length() <= 0) { 
    if (iTextState != ETextIdle) { return; }
    DownloadMoreTextL();
    return;
}
TPtrC16 right = temp->Right(temp->Length()-1);
label->SetTextL(right);
label->DrawDeferred();

所以文本从右向左移动,当全部消失时,标签由 DownloadMoreTextL 重新填充

于 2008-12-04T09:45:24.753 回答