当前位置: 代码迷 >> Symbian >> 小弟我知错了,你们救救小弟我的命…symbian 小弟我悔改
  详细解决方案

小弟我知错了,你们救救小弟我的命…symbian 小弟我悔改

热度:7851   发布时间:2013-02-26 00:00:00.0
我知错了,你们救救我的命……symbian 我悔改
需求如下:
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;
 
  }