How to draw an Icon on the IndicatorPane of Series 60

本文介绍如何在S60平台的应用程序中实现自定义图标指示器,并展示其在电池或信号图标旁显示的效果。通过继承CCoeControl类并重写相应方法,可以创建动态变化的图标指示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Link: http://www.newlc.com/How-to-draw-an-Icon-on-the.html

 

Here is a way to show an icon on the IndicatorPane of Series 60. You can show an icone near to the battery pane or signal pane, for that you have to customise the code.

I've used a calss named CIndicatorIcon derived from CCoeControl. Now you have to create the ConstructL() should be like this:

void CIndicatorIcon::ConstructL()
        {
        iMyWindowGroup = RWindowGroup(iCoeEnv->WsSession());
        User::LeaveIfError(iMyWindowGroup.Construct((TUint32)&iMyWindowGroup));

        iMyWindowGroup.SetOrdinalPosition(0, ECoeWinPriorityAlwaysAtFront);
        iMyWindowGroup.EnableReceiptOfFocus(EFalse);

        CreateWindowL(&iMyWindowGroup);

        // by default setting the indicator icon to inactive
        SetIndicatorIconL(EIndicatorIconAppActive);

        ActivateL();
        }

In the ConstructL() I was calling another function called SetIndicatorIconL(), to set the icon:

void CIndicatorIcon::SetIndicatorIconL(TIndicatorIcon aIndicatorIconType, TBool aRedraw)
        {
        switch(aIndicatorIconType)
                {
                case EIndicatorIconEmpty:
                        iIndicator = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_empty);
                        iIndicatorMask = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_empty_mask);
                        break;

                case EIndicatorIconAppActive:
                        iIndicator = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_bt_connect_on);
                        iIndicatorMask = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_bt_connect_on_mask);
                        break;

                case EIndicatorIconAppInactive:
                        iIndicator = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_bt_audio);
                        iIndicatorMask = CEikonEnv::Static()->CreateBitmapL(KSysIconFile, EMbmAvkonQgn_prop_bt_audio_mask);
                        break;

                default:
                        break;
                }

        SetRect(TRect(TPoint(KIndicatorPosX, KIndicatorPosY),iIndicator->SizeInPixels()));
       
        // if aRedraw == ETrue just draw the canvas again.
        if(aRedraw)
                {
                DrawNow();
                }
        }

You have to over-ride Draw() from CCoeControl. The Draw function is as follows:

void CIndicatorIcon::Draw(const TRect& aRect) const
        {
        CWindowGc& gc = SystemGc();

        gc.Clear();
        gc.SetBrushStyle(CGraphicsContext::ENullBrush);
        gc.BitBltMasked(TPoint(aRect.iTl.iX, aRect.iTl.iY),
                iIndicator,
                TRect(TPoint(0, 0), iIndicator->SizeInPixels()),
                iIndicatorMask,
                ETrue);
        }

Now add these lines to the ConstructL() of your Application's AppUi class:

        iIndicatorIcon = CIndicatorIcon::NewL();
        // The next line will set the icon to draw and it'll draw to the screen.
        iIndicatorIcon->SetIndicatorIconL(CIndicatorIcon::EIndicatorIconAppInactive, ETrue);

Finally after running the application it'll look like this:

IndicatorIcon_applcation_foreground.jpg  IndicatorIcon_applcation_background.jpg
IndicatorIcon_applcation_background_taksview.jpg

You can download an example application from here.

IndicatorIconEx.zip
IndicatorIconEx.zip

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值