Symbian CAknGrid的应用
![此博文包含图片](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
标签: symbian总结it | 分类:Symbian学习总结 |
在Symbian下我们经常会有这样的需求,把我们的UI设计成九封格样子.
今天我们来看看9封格的UI是如何实现的.
实现效果如下图:
让我们进入正题来看是如何实现的.
//创建初始化一些句柄
void CUserGridContainer::ConstructL(const TRect& aRect)
{
CreateWindowL();
iGrid = new( ELeave ) CAknGrid;
iGrid->SetContainerWindowL( *this );
iGridModel = new( ELeave ) CAknGridM();
iGrid->SetModel( iGridModel );
iGrid->ConstructL( this, EAknListBoxSelectionGrid );
LoadList();
iGrid->SetListBoxObserver(this);
DrawGrid(aRect);
iGrid->SetCurrentItemIndex(4);
SetRect(aRect);
ActivateL();
}
void CUserGridContainer::LoadList()
{
CArrayPtr<CGulIcon>* icons = new(ELeave) CAknIconArray(8);
//加载图标
CleanupStack::PushL(icons);
icons->AppendL(iEikonEnv->CreateIconL(KDoubleListBoxmbm);
CleanupStack::Pop(icons);
iGrid->ItemDrawer()->FormattedCellData()->SetIconArray(icons);
//加载文字
CDesCArray* array = new ( ELeave )CDesCArrayFlat( icons->Count());
CleanupStack::PushL(array);
array->AppendL(_L("0/tItem1"));
array->AppendL(_L("1/tItem2"));
array->AppendL(_L("2/tItem3"));
array->AppendL(_L("3/tItem4"));
array->AppendL(_L("4/tItem5"));
array->AppendL(_L("5/tItem6"));
array->AppendL(_L("6/tItem7"));
array->AppendL(_L("7/tItem8"));
CleanupStack::Pop();
iGrid->Model()->SetItemTextArray(array);
}
//绘制DrawGrid.在这里需要根据指定的区域大小来绘制.
//尤其是在一些可以横屏的机器上.屏幕区域是可能变化的.
void CUserGridContainer::DrawGrid(const TRect& aRect)
{
TInt iSizeWidth = aRect.Width()/NumOfItemsWidth;
TInt iSizeHeight = aRect.Height()/NumOfItemsHeight;
TInt ipixelWidth = 40;
TInt iLeftx = (iSizeWidth - ipixelWidth)/2;
TInt iLefty = (iSizeHeight - ipixelWidth)/2;
TInt iEndx = iLeftx + ipixelWidth;
TInt iEndy = iLefty + ipixelWidth;
iGrid->SetLayoutL( EFalse, ETrue, ETrue, NumOfItemsWidth , NumOfItemsHeight,
TSize( iSizeWidth,iSizeHeight ), 0, 0);
iGrid->ScrollBarFrame()->SetScrollBarVisibilityL
(CEikScrollBarFrame::EOff,CEikScrollBarFrame::EOff);//隐藏右边的滑轮
iGrid->SetPrimaryScrollingType( CAknGridView::EScrollIncrementLineAndLoops );
iGrid->SetSecondaryScrollingType( CAknGridView::EScrollIncrementLineAndLoops );
AknListBoxLayouts::SetupStandardGrid( *iGrid );
AknListBoxLayouts::SetupFormGfxCell(*iGrid,iGrid->ItemDrawer
(),0,iLeftx,iLefty,iEndx,iEndy,ipixelWidth,ipixelWidth,TPoint(iLeftx,iLefty),TPoint(iEndx,
iEndy));
// Set up text subcells
const CFont* KFont = LatinBold12();
TInt baseline = iEndy + (iSizeHeight - iEndy)/2 + KFont->DescentInPixels();
AknListBoxLayouts::SetupFormTextCell( *iGrid, iGrid->ItemDrawer(), 1 ,
KFont ,
0 ,
0 , 0 ,
baseline , iSizeWidth ,
CGraphicsContext::ECenter ,
TPoint(0,ipixelWidth) ,
TPoint(iSizeWidth,iSizeHeight) );
}
//根据屏幕大小决定是否重绘
void CUserGridContainer::HandleResourceChange(TInt aType)
{
CCoeControl::HandleResourceChange(aType);
if ( aType == KEikDynamicLayoutVariantSwitch )
{
TRect rect;
AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, rect );
SetRect( rect );
DrawGrid(rect);
}
}
//处理按键事件
void CUserGridContainer::HandleListBoxEventL(CEikListBox* aListBox,
TListBoxEvent aListBoxEvent)
{
if (aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed)
{
TInt index = iGrid->CurrentItemIndex();
if(index == 0)
{
//处理需要响应的事件
}
}
}
以上代码在N95测试通过
今天我们来看看9封格的UI是如何实现的.
实现效果如下图:
让我们进入正题来看是如何实现的.
//创建初始化一些句柄
void CUserGridContainer::ConstructL(const TRect& aRect)
{
CreateWindowL();
iGrid = new( ELeave ) CAknGrid;
iGrid->SetContainerWindowL( *this );
iGridModel = new( ELeave ) CAknGridM();
iGrid->SetModel( iGridModel );
iGrid->ConstructL( this, EAknListBoxSelectionGrid );
LoadList();
iGrid->SetListBoxObserver(this);
DrawGrid(aRect);
iGrid->SetCurrentItemIndex(4);
SetRect(aRect);
ActivateL();
}
void CUserGridContainer::LoadList()
{
CArrayPtr<CGulIcon>* icons = new(ELeave) CAknIconArray(8);
//加载图标
CleanupStack::PushL(icons);
icons->AppendL(iEikonEnv->CreateIconL(KDoubleListBoxmbm);
CleanupStack::Pop(icons);
iGrid->ItemDrawer()->FormattedCellData()->SetIconArray(icons);
//加载文字
CDesCArray* array = new ( ELeave )CDesCArrayFlat( icons->Count());
CleanupStack::PushL(array);
array->AppendL(_L("0/tItem1"));
array->AppendL(_L("1/tItem2"));
array->AppendL(_L("2/tItem3"));
array->AppendL(_L("3/tItem4"));
array->AppendL(_L("4/tItem5"));
array->AppendL(_L("5/tItem6"));
array->AppendL(_L("6/tItem7"));
array->AppendL(_L("7/tItem8"));
CleanupStack::Pop();
iGrid->Model()->SetItemTextArray(array);
}
//绘制DrawGrid.在这里需要根据指定的区域大小来绘制.
//尤其是在一些可以横屏的机器上.屏幕区域是可能变化的.
void CUserGridContainer::DrawGrid(const TRect& aRect)
{
TInt iSizeWidth = aRect.Width()/NumOfItemsWidth;
TInt iSizeHeight = aRect.Height()/NumOfItemsHeight;
TInt ipixelWidth = 40;
TInt iLeftx = (iSizeWidth - ipixelWidth)/2;
TInt iLefty = (iSizeHeight - ipixelWidth)/2;
TInt iEndx = iLeftx + ipixelWidth;
TInt iEndy = iLefty + ipixelWidth;
iGrid->SetLayoutL( EFalse, ETrue, ETrue, NumOfItemsWidth , NumOfItemsHeight,
TSize( iSizeWidth,iSizeHeight ), 0, 0);
iGrid->ScrollBarFrame()->SetScrollBarVisibilityL
(CEikScrollBarFrame::EOff,CEikScrollBarFrame::EOff);//隐藏右边的滑轮
iGrid->SetPrimaryScrollingType( CAknGridView::EScrollIncrementLineAndLoops );
iGrid->SetSecondaryScrollingType( CAknGridView::EScrollIncrementLineAndLoops );
AknListBoxLayouts::SetupStandardGrid( *iGrid );
AknListBoxLayouts::SetupFormGfxCell(*iGrid,iGrid->ItemDrawer
(),0,iLeftx,iLefty,iEndx,iEndy,ipixelWidth,ipixelWidth,TPoint(iLeftx,iLefty),TPoint(iEndx,
iEndy));
// Set up text subcells
const CFont* KFont = LatinBold12();
TInt baseline = iEndy + (iSizeHeight - iEndy)/2 + KFont->DescentInPixels();
AknListBoxLayouts::SetupFormTextCell( *iGrid, iGrid->ItemDrawer(), 1 ,
KFont ,
0 ,
0 , 0 ,
baseline , iSizeWidth ,
CGraphicsContext::ECenter ,
TPoint(0,ipixelWidth) ,
TPoint(iSizeWidth,iSizeHeight) );
}
//根据屏幕大小决定是否重绘
void CUserGridContainer::HandleResourceChange(TInt aType)
{
CCoeControl::HandleResourceChange(aType);
if ( aType == KEikDynamicLayoutVariantSwitch )
{
TRect rect;
AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, rect );
SetRect( rect );
DrawGrid(rect);
}
}
//处理按键事件
void CUserGridContainer::HandleListBoxEventL(CEikListBox* aListBox,
TListBoxEvent aListBoxEvent)
{
if (aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed)
{
TInt index = iGrid->CurrentItemIndex();
if(index == 0)
{
//处理需要响应的事件
}
}
}
以上代码在N95测试通过