最近工作需要实现字符滚动效果。经过摸索与众多人的指点。现总结如下:
一、双缓冲实现 开始用双缓冲实现,将所有字符画在一个画布上,然后计时移动画布。
code:
.h
//double cache
CFbsBitmap* iOffScrnBmp;
CFbsBitmapDevice* iOffScrnBmpDevice;
CFbsBitGc* iOffScrnContext;
...
//.cpp
void ConstructL()
{
....
//双缓冲初始化
iOffScrnBmp = new (ELeave) CFbsBitmap;
User::LeaveIfError(iOffScrnBmp->Create(TSize(width,height), EColor16M));
iOffScrnBmpDevice = CFbsBitmapDevice::NewL(iOffScrnBmp); User::LeaveIfError(iOffScrnBmpDevice->CreateContext(iOffScrnContext));
....
}
Draw()
{
iOffScrnContext->UseFont(Font());
iOffScrnContext->SetPenStyle(CGraphicsContext:: ESolidPen); iOffScrnContext->SetPenColor(KRgbBlack);}
iOffScrnBmpDevice->Resize(TSize(total_w,text_h));
iOffScrnContext->Resized();
iOffScrnContext->DrawText(ptr,TPoint(0,text_h));
if(iScrollStep*step_w>=total_w)
{
iScrollStep = 0;
EndScrollImpresa();
}
if(iScrollStep ==0)
{
.....
}else
{
TInt scroll_w = iScrollStep*step_w; //已滑动宽度
TRect rc(TPoint(scroll_w,0),TSize(impreRect.Width(),impreRect.Height()));
gc.SetDrawMode(CGraphicsContext::EDrawModeAND); //去掉白底
gc.BitBlt(impreRect.iTl, iOffScrnBmp,rc);
}
}
二。第二种方法就是设置剪切区域,剪切区域就是只需要画的区域。
gc.SetClippingRect(impreRect);
TRect txtRect=TRect(TPoint(-scroll_w,impreRect.iTl.iY),TSize(total_w,text_h));
gc.DrawText(ptr,txtRect,text_h);
gc.CancelClippingRect();
一、双缓冲实现 开始用双缓冲实现,将所有字符画在一个画布上,然后计时移动画布。
code:
.h
//double cache
CFbsBitmap* iOffScrnBmp;
CFbsBitmapDevice* iOffScrnBmpDevice;
CFbsBitGc* iOffScrnContext;
...
//.cpp
void ConstructL()
{
....
//双缓冲初始化
iOffScrnBmp = new (ELeave) CFbsBitmap;
User::LeaveIfError(iOffScrnBmp->Create(TSize(width,height), EColor16M));
iOffScrnBmpDevice = CFbsBitmapDevice::NewL(iOffScrnBmp); User::LeaveIfError(iOffScrnBmpDevice->CreateContext(iOffScrnContext));
....
}
Draw()
{
iOffScrnContext->UseFont(Font());
iOffScrnContext->SetPenStyle(CGraphicsContext:: ESolidPen); iOffScrnContext->SetPenColor(KRgbBlack);}
iOffScrnBmpDevice->Resize(TSize(total_w,text_h));
iOffScrnContext->Resized();
iOffScrnContext->DrawText(ptr,TPoint(0,text_h));
if(iScrollStep*step_w>=total_w)
{
iScrollStep = 0;
EndScrollImpresa();
}
if(iScrollStep ==0)
{
.....
}else
{
TInt scroll_w = iScrollStep*step_w; //已滑动宽度
TRect rc(TPoint(scroll_w,0),TSize(impreRect.Width(),impreRect.Height()));
gc.SetDrawMode(CGraphicsContext::EDrawModeAND); //去掉白底
gc.BitBlt(impreRect.iTl, iOffScrnBmp,rc);
}
}
二。第二种方法就是设置剪切区域,剪切区域就是只需要画的区域。
gc.SetClippingRect(impreRect);
TRect txtRect=TRect(TPoint(-scroll_w,impreRect.iTl.iY),TSize(total_w,text_h));
gc.DrawText(ptr,txtRect,text_h);
gc.CancelClippingRect();