在BREW中打造自己的GUI(3)-做一个跑马灯的效果

有时如果我们在应用中需要提供一个滚动的信息提示条(类似于页面上的跑马灯marquee),其实也很容易做到,类似于我们前面做的菜单,下面我们也讨论一下吧。

跑马灯包括的数据结构如下:
struct  _IGMarquee  {
    
    
const AEEVTBL(IGMarquee) * pvt;

    uint32          m_nRefs;    
    IShell            
*m_pIShell;
    IDisplay        
*m_pIDisplay;
    IModule            
*m_pIModule;

    boolean            m_isActive;

    AEERect            m_Rect;

    uint16            lenText;
    uint16            posText;
    AECHAR            
*m_pText;

    uint16            m_delay;

    IImage            
*m_pImageBk;
    RGBVAL            m_color;

}
;

一个背景m_pImageBk,一个字体颜色m_color,然后就是文本内容了。m_delay、lenText和posText是用来让它跑起来的辅助变量。

要实现的方法也不多,如下:
AEEINTERFACE(IGMarquee)
{
    DECLARE_IBASE(IGMarquee)

    DECLARE_ICONTROL(IGMarquee)

    
void        (*SetText)       (IGMarquee * po, AECHAR * szText);
    
void        (*SetDelay)         (IGMarquee *po,uint16 delay);
    
void        (*SetImageBk)     (IGMarquee *po,IImage *img);
    
void        (*SetColor)         (IGMarquee *po,RGBVAL i);
    
}
;

看看它的函数实现吧,首先HandleEvent不需要做任何事了,直接return FALSE即可,主要是那个Redraw了。需要作的事情就是调用我们的绘制函数DrawText,还有一个定时器也不断地回调这个函数:

static   void  DrawText(IGMarquee  *  pMe)
{
    AECHAR    szText[
128];
    RGBVAL  oldColor;

    
if(pMe->m_pImageBk)
    
{
        IDISPLAY_EraseRect(pMe
->m_pIDisplay,&pMe->m_Rect);
        IIMAGE_SetDrawSize(pMe
->m_pImageBk,pMe->m_Rect.dx,pMe->m_Rect.dy);
        IIMAGE_Draw(pMe
->m_pImageBk,pMe->m_Rect.x,pMe->m_Rect.y);
    }


    
//if( pMe->m_pText && WSTRLEN(pMe->m_pText)>pMe->lenText)
    if( pMe->m_pText && WSTRLEN(pMe->m_pText)>0 )
    
{
        
//显示滚动广告    
        MEMSET(szText,0,sizeof(szText));
        WSTRLCPY(szText,pMe
->m_pText+pMe->posText,sizeof(szText));
        
//if( WSTRLEN(szText)<pMe->lenText)
        while(IDISPLAY_MeasureText(pMe->m_pIDisplay,AEE_FONT_NORMAL,szText)<pMe->m_Rect.dx)
        
{
            WSTRLCAT(szText,L
"    ",sizeof(szText));
            WSTRLCAT(szText,pMe
->m_pText,sizeof(szText));
        }

        oldColor
=IDISPLAY_SetColor(pMe->m_pIDisplay, CLR_USER_TEXT, pMe->m_color);
        IDISPLAY_DrawText(pMe
->m_pIDisplay,AEE_FONT_NORMAL,szText,-1,pMe->m_Rect.x,pMe->m_Rect.y+1,&pMe->m_Rect,IDF_TEXT_TRANSPARENT);

        IDISPLAY_UpdateEx(pMe
->m_pIDisplay,FALSE);
        IDISPLAY_SetColor(pMe
->m_pIDisplay, CLR_USER_TEXT, oldColor);

        pMe
->posText++;
        
if(pMe->posText>WSTRLEN(pMe->m_pText))
            pMe
->posText=0;

        
if(pMe->m_isActive)
            ISHELL_SetTimer(pMe
->m_pIShell,pMe->m_delay,(PFNNOTIFY)DrawText,pMe);
    }

    
}

与菜单中让一个选中项文本左右滚动类似,我们也让这里的跑马灯文本左右滚动起来。靠得就是那两个变量lenText和posText。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值