⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 userlistboxcontainer.cpp

📁 symbian s60 2th 自定义ListBox
💻 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 + -