自定义文字滚动控件,用于单行文本的显示,当文字过长的时候,就会自动的向左滚动


//-------------------------------------------------说明-------------------------------------------------
用于单行文本的显示,当文字过长的时候,就会自动的向左滚动

CScrollText * iScrollTitle; //优惠券名称

//定义函数
iScrollTitle = NULL;

//析构函数
MEM_FREE(iScrollTitle);

//
CountComponentControls()加一


//
ComponentControl()返回iScrollTitle


//--------------创建标题栏--------------
    iScrollTitle = new (ELeave) CScrollText;
    iScrollTitle->SetContainerWindowL(*this);
    iScrollTitle->SetRect(iRShopTitle);    //设置区域
    //设置标题
    if (iCouponItem->iName)
        {
        iScrollTitle->SetTextValue(iCouponItem->iName->Des());
        }





//-------------------------------------------------头文件-------------------------------------------------
/*
 ============================================================================
 Name        : ScrollText.h
 Author      :
 Version     : 1.0
 Copyright   : Your copyright notice
 Description : 用于单行文本的显示,当文字过长的时候,就会自动的向左滚动
 ============================================================================
 */

#ifndef SCROLLTEXT_H
#define SCROLLTEXT_H

// INCLUDES
#include <e32std.h>
#include <e32base.h>
#include <COECNTRL.H>
#include "manager/Control.h"
// CLASS DECLARATION

/**
 *  CScrollText
 *
 */
class CScrollText : public CCoeControl
    {
public:

    CScrollText();

    ~CScrollText();

    void ConstructL();

    TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);

    virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent);

private:

    void Draw(const TRect& aRect) const;

private:

    CControl * iControl;
    const CFont * iFont; //字体
    CPeriodic* iTimer; //定时器

    TBuf<256> iTitle; //显示的标题
    TBuf<256> iShowValeu; //需要显示的内容

    //CMaxIcon * iBack;
    TInt iStart; //开始的位置,初始化为0
    TInt iLength; //一次获取的内容
    TRgb iBackColor; // 背景色

private:
    static TInt Loop(TAny* aPtr);

    //查看获取下一次显示内容的长度
    void CalcNextLength();
public:
    //设置文本内容,当内容过长的时候,就会自动的启动滚动对象,但是需要手工的设置字体型号
    void SetTextValue(const TDesC & aValue);
    };

#endif // STATUSCTL_H


//-------------------------------------------------定义文件-------------------------------------------------
/*
 ============================================================================
 Name        : ScrollText.cpp
 Author      :
 Version     : 1.0
 Copyright   : Your copyright notice
 Description : CScrollText implementation
 ============================================================================
 */
#include <EIKENV.H>
#include "control/ScrollText.h"

//
const TInt KStartTimer = 1000000; //刷新时间
const TInt KTimer = 1000000; //刷新时间
//

#define MEM_FREE(a) if(a){delete a;a=NULL;}
CScrollText::CScrollText()
    {
    iTimer = NULL;
    iFont = CEikonEnv::Static()->DenseFont();
    iStart = 0;
    iLength = 0;
    /*
     // No implementation required
     iControl = aControl;
     iTitle.Zero();
     CMaxIconManager* pIconMgr = iControl->iIconManager;
     iBack = pIconMgr->GetMaxIcon(CMaxIconManager::ECStatusBar);
     */
    iBackColor.SetAlpha(0);    // 设置透明度
    }

CScrollText::~CScrollText()
    {
    MEM_FREE(iTimer);
    }

void CScrollText::ConstructL()
    {

    }

void CScrollText::Draw(const TRect& aRect) const
    {
    CWindowGc& gc = SystemGc();
    gc.SetPenStyle(CGraphicsContext::ENullPen);
    gc.SetBrushColor(iBackColor);
    gc.DrawRect(aRect);    // 画菜单背景区域
    gc.SetPenStyle(CGraphicsContext::ESolidPen);
   
    gc.UseFont(iFont);

    //让字体居中显示
    TInt baseline = aRect.iTl.iY + (aRect.Height() - iFont->HeightInPixels())
            / 2 + iFont->AscentInPixels();
    TPoint pt;
    pt.SetXY(aRect.iTl.iX, baseline);

    gc.DrawText(iShowValeu, pt);

    gc.DiscardFont();

    /*
     CWindowGc& gc = SystemGc();
     gc.Clear(aRect);
     if (iBack)
     NHelper::DrawMaxIcon(gc, TPoint(0, 0), iBack);

     const CFont * myFont = CEikonEnv::Static()->SymbolFont();
     gc.UseFont(myFont);
     gc.SetPenColor(KRgbWhite);

     //中间的线
     TInt baseline = (30 - myFont->HeightInPixels()) / 2
     + myFont->AscentInPixels();

     TPoint pt;
     pt.SetXY(14, baseline);

     //显示标题
     if (iTitle.Length() > 0)
     gc.DrawText(iTitle, pt);

     gc.DiscardFont();
     */

    }

TKeyResponse CScrollText::OfferKeyEventL(const TKeyEvent& aKeyEvent,
        TEventCode aType)
    {

    }

void CScrollText::HandlePointerEventL(const TPointerEvent& aPointerEvent)
    {

    }

TInt CScrollText::Loop(TAny* aPtr)
    {
    //转换指针
    CScrollText* pThis = (CScrollText*) aPtr;
    /*
     pThis->iStart++;
     pThis->iLength = pThis->iFont->TextCount(pThis->iTitle.Mid(pThis->iStart),
     pThis->Rect().Width());
     
     pThis->iLength
     */

    pThis->CalcNextLength();
    pThis->DrawDeferred();
    }

//查看获取下一次显示内容的长度
void CScrollText::CalcNextLength()
    {

    iLength = iFont->TextCount(iTitle.Mid(iStart), Rect().Width());
    iShowValeu.Zero();
    iShowValeu.CopyC(iTitle.Mid(iStart, iLength));
    TInt nLen = iFont->TextWidthInPixels(iShowValeu);
    TInt width = Rect().Width() - 50;
    if (nLen < width)
        {
        iStart = 0;
        }
    else
        {
        iStart++;
        }

    }

//设置文本内容,当内容过长的时候,就会自动的启动滚动对象
void CScrollText::SetTextValue(const TDesC & aValue)
    {
    if (aValue.Length() == 0)
        {
        return;
        }

    //
    iTitle.Zero();
    iTitle.Append(aValue);
    iShowValeu.Zero();
    TInt nWidth = Rect().Size().iWidth;
    TInt leng = iFont->TextWidthInPixels(iTitle);

    //如果字体的宽度大于显示的区域,就启动定时器
    if (leng > nWidth)
        {
        if (NULL == iTimer)
            {
            //创建定时器
            iTimer = CPeriodic::NewL(CActive::EPriorityStandard);
            iTimer->Start(KStartTimer, KTimer, TCallBack(Loop, this));
            }
        }
    else
        {
        iShowValeu.Append(aValue);
        }

    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值