Symbian CAknGrid的应用

Symbian CAknGrid的应用

(2009-11-03 21:53:49)
标签:

symbian总结

it

分类:Symbian学习总结
在Symbian下我们经常会有这样的需求,把我们的UI设计成九封格样子.
今天我们来看看9封格的UI是如何实现的.
实现效果如下图:

Symbian CAknGrid的应用

让我们进入正题来看是如何实现的.
//创建初始化一些句柄
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测试通过

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值