Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3476214
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: C/C++

2009-07-21 13:42:18

这次我们利用上一次的控件做一个复杂点儿的控件 ListBox .
1. 动态添加 项目
2. 上下键实现焦点切换
3. 随焦点的切换滚动


图标


首先,我们需要六个类:
CListBox:它是我们看的最外面的一个框
CControlContainer:它是一个容器类,所有的项都添加到这个类里面
CListBoxItem:项(有可能每一项中有图片,文字等等)
CTextLable:组成 项 的元素 文本显示控件
CBar:滚动条的槽(或者叫*&*),不知道怎么叫了。呵呵!
CArrows:滚动滑块箭头


/*
* ListBox.cpp
*
*  Created on: 2009-7-9
*      Author: Administrator
*/
#include "ListBox.h"
#include "UIConsts.h"
#include "TextLable.h"
#include "Bar.h"
#include "Arrows.h"
#include "ControlContainer.h"

#include
#include
#include
#include
#include
#include

CListBox* CListBox::NewL()
        {
        CListBox* self = new (ELeave) CListBox();
        CleanupStack::PushL(self);
        self->ConstructL();
        CleanupStack::Pop(self);
        return self;
        }

CListBox::CListBox()
        {
        }
void CListBox::ConstructL()
        {

        CreateWindowL();

        iBar = new (ELeave) CBar();

        iArrows = new (ELeave) CArrows();

        iListContainer = new (ELeave) CControlContainer();

        }
CListBox::~CListBox()
        {
        delete iDrawBuffer;
        delete iGc;
        delete iBitmapDevice;

        delete iBar;
        delete iArrows;
        delete iListContainer;
        }
TKeyResponse CListBox::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
        {
        switch (aKeyEvent.iCode)
                {
                case EKeyUpArrow:
                case EKeyDownArrow:
                        {
                        if (iListContainer)
                                {
                                TKeyResponse res = iListContainer->OfferKeyEventL(aKeyEvent, aType);
                                SetArrowsRect();
                                DrawDeferred();
                                return res;
                                }
                        }
                }
        return EKeyWasNotConsumed;
        }
void CListBox::Draw(const TRect& aRect) const
        {
        CWindowGc& gc = SystemGc();

        CFbsBitGc& gcBuffer = *(iGc);
        gcBuffer.SetBrushColor(UIConsts::DEFAULT_CONTAINER_BG_COLOR);
        gcBuffer.SetBrushStyle(CGraphicsContext::ESolidBrush);
        gcBuffer.DrawRect(aRect);

        if (iBar)
                iBar->Draw(gcBuffer);

        if (iArrows)
                iArrows->Draw(gcBuffer);

        if (iListContainer)
                iListContainer->Draw(gcBuffer);

        gc.BitBlt(aRect.iTl, iDrawBuffer, aRect);

        }
void CListBox::SizeChanged()
        {
        CCoeControl::SizeChanged();
        TRect aRect(Rect());
        if (iBar)
                iBar->SetRect(TRect(aRect.iBr.iX - 5, aRect.iTl.iY, aRect.iBr.iX, aRect.iBr.iY));

        if (iListContainer)
                iListContainer->SetRect(TRect(aRect.iTl.iX + 5, aRect.iTl.iY, aRect.iBr.iX - 5, aRect.iBr.iY));

        if (iArrows)
                SetArrowsRect();

        InitDrawBuffer();

        }
void CListBox::HandleResourceChange(TInt aType)
        {
        CCoeControl::HandleResourceChange(aType);
        SetRect(iEikonEnv->EikAppUi()->ApplicationRect());

        if (iListContainer != NULL)
                {
                SetArrowsRect();
                iListContainer->SetNextRect();
                iListContainer->SetPrvRect();
                }
        }
void CListBox::Layout(TRect aRect)
        {
        SetRect(aRect);

        ActivateL();
        }
void CListBox::InitDrawBuffer()
        {
        delete iDrawBuffer;
        iDrawBuffer = new (ELeave) CFbsBitmap();
        TRect rect = CEikonEnv::Static()->EikAppUi()->ApplicationRect();
        iDrawBuffer->Create(rect.Size(), EColor16M);

        delete iBitmapDevice;
        iBitmapDevice = CFbsBitmapDevice::NewL(iDrawBuffer);

        delete iGc;
        iBitmapDevice->CreateContext(iGc);
        }
void CListBox::AddListBoxItem(CBaseControl* aControl)
        {
        if (aControl == NULL)
                return;
        if (iListContainer == NULL)
                {
                delete aControl;
                return;
                }
        iListContainer->AddControls(aControl);

        iListContainer->SetFocusIdx(0);
        }
TInt CListBox::GetItemFocusIdx()
        {
        if (iListContainer == NULL)
                return -1;
        return iListContainer->GetFocusIdx();
        }
void CListBox::SetItemFocusIdx(TInt aIdx)
        {
        if (iListContainer == NULL)
                return;
        iListContainer->SetFocusIdx(aIdx);
        }
void CListBox::SetArrowsRect()
        {
        //set arrows rect
        if (!iArrows || !iBar)
                return;

        iArrows->SetRect(iBar->Rect());
        if (!iListContainer)
                return;

        if (iListContainer->GetControlsCount() > 0)
                {
                TRect barRect = iBar->Rect();
                TRect containerRect = iListContainer->Rect();
                TRect arrowsRect;
                //
                if (iScrollType == ENUM_DYNAMIC)
                        {
                        TInt iBy = barRect.iBr.iY - (containerRect.iBr.iY - barRect.iBr.iY);
                        TInt iTy = barRect.iTl.iY - (containerRect.iTl.iY - barRect.iTl.iY);
                        arrowsRect = TRect(barRect.iTl.iX, iTy, barRect.iBr.iX, iBy);
                        }
                else
                        {

                        }
                iArrows->SetRect(arrowsRect);
                }
        }

/*
* ControlContainer.cpp
*
*  Created on: 2009-7-8
*      Author: Administrator
*/

#include "ControlContainer.h"

CControlContainer::CControlContainer()
        {
        }
CControlContainer::~CControlContainer()
        {
        iArrayFocusControl.Reset();
        iArrayFocusControl.Close();

        iArrayAllControl.ResetAndDestroy();
        iArrayAllControl.Close();
        }

void CControlContainer::Draw(CBitmapContext& gc) const
        {
        TRect aRect = Rect();
        gc.SetBrushStyle(CGraphicsContext::ENullBrush);
        gc.SetPenStyle(CGraphicsContext::ENullPen);
        //draw group
        for (TInt i = 0; i < iArrayAllControl.Count(); i++)
                {
                CBaseControl* control = iArrayAllControl;
                control->Draw(gc);
                }
        gc.SetBrushStyle(CGraphicsContext::ENullBrush);
        gc.SetPenStyle(CGraphicsContext::ENullPen);
        }
void CControlContainer::SetRect(const TRect &aRect)
        {
        iParentRect = aRect;
        TInt TLy = aRect.iTl.iY;
        TInt space = 0;
        TInt BRy = TLy;

        for (TInt i = 0; i < iArrayAllControl.Count(); i++)
                {
                CBaseControl* iCmp = iArrayAllControl;
                TInt height = iCmp->GetHeight();
                if (height <= 0)
                        {
                        height = iCmp->GetHeight(aRect.Width() - 10);
                        }
                BRy += height;
                TRect rect(aRect.iTl.iX, TLy, aRect.iTl.iX + aRect.Width() - UIConsts::BAR_WEIGHT, BRy);
                iCmp->SetRect(rect);
                TLy += (height + space);
                BRy = TLy;
                }
        CBaseControl::SetRect(TRect(aRect.iTl.iX,aRect.iTl.iY,aRect.iBr.iX,BRy));
        }
TKeyResponse CControlContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
        {
        switch (aKeyEvent.iCode)
                {
                case EKeyUpArrow:
                        {
                        ScrollPrev();
                        return EKeyWasConsumed;
                        }
                case EKeyDownArrow:
                        {
                        ScrollNext();
                        return EKeyWasConsumed;
                        }
                }
        return EKeyWasNotConsumed;
        }

void CControlContainer::AddControls(CBaseControl* aControl)
        {
        if (aControl)
                {
                iArrayAllControl.Append(aControl);
                if (aControl->GetEnable())
                        iArrayFocusControl.Append(aControl);

                }
        }
void CControlContainer::RemoveControls(TInt aControlIdx)
        {
        if (aControlIdx < iArrayAllControl.Count() && aControlIdx >= 0)
                {
                CBaseControl* iControl = iArrayAllControl[aControlIdx];
                iArrayAllControl.Remove(aControlIdx);
                delete iControl;
                iControl = NULL;
                }
        }

void CControlContainer::ScrollPrev()
        {
        if (iArrayFocusControl.Count() > 0)
                {
                if (iFocusControlIdx > 0)
                        {
                        SetFocusIdx(iFocusControlIdx-=1);
                        
                        SetNextRect();
                        }
                else
                        {
                        SetFocusIdx(iArrayFocusControl.Count() - 1);
                        
                        SetPrvRect();
                        }
                SetFocusIdx(iFocusControlIdx);
                }
        }
void CControlContainer::ScrollNext()
        {
        if (iArrayFocusControl.Count() > 0)
                {
                if (iFocusControlIdx < iArrayFocusControl.Count() - 1)
                        {
                        SetFocusIdx(iFocusControlIdx+=1);
                        
                        SetPrvRect();
                        }
                else
                        {
                        SetFocusIdx(0);
                        
                        SetNextRect();
                        }
                
                }
        }
TInt CControlContainer::GetFocusIdx()
        {
        return iFocusControlIdx;
        }
void CControlContainer::SetFocusIdx(TInt aIdx)
        {
        if (aIdx < iArrayFocusControl.Count() && aIdx >= 0)
                {
                for (TInt i = 0; i < iArrayFocusControl.Count(); i++)
                        {
                        iArrayFocusControl->SetFocus(EFalse);
                        }
                iArrayFocusControl[aIdx]->SetFocus(ETrue);
                iFocusControlIdx = aIdx;
                }
        }
void CControlContainer::SetNextRect()
        {
        //get focus item rect
        TRect itemRect(iArrayFocusControl[iFocusControlIdx]->Rect());
        //get container rect
        TRect containerRect = iParentRect;
        
        if (itemRect.iTl.iY < 0)
                {
                containerRect.iTl.iY += 0 - itemRect.iTl.iY ;
                SetRect(containerRect);
                }
        }
void CControlContainer::SetPrvRect()
        {
        //get focus item rect
        TRect itemRect(iArrayFocusControl[iFocusControlIdx]->Rect());
        //get container rect
        TRect containerRect = iParentRect;
        
        if (itemRect.iBr.iY > containerRect.iBr.iY)
                {
                containerRect.iTl.iY -= itemRect.iBr.iY - containerRect.iBr.iY + 2;
                SetRect(containerRect);
                }
        }
void CControlContainer::SetParentRect(const TRect& aRect)
        {
        iParentRect = aRect;
        }
/*
* ListTextLable.cpp
*
*  Created on: 2009-7-8
*      Author: Administrator
*/

#include "ListTextLable.h"
#include "UtilsBasic.h"
#include "TextLable.h"

CListTextLable* CListTextLable::NewL()
        {
        CListTextLable* self = new (ELeave) CListTextLable();
        CleanupStack::PushL(self);
        self->ConstructL();
        CleanupStack::Pop(self);
        return self;
        }

CListTextLable::~CListTextLable()
        {
        delete iStrBuf;
        }

void CListTextLable::ConstructL()
        {
        }
void CListTextLable::Draw(CBitmapContext& gc) const
        {
        
        TRect aRect = Rect();
        gc.SetBrushStyle(CGraphicsContext::ENullBrush);
        gc.SetPenStyle(CGraphicsContext::ENullPen);
        /*
        if (iBGColor != 0x000000)
                {
                gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
                gc.SetBrushColor(iBGColor);
                gc.DrawRect(Rect());
                }
        */
        for (TInt i = 0; i < iArrayAllControl.Count(); i++)
                {
                CBaseControl* control = iArrayAllControl;
                TRect rect(control->Rect());
                if (rect.iBr.iY <= aRect.iBr.iY + 1)
                        control->Draw(gc);
                }
        
        gc.SetBrushStyle(CGraphicsContext::ENullBrush);
        gc.SetPenStyle(CGraphicsContext::ENullPen);
        
        }
void CListTextLable::SetRect(const TRect &aRect)
        {
        InitControl(aRect.Width() - 2);
        
        CBaseControl::SetRect(aRect);
        TInt TLy = aRect.iTl.iY;
        TInt space = 0;
        TInt BRy = TLy;

        for (TInt i = 0; i < iArrayAllControl.Count(); i++)
                {
                CBaseControl* iCmp = iArrayAllControl;

                BRy += iCmp->GetHeight();
                TRect rect(aRect.iTl.iX, TLy, aRect.iTl.iX + aRect.Width(), BRy);
                iCmp->SetRect(rect);
                TLy += (iCmp->GetHeight() + space);
                BRy = TLy;
                }
        }
void CListTextLable::SetText(const TDesC& aStr, CFont* aFont)
        {
        delete iStrBuf;
        iStrBuf = aStr.Alloc();
        iFont = aFont;
        
        }
void CListTextLable::InitControl(TInt aWidth)
        {
        if (iStrBuf == NULL)
                return;
        RPointerArray lines;
        CUtilsBasic::DivideToLines(lines, iFont, aWidth, iStrBuf);
        
        for (TInt i = 0; i < lines.Count(); i++)
                {
                CTextLable* textControl = CTextLable::NewL(lines->Des(), iFont);
                //textControl->SetFontColor(UIConsts::DEFAULT_FONT_COLOR);
                //textControl->SetBGColor(UIConsts::DEFAULT_FOCUSED_COLOR);
                iArrayAllControl.Append(textControl);
                }
        lines.ResetAndDestroy();
        lines.Close();
        }
TInt CListTextLable::GetHeight()
        {
        TInt height = -1;
        for (TInt i = 0; i < iArrayAllControl.Count(); i++)
                {
                height += iArrayAllControl->GetHeight();
                }
        return height;
        }
TInt CListTextLable::GetHeight(TInt aWidth)
        {
        InitControl(aWidth);
        return GetHeight();
        }
TInt CListTextLable::GetWidth()
        {
                return Rect().Width();
        }
/*
* ListBoxItem.cpp
*
*  Created on: 2009-7-9
*      Author: Administrator
*/
#include "ListBoxItem.h"
#include "TextLable.h"

#include

CListBoxItem* CListBoxItem::NewL()
        {
        CListBoxItem* self = new (ELeave) CListBoxItem();
        CleanupStack::PushL(self);
        self->ConstructL();
        CleanupStack::Pop(self);
        return self;
        }
CListBoxItem::~CListBoxItem()
        {
        delete iTextLable;
        }
CListBoxItem::CListBoxItem()
        {
        }
void CListBoxItem::ConstructL()
        {
        }
void CListBoxItem::Draw(CBitmapContext& gc) const
        {
        if (iFocus)
                {
                DrawFocus(gc);
                }
        if (iTextLable)
                {
                iTextLable->Draw(gc);
                }
        }
void CListBoxItem::SetRect(const TRect &aRect)
        {
        CBaseControl::SetRect(aRect);
        if (iTextLable)
                {
                TInt tx = aRect.iTl.iX + 5;
                TInt ty = (aRect.Height() - iTextLable->GetHeight()) / 2 + aRect.iTl.iY;
                TInt bx = aRect.iBr.iX - 5;
                TInt by = ty + iTextLable->GetHeight();

                iTextLable->SetRect(TRect(tx, ty, bx, by));
                }
        }
TInt CListBoxItem::GetHeight()
        {
        TInt height = -1;
        if (iTextLable)
                height = iTextLable->GetHeight();
        
        return height;
        }
TInt CListBoxItem::GetWidth()
        {
        return Rect().Width();
        }
void CListBoxItem::SetString(TInt aRes, CFont* aFont)
        {
        HBufC* strBuf = StringLoader::LoadL(aRes);
        if (strBuf)
                {
                delete iTextLable;
                iTextLable = CTextLable::NewL(strBuf->Des(), aFont);
                }
        delete strBuf;
        }
void CListBoxItem::SetString(const TDesC& aStr, CFont* aFont)
        {
        HBufC* strBuf = aStr.Alloc();
        if (strBuf)
                {
                delete iTextLable;
                iTextLable = CTextLable::NewL(strBuf->Des(), aFont);
                }
        delete strBuf;
        }
void CListBoxItem::SetImage(TInt aRes)
        {
        }
void CListBoxItem::SetImage(const CFbsBitmap* aRes)
        {
        }

/*
* Bar.cpp
*
*  Created on: 2009-3-4
*      Author: lming
*/
#include "Bar.h"
#include "UIConsts.h"
#include "ImageComponent.h"
#include
#include

CBar::CBar()
        {
        }
CBar::~CBar()
        {
        delete iBGImg;
        delete iBGMaskImg;
        }
void CBar::SetRect(const TRect &aRect)
        {
        CBaseControl::SetRect(aRect);
        }
void CBar::Draw(CBitmapContext& gc) const
        {
        CBaseControl::Draw(gc);
        TRect aRect = Rect();
        //draw top star
        
        //draw bottom star
        
        
        //draw bg color
        gc.SetPenStyle(CGraphicsContext::ESolidPen);
        gc.SetBrushStyle(CGraphicsContext::ENullBrush);
        gc.SetPenColor(TRgb(0x44, 0x8d, 0xa8));
        gc.DrawRect(aRect);
        }
TInt CBar::GetPreferredHeight()
        {
        return UIConsts::BAR_HEIGHT;
        }
TInt CBar::GetPreferredWidth()
        {
        return UIConsts::BAR_WEIGHT;
        }

/*
* Arrows.cpp
*
*  Created on: 2009-3-4
*      Author: lming
*/

#include "Arrows.h"
#include "ImageComponent.h"
#include "UIConsts.h"
#include
#include

CArrows::CArrows()
{
}
CArrows::~CArrows()
{
        delete iBGImg;
        delete iBGMaskImg;
}
void CArrows::SetRect(const TRect &aRect)
{
        CBaseControl::SetRect(aRect);
}
void CArrows::Draw(CBitmapContext& gc) const
{
        TRect aRect = Rect();
        //draw bg color
        gc.SetBrushStyle(CGraphicsContext::ENullBrush);
        gc.SetPenStyle(CGraphicsContext::ESolidPen);
        gc.SetPenSize(TSize(1, 1));

        gc.SetPenColor(TRgb(0x53, 0xaa, 0xa5));
        TPoint pA(aRect.iTl.iX + 1, aRect.iTl.iY);
        TPoint pB(aRect.iTl.iX + 1, aRect.iTl.iY + aRect.Height());
        gc.DrawLine(pA, pB);

        gc.SetPenColor(TRgb(0x42, 0x8c, 0x88));
        pA.iX += 1;
        pB.iX += 1;
        gc.DrawLine(pA, pB);

        gc.SetPenColor(TRgb(0x26, 0x5b, 0x57));
        pA.iX += 1;
        pB.iX += 1;
        gc.DrawLine(pA, pB);

        gc.SetBrushStyle(CGraphicsContext::ENullBrush);
        gc.SetPenStyle(CGraphicsContext::ENullPen);
}
TInt CArrows::GetPreferredHeight()
{
        return UIConsts::BAR_HEIGHT;
}
TInt CArrows::GetPreferredWidth()
{
        return UIConsts::BAR_WEIGHT;
}
/*
* ControlContainer.h
*
*  Created on: 2009-7-8
*      Author: Administrator
*/

#ifndef CONTROLCONTAINER_H_
#define CONTROLCONTAINER_H_

#include "BaseControl.h"

class CControlContainer : public CBaseControl
        {
public:
        CControlContainer();
        virtual ~CControlContainer();

        virtual void Draw(CBitmapContext& gc) const;
        virtual void SetRect(const TRect &aRect);
        virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);

        void AddControls(CBaseControl*);
        void RemoveControls(TInt aControlIdx);

        virtual void ScrollPrev();
        virtual void ScrollNext();

        TInt GetFocusIdx();
        void SetFocusIdx(TInt aIdx);
        
        void SetNextRect();
        void SetPrvRect();
        
        void SetParentRect(const TRect& aRect);
        
        TInt GetControlsCount()
                {
                return iArrayAllControl.Count();
                }

protected:
        RPointerArray iArrayFocusControl;
        RPointerArray iArrayAllControl;
        TInt iFocusControlIdx;
        TRect iParentRect;
        };
#endif /* CONTROLCONTAINER_H_ */
/*
* Bar.h
*
*  Created on: 2009-3-4
*      Author: lming
*/

#ifndef BAR_H_
#define BAR_H_

#include "BaseControl.h"

class CFbsBitmap;
class CMarquee;

class CBar : public CBaseControl
        {
public:
        
//        static CBar* NewL();
//        static CBar* NewLC();
        virtual ~CBar();
        CBar();

        //from Component
        TInt GetPreferredHeight();
        TInt GetPreferredWidth();
        void SetRect(const TRect &aRect);
        void Draw(CBitmapContext& gc) const;
        
protected:

        CFbsBitmap* iBGImg;
        CFbsBitmap* iBGMaskImg;

        };
#endif /* BAR_H_ */
/*
* Arrows.h
*
*  Created on: 2009-3-4
*      Author: lming
*/

#ifndef ARROWS_H_
#define ARROWS_H_

#include "BaseControl.h"

class CFbsBitmap;
class CMarquee;

class CArrows : public CBaseControl
        {
public:
        
//        static CArrows* NewL();
//        static CArrows* NewLC();
        virtual ~CArrows();
        CArrows();

        //from Component
        TInt GetPreferredHeight();
        TInt GetPreferredWidth();
        void SetRect(const TRect &aRect);
        void Draw(CBitmapContext& gc) const;
        
protected:

        CFbsBitmap* iBGImg;
        CFbsBitmap* iBGMaskImg;

        };

#endif /* ARROWS_H_ */
/*
* ListTextLable.h
*
*  Created on: 2009-7-8
*      Author: Administrator
*/

#ifndef LISTTEXTLABLE_H_
#define LISTTEXTLABLE_H_

#include "ControlContainer.h"

class CFont;

class CListTextLable : public CControlContainer
        {
public:
        static CListTextLable* NewL();
        ~CListTextLable();
        CListTextLable(){};

        virtual void Draw(CBitmapContext& gc) const;
        virtual void SetRect(const TRect &aRect);
        virtual TInt GetHeight();
        virtual TInt GetHeight(TInt aWidth);
        virtual TInt GetWidth();
        
public:
        //new function
        void SetText(const TDesC& aStr, CFont* aFont);
        void SetFontColor(TRgb aColor){iFontColor = aColor;}
        void SetBGColor(TRgb aColor){iBGColor = aColor;}

private:
        void ConstructL();
        void InitControl(TInt aWidth);

private:
        TRgb iFontColor;
        TRgb iBGColor;
        HBufC* iStrBuf;
        CFont* iFont;
        };

#endif /* LISTTEXTLABLE_H_ */
/*
* ListBoxItem.h
*
*  Created on: 2009-7-9
*      Author: Administrator
*/

#ifndef LISTBOXITEM_H_
#define LISTBOXITEM_H_

#include "BaseControl.h"

class CTextLable;
class CFbsBitmap;

class CListBoxItem : public CBaseControl
        {
public:
        static CListBoxItem* NewL();
        ~CListBoxItem();
        
        void SetString(TInt aRes,CFont* aFont);
        void SetString(const TDesC& aStr,CFont* aFont);
        void SetImage(TInt aRes);
        void SetImage(const CFbsBitmap* aRes);

public:
        //form base class
        virtual void Draw(CBitmapContext& gc) const;
        virtual void SetRect(const TRect &aRect);
        virtual TInt GetHeight();
        virtual TInt GetWidth();

private:
        CListBoxItem();
        void ConstructL();
        
private:
        //data
        CTextLable* iTextLable;
        };

#endif /* LISTBOXITEM_H_ */
/*
* ListBox.h
*
*  Created on: 2009-7-9
*      Author: Administrator
*/

#ifndef LISTBOX_H_
#define LISTBOX_H_

#include

class CFbsBitGc;
class CFbsBitmap;
class CFbsBitmapDevice;

class CBar;
class CArrows;
class CBaseControl;
class CControlContainer;

class CListBox : public CCoeControl
        {
public:
        static CListBox* NewL();
        CListBox();
        ~CListBox();
public:
        virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);
        virtual void Draw(const TRect& aRect) const;
        virtual void SizeChanged();
        virtual void HandleResourceChange(TInt aType);

public:
        void Layout(TRect aRect);
        void AddListBoxItem(CBaseControl* aControl);
        TInt GetItemFocusIdx();
        void SetItemFocusIdx(TInt aIdx);
        
        enum
        {
        ENUM_DYNAMIC,
        ENUM_STATIC
        };

private:
        void ConstructL();
        void InitDrawBuffer();
        void SetArrowsRect();
        
        CFbsBitmap* iDrawBuffer;
        CFbsBitGc* iGc;
        CFbsBitmapDevice* iBitmapDevice;
        
        CBar* iBar;
        CArrows* iArrows;
        
        CControlContainer* iListContainer;
        
        TInt iScrollType;

        };

#endif /* LISTBOX_H_ */


以上是控件的类。

下面的代码是如何使用它:
1.初始化
iListBox = CListBox::NewL();
        
        for (TInt i = 0; i < 20; i++)
                {
                /*
                //listTextLable
                CListTextLable* iListLable = CListTextLable::NewL();
                iListLable->SetText(_L("abcdefghijklmnopqrstuvwxyz"),font);
                iListBox->AddListBoxItem(iListLable);
                
                //textlable
                CTextLable* textLable = CTextLable::NewL(_L("BB"),font);
                iListBox->AddListBoxItem(textLable);
                */
                //listboxitem
                TBuf<10> buf;
                buf.Append(_L("Title "));
                buf.AppendNum(i);
                CListBoxItem* item = CListBoxItem::NewL();
                item->SetString(buf,font);
                iListBox->AddListBoxItem(item);
                
                }
2.设置位置
if (iListBox)
                iListBox->Layout(TRect(10,10,230,310));
3.绘制
        if (iListBox)
                iListBox->DrawDeferred();
4.接收按键事件
TKeyResponse CBaseContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
        {
        switch (aKeyEvent.iCode)
                {
                case EKeyDevice0:
                        STATIC_CAST(CXGUIAppUi*,iAvkonViewAppUi)->HandleCommandL(EEikCmdExit);
                        return EKeyWasConsumed;
                case EKeyDevice1:
                        {
                        DrawDeferred();
                        return EKeyWasConsumed;
                        }
                case EKeyUpArrow:
                case EKeyDownArrow:
                        {
                        if (iListBox)
                                {
                                return iListBox->OfferKeyEventL(aKeyEvent,aType);
                                }
                        }
                }
        return EKeyWasNotConsumed;
        }
阅读(551) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~