📄 userlistboxcontainer.cpp
字号:
#include <gulicon.h>
#include <aknutils.h>
#include <avkon.hrh>
#include <akntitle.h>
#include <eiklabel.h>
#include <eikapp.h>
#include <f32file.h>
#include "Userlistboxappui.h"
#include "UserListbox.mbg"
#include "UserListboxContainer.h"
CUserListboxContainer::CUserListboxContainer()
{
iSeleIndex = 0;
iDrawIndex = 0;
iIndex = 0;
iScrollIndex = 0;
}
// EPOC default constructor can leave.
void CUserListboxContainer::ConstructL(const TRect& aRect)
{
CreateWindowL();
SetRect( aRect );
ActivateL();
}
// destructor
CUserListboxContainer::~CUserListboxContainer()
{
iDataArray.ResetAndDestroy();
}
void CUserListboxContainer::SizeChanged()
{
}
// ---------------------------------------------------------
// CUserListboxContainer::CountComponentControls() const
// return the number of controls
// ---------------------------------------------------------
//
TInt CUserListboxContainer::CountComponentControls() const
{
// return number of controls inside this container
return 0;
}
// ---------------------------------------------------------
// CUserListboxContainer::ComponentControl(TInt aIndex) const
// return the pointer to specified control.
// ---------------------------------------------------------
//
CCoeControl* CUserListboxContainer::ComponentControl( TInt /*aIndex*/ ) const
{
return NULL;
}
// ---------------------------------------------------------
// CUserListboxContainer::Draw(const TRect& aRect) const
// handle the message when client region must be redrawn.
// ---------------------------------------------------------
//
void CUserListboxContainer::Draw( const TRect& aRect) const
{
CWindowGc& gc = SystemGc();
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
gc.SetBrushColor(KRgbYellow);
gc.DrawRect(Rect());
//***********************************************//添加图片
TBuf<KMaxPath>PathMbm;
#ifdef __WINS__
PathMbm.Copy(_L("z:\\system\\apps\\UserListbox\\UserListbox.mbm"));
#else
GetAppPath(PathMbm);
PathMbm.Append(_L("UserListbox.mbm"));
#endif
CFbsBitmap *bitmap_select = new(ELeave)CFbsBitmap(); //选择条
bitmap_select->Load(PathMbm, EMbmUserlistboxUlb_select_item_176x24_i);
CFbsBitmap *bitmap_title = new(ELeave)CFbsBitmap(); //条目图标
bitmap_title->Load(PathMbm, EMbmUserlistboxUlb_item_title_17x20_i);
CFbsBitmap *bitmap_title_m = new(ELeave)CFbsBitmap(); //条目图标
bitmap_title_m->Load(PathMbm, EMbmUserlistboxUlb_item_title_17x20_m);
CFbsBitmap *bitmap_mark = new(ELeave)CFbsBitmap(); //标记
bitmap_mark->Load(PathMbm, EMbmUserlistboxUlb_mark_26x20_i);
CFbsBitmap *bitmap_mark_m = new(ELeave)CFbsBitmap(); //标记遮障
bitmap_mark_m->Load(PathMbm, EMbmUserlistboxUlb_mark_26x20_m);
CFbsBitmap *bitmap_scroll_back = new(ELeave)CFbsBitmap(); //滚动条背景
bitmap_scroll_back->Load(PathMbm, EMbmUserlistboxUlb_scroll_back_4x144_i);
CFbsBitmap *bitmap_select_title = new(ELeave)CFbsBitmap(); //条目图标(选中)
bitmap_select_title->Load(PathMbm, EMbmUserlistboxUlb_select_title_17x20_i);
CFbsBitmap *bitmap_select_mark = new(ELeave)CFbsBitmap(); //标记
bitmap_select_mark->Load(PathMbm, EMbmUserlistboxUlb_select_mark_26x20_i);
//***********************************************//
//***********************************************//设置选项条
if(iDataArray.Count() != 0)
{
switch(iSeleIndex)
{
case 0:
{
gc.BitBlt(TPoint(0,0), bitmap_select);
}
break;
case 1:
{
gc.BitBlt(TPoint(0,24), bitmap_select);
}
break;
case 2:
{
gc.BitBlt(TPoint(0,48), bitmap_select);
}
break;
case 3:
{
gc.BitBlt(TPoint(0,72), bitmap_select);
}
break;
case 4:
{
gc.BitBlt(TPoint(0,96), bitmap_select);
}
break;
case 5:
{
gc.BitBlt(TPoint(0,120), bitmap_select);
}
}
}
delete bitmap_select;
//***********************************************//
//***********************************************//读取数组
const CFont* normalfont = CEikonEnv::Static()->NormalFont();
gc.UseFont(normalfont);
if(iDataArray.Count() == 0) //listbox为空
{
TPoint point(65,72);
gc.DrawText(_L("(无内容)"), point);
}
else
{
if(iDataArray[iDrawIndex]->GetBody()->Des().Length() != 0)
{
gc.BitBltMasked(TPoint(1, 1), bitmap_title, //添加条目图标
TSize(17, 20), bitmap_title_m, ETrue);
if(iDataArray[iDrawIndex]->GetSelect() != EFalse)
{
gc.BitBltMasked(TPoint(142, 1), bitmap_mark,
TSize(26, 20), bitmap_mark_m, ETrue);
}
if(iSeleIndex == 0)
{
gc.BitBlt(TPoint(1,1), bitmap_select_title);
if(iDataArray[iDrawIndex]->GetSelect() != EFalse)
{
gc.BitBlt(TPoint(142,1), bitmap_select_mark);
}
gc.SetPenColor(KRgbWhite);
}
TPoint point(23,18); //添加条目内容
gc.DrawText(iDataArray[iDrawIndex]->GetBody()->Des(), point);
gc.SetPenColor(KRgbBlack);
}
if(iDrawIndex+1 <= iDataArray.Count()-1 &&iDataArray[iDrawIndex+1]->GetBody()->Des().Length() != 0)
{
gc.BitBltMasked(TPoint(1, 25), bitmap_title,
TSize(17, 20), bitmap_title_m, ETrue);
if(iDataArray[iDrawIndex+1]->GetSelect() != EFalse)
{
gc.BitBltMasked(TPoint(142, 25), bitmap_mark,
TSize(26, 20), bitmap_mark_m, ETrue);
}
if(iSeleIndex == 1)
{
gc.BitBlt(TPoint(1,25), bitmap_select_title);
if(iDataArray[iDrawIndex+1]->GetSelect() != EFalse)
{
gc.BitBlt(TPoint(142,25), bitmap_select_mark);
}
gc.SetPenColor(KRgbWhite);
}
TPoint point(23,42);
gc.DrawText(iDataArray[iDrawIndex+1]->GetBody()->Des(), point);
gc.SetPenColor(KRgbBlack);
}
if(iDrawIndex+2 <= iDataArray.Count()-1 &&iDataArray[iDrawIndex+2]->GetBody()->Des().Length() != 0)
{
gc.BitBltMasked(TPoint(1, 49), bitmap_title,
TSize(17, 20), bitmap_title_m, ETrue);
if(iDataArray[iDrawIndex+2]->GetSelect() != EFalse)
{
gc.BitBltMasked(TPoint(142, 49), bitmap_mark,
TSize(26, 20), bitmap_mark_m, ETrue);
}
if(iSeleIndex == 2)
{
gc.BitBlt(TPoint(1, 49), bitmap_select_title);
if(iDataArray[iDrawIndex+2]->GetSelect() != EFalse)
{
gc.BitBlt(TPoint(142, 49), bitmap_select_mark);
}
gc.SetPenColor(KRgbWhite);
}
TPoint point(23,66);
gc.DrawText(iDataArray[iDrawIndex+2]->GetBody()->Des(), point);
gc.SetPenColor(KRgbBlack);
}
if(iDrawIndex+3 <= iDataArray.Count()-1 && iDataArray[iDrawIndex+3]->GetBody()->Des().Length() != 0)
{
gc.BitBltMasked(TPoint(1, 73), bitmap_title,
TSize(17, 20), bitmap_title_m, ETrue);
if(iDataArray[iDrawIndex+3]->GetSelect() != EFalse)
{
gc.BitBltMasked(TPoint(142, 73), bitmap_mark,
TSize(26, 20), bitmap_mark_m, ETrue);
}
if(iSeleIndex == 3)
{
gc.BitBlt(TPoint(1, 73), bitmap_select_title);
if(iDataArray[iDrawIndex+3]->GetSelect() != EFalse)
{
gc.BitBlt(TPoint(142, 73), bitmap_select_mark);
}
gc.SetPenColor(KRgbWhite);
}
TPoint point(23,90);
gc.DrawText(iDataArray[iDrawIndex+3]->GetBody()->Des(), point);
gc.SetPenColor(KRgbBlack);
}
if(iDrawIndex+4 <= iDataArray.Count()-1 && iDataArray[iDrawIndex+4]->GetBody()->Des().Length() != 0)
{
gc.BitBltMasked(TPoint(1, 97), bitmap_title,
TSize(17, 20), bitmap_title_m, ETrue);
if(iDataArray[iDrawIndex+4]->GetSelect() != EFalse)
{
gc.BitBltMasked(TPoint(142, 97), bitmap_mark,
TSize(26, 20), bitmap_mark_m, ETrue);
}
if(iSeleIndex == 4)
{
gc.BitBlt(TPoint(1, 97), bitmap_select_title);
if(iDataArray[iDrawIndex+4]->GetSelect() != EFalse)
{
gc.BitBlt(TPoint(142, 97), bitmap_select_mark);
}
gc.SetPenColor(KRgbWhite);
}
TPoint point(23,114);
gc.DrawText(iDataArray[iDrawIndex+4]->GetBody()->Des(), point);
gc.SetPenColor(KRgbBlack);
}
if(iDrawIndex+5 <= iDataArray.Count()-1 &&iDataArray[iDrawIndex+5]->GetBody()->Des().Length() != 0)
{
gc.BitBltMasked(TPoint(1, 121), bitmap_title,
TSize(17, 20), bitmap_title_m, ETrue);
if(iDataArray[iDrawIndex+5]->GetSelect() != EFalse)
{
gc.BitBltMasked(TPoint(142, 121), bitmap_mark,
TSize(26, 20), bitmap_mark_m, ETrue);
}
if(iSeleIndex == 5)
{
gc.BitBlt(TPoint(1, 121), bitmap_select_title);
if(iDataArray[iDrawIndex+5]->GetSelect() != EFalse)
{
gc.BitBlt(TPoint(142, 121), bitmap_select_mark);
}
gc.SetPenColor(KRgbWhite);
}
TPoint point(23,138);
gc.DrawText(iDataArray[iDrawIndex+5]->GetBody()->Des(), point);
gc.SetPenColor(KRgbBlack);
}
}
delete bitmap_mark_m;
delete bitmap_title_m;
delete bitmap_title;
delete bitmap_mark;
delete bitmap_select_title;
delete bitmap_select_mark;
gc.DiscardFont();
//***********************************************//
//***********************************************//滚动条
if(iDataArray.Count() != 0)
{
gc.DrawLine(TPoint(170, 0), TPoint(170, 144));
gc.DrawLine(TPoint(175, 0), TPoint(175, 144));
gc.BitBlt(TPoint(171,0), bitmap_scroll_back);
delete bitmap_scroll_back;
gc.SetPenStyle(CGraphicsContext::ESolidPen); //设置滚动条画笔
gc.SetPenSize(TSize(4,1));
gc.SetPenColor(KRgbBlue);
if(iDataArray.Count() > 6)
{
TInt count = iDataArray.Count();
gc.DrawLine(TPoint(172, 0 + iScrollIndex), TPoint(172, 6*144/count+ + iScrollIndex));
}
else
{
gc.DrawLine(TPoint(172, 0), TPoint(172, 144));
}
}
else
{
delete bitmap_scroll_back;
}
//***********************************************//
// gc.DrawRect(TRect(TPoint(10, 10), TSize(20, 20)));
}
// ---------------------------------------------------------
// CAknExListboxContainer::OfferKeyEventL(
// const TKeyEvent& aKeyEvent, TEventCode aType )
// Handles the key events.
// ---------------------------------------------------------
//
TKeyResponse CUserListboxContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
{
if(aType ==EEventKey && aKeyEvent.iCode == EKeyDownArrow) //按向下键
{
if(iIndex != iDataArray.Count()-1 && iSeleIndex<5)
{
++iSeleIndex;
++iIndex;
}
else
{
if(iIndex>=5 && iDrawIndex+5 != iDataArray.Count() -1)
{
++iDrawIndex;
++iIndex;
iScrollIndex += 144/iDataArray.Count();
}
}
}
DrawDeferred();
if(aType ==EEventKey && aKeyEvent.iCode == EKeyUpArrow) //按向上键
{
if(iSeleIndex >0)
{
--iSeleIndex;
--iIndex;
}
else
{
if(iDrawIndex != 0)
{
--iDrawIndex;
--iIndex;
iScrollIndex -= 144/iDataArray.Count();
}
}
}
DrawDeferred();
return EKeyWasNotConsumed;
}
////////////////////////////////////////////////////////自定义
////////////////////Container
void CUserListboxContainer::GetAppPath(TDes& aPath)
{
CUserListboxAppUi* pApp = (CUserListboxAppUi*)CEikonEnv::Static()->AppUi();
TFileName appFullName;//typedef TBuf<KMaxFileName> TFileName;
appFullName = pApp->Application()->AppFullName();
TParsePtr parse(appFullName);
aPath.Copy(parse.DriveAndPath());
}
TInt CUserListboxContainer::Selected()//获取当前选中项索引
{
return iIndex;
}
void CUserListboxContainer::SetSelected(TInt aIndex)//设置指定索引为选中项
{
iDataArray[aIndex]->SetSelect(ETrue);
return;
}
void CUserListboxContainer::AppendAnItem(const TDesC& aBody)//添加条目到列表项结尾处
{
CNDListItem *Item = CNDListItem::NewL();
Item->SetBody(aBody);
AppendAnItem(Item);
return;
}
void CUserListboxContainer::AppendAnItem(CNDListItem *anItem)
{
iDataArray.Append(anItem);
Reset();
return;
}
void CUserListboxContainer::DeleteAnItem(TInt aIndex)
{
if(iDataArray.Count() != 0)
{
delete iDataArray[aIndex];
iDataArray.Remove(aIndex);
}
Reset();
return;
}
void CUserListboxContainer::DeleteSelectItem()
{
for(TInt i=0; i<iDataArray.Count()-1; ++i)
{
if(iDataArray[i]->GetSelect() != EFalse)
{
DeleteAnItem(i);
}
}
return;
}
void CUserListboxContainer::Reset()
{
iIndex = 0;
iSeleIndex = 0;
iDrawIndex = 0;
iScrollIndex = 0;
}
//***********************************************//
//***********************************************//MDU
CNDListItem::CNDListItem() //构造析构
{
ipBody = NULL;
iSelect = EFalse;
}
CNDListItem::~CNDListItem()
{
MOMERAY_FREE(ipBody);
}
CNDListItem *CNDListItem::NewL()
{
CNDListItem *self = CNDListItem::NewLC();
CleanupStack::Pop(self);
return self;
}
CNDListItem *CNDListItem::NewLC()
{
CNDListItem *self = new(ELeave)CNDListItem();
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
void CNDListItem::ConstructL()
{
ipBody = HBufC::NewL(30);
}
void CNDListItem::SetBody(const TDesC &aBody) //外部接口
{
ipBody->Des().Copy(aBody);
return;
}
HBufC *CNDListItem::GetBody() const
{
return ipBody;
}
void CNDListItem::SetSelect(const TBool aSelect)
{
iSelect = aSelect;
return;
}
TBool CNDListItem::GetSelect() const
{
return iSelect;
}
// End of File
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -