首 页 | 新 闻 | Symbian | Android| Windows Mobile | J2ME | 下载中心 | 游戏策划招聘与求职 | 购书指南 | 视频教程
您现在的位置: 开发视界 >> Symbian >> 绘图 >> 正文
S60程序中,如何在指示器面板中绘制图标
作者:Lee 译    文章来源:newlc    更新时间:2007-4-2 10:37:56
这片文章介绍一种在S60指示器面板中绘制图标的方法。你可以放一个图标在电池面板或信号面板旁,你需要自定义代码。

我用了一个派生自CCoeControl的CIndicatorIcon 类。在ConstructL()中写如下代码:
 
CODE:
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();
        }

在ConstructL()函数中,代哦用了SetIndicatorIconL(),来设置图标:
 
CODE:
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();
                }
        }

你必须重载CCoeControl类中的Draw()函数. 该函数如下:
 
CODE:
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);
        }

添加以下代码到你的AppUi类下的ConstructL()函数中:
 
CODE:
        iIndicatorIcon = CIndicatorIcon::NewL();
        // The next line will set the icon to draw and it'll draw to the screen.
        iIndicatorIcon->SetIndicatorIconL(CIndicatorIcon::EIndicatorIconAppInactive, ETrue);

程序运行后你将看到如下的界面:
 当程序运行在后台
 当出现任务菜单时
 

译文地址:http://www.symbianx.cn/viewthread.php?tid=51&extra=page%3D1

下载:程序源码
相关文章:
Symbian OS Internals——Symbian OS模拟器
在Symbian程序中使用汇编代码
S60系列用户界面显示器规范
如何从Carbide.c++产生SIS安装文件?
Symbian系统中DLL的冻结
CCoeControl类中Draw()函数的调试
移动代码签名 (ACS) 常见问题问答
DSA and RBackupWindow
 

站点地图 | 加入收藏 | 联系站长 | 广告服务 |
QQ:280529124  Tel:0592-8271361 辽ICP备05021703号