//-------------------------------------------------说明-------------------------------------------------
用于单行文本的显示,当文字过长的时候,就会自动的向左滚动
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);
}
}
自定义文字滚动控件,用于单行文本的显示,当文字过长的时候,就会自动的向左滚动
最新推荐文章于 2023-12-27 11:25:01 发布