需求如下:
1.在一个控件中 以列表的方式 显示 N个多行文本(设这个多行文本为一个元素TextElement吧)(其实就是TMD聊天记录),其中多行文本的显示已经解决,上下翻功能也已解决,但杯具的是,如果我以TextElement为单位进行滚动,由于元素高度不一致,会导致翻上去后回滚时 焦点元素在裁剪矩形以外。。
那么我准备多缓冲的方式来进行滚动,这种方式显然可以解决问题,但计算有些麻烦。。
现求告知,symbian平台有没有一个 可以Item不定高度的 ListView控件,以满足此需求。。。。
接触symbian一个半月,快疯了,你们来救救偶啊!
下面是偶的绘制源码,未做整理,比较拉杂!
TInt CChatContainer::DrawMessageView(CWindowGc& gc) const
{
TRect allrect = CAppUi::Static()->ApplicationRect();
allrect.iTl.iX += MarginLeft;
allrect.iTl.iY += TabHeight;
allrect.SetWidth(allrect.Width()-MarginRight);
allrect.SetHeight(allrect.Height()-TabHeight-EditHeight);
gc.SetBrushColor(TRgb(0,25,255));
gc.Clear(allrect);
TInt flagHeight=0;
gc.SetPenColor(TRgb(25,50,100));
gc.DrawRect(allrect);
const CFont* font = CAppUi::Static()->GetCustomizeFont();
TFontSpec spec=font->FontSpecInTwips();
spec.iHeight=30;
gc.UseFont(font);
TInt TextWidth=font->WidthZeroInPixels();
TInt TextHeight=font->HeightInPixels();
CMessage* message=0;
TInt maxline=100;
if(this->UD==1)
{
flagHeight=allrect.Height();
for(TInt i= this->StartIndex;i>-1;i--)
{
if(flagHeight<0) break;
message=iMsgs.operator [](i);
TInt LorR=0;
HBufC* buffer;
TBidiText *bidi=0;
this->EndIndex+=1;
if(message->GetTransferType()==CMessage::Revc||message->GetTransferType()==CMessage::Revced)
{
LorR=1;
}
else if(message->GetTransferType()==CMessage::Send||message->GetTransferType()==CMessage::Sended)
{
LorR=2;
}
gc.SetClippingRect(allrect);
switch(message->GetFileType())
{
case CMessage::Text:
buffer=message->GetLocal();
bidi=TBidiText::NewL(buffer->Des(),maxline);
bidi->WrapText(allrect.Width()-50,*font,NULL);
flagHeight=flagHeight-(bidi->NumberOfLinesInDisplayText()*TextHeight+5);
TRect rect2 = TRect(allrect.iTl.iX+5,flagHeight+TabHeight,allrect.iTl.iX+5+allrect.Width()-50,flagHeight+TabHeight+bidi->NumberOfLinesInDisplayText()*TextHeight+3);
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
gc.SetBrushColor(TRgb(55,110,255));
gc.SetPenColor(TRgb(110,220,255));
if(this->CurrentIndex==i)
{
gc.SetBrushColor(TRgb(255,125,2));
}
else gc.SetBrushColor(TRgb(55,110,255));
gc.DrawRoundRect(rect2,TSize(5,5));
gc.SetPenColor(TRgb(155,220,2));
gc.SetBrushStyle(CGraphicsContext::ENullBrush);
bidi->DrawText(gc,TPoint(allrect.iTl.iX+5,flagHeight+TabHeight+TextHeight),15);
this->EndIndex=i;
delete bidi;
break;
case CMessage::Image:
break;
case CMessage::Sound:
break;
case CMessage::Video:
break;
default:
break;
}
}
}
if(this->UD==2)
{
flagHeight=0;
for(TInt i= this->EndIndex;i<this->iMsgs.Count()-1;i++)
{
message=iMsgs.operator [](i);
TInt LorR=0;
HBufC* buffer;
TBidiText *bidi=0;
if(message->GetTransferType()==CMessage::Revc||message->GetTransferType()==CMessage::Revced)
{
LorR=1;
}
else if(message->GetTransferType()==CMessage::Send||message->GetTransferType()==CMessage::Sended)
{
LorR=2;
}