最近

由于空间问题,这里关闭了大半个月,不过Google中还是第一:)最近工作上在忙完D900后又开始D2000的“整合”,程序是D900的UI是D1100P的。这种整合要做很多基础性修改工作,要细心更要耐心。 

idle界面的Banner若设为动画则背景为黑色

对在idle界面的Banner若设为动画则背景为黑色的分析:
在Appidle.cpp文件中:
ControlP->SetText(StringP,TRUE);
在Uistatictextcontrol.cpp中
 void StaticTextControlC::SetText(const StringT*
StringResP,bool AnimationYesNo)
             {
 SetAnimationYesNo = AnimationYesNo;
              }
 void StaticTextControlC::Draw()
             {
                    if( !mBorder && SetAnimationYesNo )
{
   
DispEraseRect(&mDC, &CtrlRect);
}
              }
问题就出在DispEraseRect(&mDC,
&CtrlRect),它会调用DispFillSolidRect(dc, Rect, dc->BackColor);
使用BackColor的颜色填充此BannerRect,默认的BackColor为黑色。
解决方法尝试:
             1.屏蔽掉DispEraseRect(&mDC,
&CtrlRect);这样虽然不显示黑色背景了,但
Banner会不断自我重叠,无法正常显示
             2.屏蔽掉上句后,使用HwdUpdateDisplayRect(NULL,&drt);更新,但显示依然不正常还会重叠。又尝试了对局部和全屏刷新,问题依旧。
3.ImageResT dataBuffer;
   DispBitmapT mBitmap;
   GET_RESOURCE(ResourceDatabase,
(ImageResT*)IDI_MENUITEM_BG_BMP, &dataBuffer);
  
GetBitmapFromImage(dataBuffer,&mBitmap);
 DispBitBlt(&mDC, CtrlRect.x, CtrlRect.y,
CtrlRect.dx, CtrlRect.dy, &mBitmap, 0,0);
   //可以在屏幕的任意位置画图形。
上面实现了在Banner下面画上背景图,但问题是要当前Idle的图片
4. 继续尝试着读取当前画面
   ImageResT dataBuffer;
   //DispBitmapT mBitmap;
 // GET_RESOURCE(ResourceDatabase,
(ImageResT*)IDI_MENUITEM_BG_BMP, &dataBuffer);
   DispBitmapT*
mBitmap=DispGetDeviceBitmap(&mDC)
  
GetBitmapFromImage(dataBuffer,mBitmap);
 DispBitBlt(&mDC, CtrlRect.x, CtrlRect.y,
CtrlRect.dx, CtrlRect.dy, mBitmap, 0,34);
问题依然,虽能读取当前画面,但当前面画随着DrawText还是会每次都叠加,因为读取了是上次写上字的画面。
5.继续尝试当第一次读取画面时保存起来一个备份,以后就用这张不变的画面刷。
 ImageResT dataBuffer;
 // DispBitmapT mBitmap; 这类的定义中声名。
 GET_RESOURCE(ResourceDatabase,
(ImageResT*)IDI_MENUITEM_BG_BMP, &dataBuffer);
    if(IsNull(mBitmap))  
    {
    
mBitmap=DispGetDeviceBitmap(&mDC);
    }
  
GetBitmapFromImage(dataBuffer,mBitmap);
 DispBitBlt(&mDC, CtrlRect.x, CtrlRect.y,
CtrlRect.dx, CtrlRect.dy,
IdleApplicationC::GetInstance()->mBitmapForStaticTextctrl, 0,0);
问题依旧,随后把读取放在Appidle.cpp的Onlanch()中,在OnUpdateBanner()之前,但显示依然会重叠。
6.最后的解决办法
从SIDB中读取当前WallPaper的值,把对应的图片替换到第四种尝试中。
   else if( !mBorder &&
SetAnimationYesNo )
{      DialogC* TopDialogP =
DialogStackP->GetTopDialog();

   if
((TopDialogP->GetResourceId() ==(ResourceIdT)IDD_IDLE_DIALOG)||(TopDialogP->GetResourceId()
==(ResourceIdT)IDD_IDLE_NOTIME_DIALOG))
    { 
    FsiResultT SidbResult =
FSI_SUCCESS;
    uint32 Index = 0;
   uint32 size = sizeof(Index);
   SidbResult = FsiSidbRead(ITEM_DISPLAY,
KEY_SCREEN_WALLPAPER, (void *)&Index, 0, &size);
    if (IsEqual(SidbResult,
FSI_SUCCESS))
    {
           ImageResT dataBuffer;
           DispBitmapT mBitmap;
      if (Index <
gPhotoReservedNum)
      {
        ResourceDatabaseC::ErrorT ErrorCode =
GET_RESOURCE(ResourceDatabase, (ImageResT*)IdleBgBmpInfo[Index],
&dataBuffer);
        UIASSERT(IsEqual(ErrorCode,
ResourceDatabaseC::SUCCESS));
 GetBitmapFromImage(dataBuffer,&mBitmap);
        DispBitBlt(&mDC, CtrlRect.x,
CtrlRect.y, CtrlRect.dx, CtrlRect.dy, &mBitmap, 0,18);
      }
     }
     else
     {
DispEraseRect(&mDC, &CtrlRect);
     }
 }
问题解决。
局限性:1.不适用用户自己添加的WallPager,(D2000项目中不能客户自己添加)
        2.因为动画的刷新频率很高,这样读SIDB势必影响速度。
改善:
7.每次刷新都从SIDB里读一边很费时间与空间,要是能把读取图像放在Appidle中的OnUpdateWallPager中,那每次只有当更新WallPager时才读一边。于是,程序更为
Appidle中OnUpdateWallPager()中:
    if (IsEqual(SidbResult, FSI_SUCCESS))
    {
      char *BufferP = NULL;
      ImageResT dataBuffer; //ZJJ
      //UIASSERT(Index <= ARR_SIZE(IdleBgBmpInfo) –
1);
      //UIASSERT(Index <= (sizeof(IdleBgBmpInfo[]) /
sizeof(IdleBgBmpInfo[0]) – 1));
      if (Index < gPhotoReservedNum)
      {
        ResourceDatabaseC::ErrorT ErrorCode =
GET_RESOURCE(ResourceDatabase, (ResourceIdT)IdleBgBmpInfo[Index],
(void**)&BufferP);
        UIASSERT(IsEqual(ErrorCode,
ResourceDatabaseC::SUCCESS));
        
/******************zjj*************************/
         ResourceDatabaseC::ErrorT ErrorCode2 =
GET_RESOURCE(ResourceDatabase, (ImageResT*)IdleBgBmpInfo[Index],
&dataBuffer);
     UIASSERT(IsEqual(ErrorCode2,
ResourceDatabaseC::SUCCESS));
  GetBitmapFromImage(dataBuffer,&mBitmapForStaticText);
// mBitmapForStaticTextAppidle.h中声明为Pubilc DispBitmapT
mBitmapForStaticText;
        
/*******************zjj************************/
}
在 uistatictextctrl.cpp 中添加对 #include "appidle.h" 的引用
   else if( !mBorder && SetAnimationYesNo )
   {
   //Add by zjj for show background image when the statictextctrl is
rolling in idle 20080704
     DialogC* TopDialogP =
DialogStackP->GetTopDialog();
 if((TopDialogP->GetResourceId()==(ResourceIdT)IDD_IDLE_DIALOG)||(TopDialogP->GetResourceId()
==(ResourceIdT)IDD_IDLE_NOTIME_DIALOG))
     {
       
DispBitBlt(&mDC,CtrlRect.x,CtrlRect.y,CtrlRect.dx,CtrlRect.dy, &(IdleApplicationC::GetInstance()->mBitmapForStaticText),
0,18);
     }
     else
     {
      DispEraseRect(&mDC, &CtrlRect);
     }
   }
至此在即不影响效率的情况下实现了文本的滚动显示。
遗留问题:若用户要添加自定义背景图片,则不能正常滚动,背景是当前Dialog的背景色
解决:在添加自定义背景图片中用相同原理实现。
(D2000不支持用户自定义添加WallPager,以后有需求再添加)
注意:对头文件的引用。