Symbian CAknSettingItemList使用心得

本文档详细介绍了在Symbian平台中进行UI设计时,如何正确实例化和使用CAknSettingItemList及其派生类。内容覆盖了创建设置项、动态设置内容、监控设置页面事件等方面,并提供了关于滑动条、枚举文本弹窗设置项的具体实现示例。
1,实例化 setting item list 时,一定要遵守下面的顺序:
1) CAknSettingItemList *pList = new (ELeave) CAknSettingItemList derived class
2) pList->SetContainerWindowL(*this);
3) pList->SetMopParent(this);
4) pList->ConstructFromResourceL(resource id);
5) pList->ActivateL();
不要将第四步提前到第二步,否则在container显示时会造成程序崩溃。


2, CAknSettingItemList 可以动态创建, 也可以先定义资源,然后根据资源文件创建. 如果是动态创建,(eg:http://blogimg.chinaunix.net/blog/upfile2/080319182552.zip),则无需继承CAknSettingItemList,不过我不曾实验过. 用资源文件的方式创建,则需要创建一个继承自CAknSettingItemList的类,然后重载CreateSettingItemL, 在这个函数中,根据参数aIdentifier(这个参数的值跟资源文件中定义的每个setting item的identifier相对应)的值使用 new 创建相应类型的setting item(eg: http://blog.chinaunix.net/u/9577/showart_498338.html).

3, 设置,获取setting item的值.
在CAknSettingItemList的子类的CreateSettingItemL函数中调用new创建setting item时,需在构造函数中指定初值; 在构造函数中, 该参数是引用型, 实参不能是局部变量,一般定义成类的成员变量, 该变量与setting item 有一个对应关系, 当setting item的内容改变了时, 该变量的值也会发生变化, 同理,改变改变量的值,setting item的内容也会发生变化; 所以我们可以通过该变量来设置,获取对应setting item的值. 但注意,在设置setting item的值后,记得在CAknSettingItemList子类中调用LoadSettingsL(), 或对相应的setting  item指针调用LoadL(); 在获取setting item的值前, 在CAknSettingItemList子类中调用StoreSettingsL(), 或相应的setting  item指针调用StoreL(), 否则,结果可能没有更新.

4, 定义CAknSliderSettingPage中当前值的显示格式。STRUCT SLIDER中的名为valuelabel的成员,定义了当前值的显示格式。 若valuelabel为"",那么只显示当前值;若valuelabel为"Current: %U Seconds", 那么,当前值后会显示在"Current:"和"Seconds",注意,这里必须用%U, 不能用%d等TDes支持的格式。如果SLIDER 的 valuetype 设置成 EAknSliderValueNone, 那么 valuelabel 中除当前值(%U所对应的值)不显示外,其他内容都会显示。

5, Slider setting item中,显示当前值而不显示滑动条的方法:
class CExtendedSliderSettingItem : public CAknSliderSettingItem
{
public:
    const TDesC& SettingTextL()
    {
        LoadL();
        iData.Format(_L("Current valud: %d"), InternalSliderValue());
        return iData;
    }

    CFbsBitmap* CreateBitmapL()
    {
        return NULL;
    } 

private:
    TBuf<128> iData;
};

6, 动态设置CAknEnumeratedTextPopupSettingItem的内容
在CAknEnumeratedTextPopupSettingItem继承类的EditItemL中,
virtual void EditItemL(TBool bCalledFromMenu)
{
    CAknEnumeratedText* enumeratedText = NULL;
    CArrayPtr<CAknEnumeratedText> * enumeratedTextArray = EnumeratedTextArray();

    HBufC* selectionText = _L("Selection1").AllocLC();
    enumeratedText = new ( ELeave) CAknEnumeratedText(0, selectionText);

    CleanupStack::PushL( enumeratedText);
    enumeratedTextArray->AppendL( enumeratedText);

    HandleTextArrayUpdateL();

    CAknEnumeratedTextPopupSettingItem::EditItemL(bCalledFromMenu));
}

7, 监控Setting page关闭时点击的是OK还是Cancel:
void HandleSettingPageEventL(CAknSettingPage *aSettingPage, TAknSettingPageEvent aEventType)
{
    if(aEventType == MAknSettingPageObserver::EEventSettingChanged)
    {
       //Setting is changed
    }
    else if(aEventType == MAknSettingPageObserver::EEventSettingOked)
    {
       //OK button is changed
    }
    else if(aEventType == MAknSettingPageObserver::EEventSettingCancelled)
    {
       //Cancel button is changed
    }

    UpdateListBoxTextL();
}

8, 若Skin被禁止,CAknSliderSettingPage中的current value, min/max label看不见,原因是它们的颜色跟背景色相同。可以同过设置字体颜色来解决。
1) In CAnkSliderSettingItem derived class, override member function CreateSettingPageL() as below:
CAknSettingPage *CreateSettingPageL()
{
    CMyAknSettingPage *settingPage = new (ELeave) CMyAknSettingPage(SettingPageResourceId(), InternalSliderValue());
    settingPage->SetSettingTextL(SettingName());
    return dynamic_cast<CAknSettingPage *> settingPage;
}

2) Customize Setting page
class CMyAknSettingPage : public CAknSliderSettingPage
{
public:
    CMyAknSettingPage(TInt aResourceId, TInt &aSliderValue) :
    CAknSliderSettingPage(aResourceId, &aSliderValue)
    {
    }

    void ConstructL()
    {
        CAknSliderSettingPage()::ConstructL();
        SliderControl()->OverrideColor(EColorLabelText, KRgbBlack); //Set label text color
        ActivateL()
    }

    void SizeChanged()
    {
       CAknSliderSettingPage:SizeChanged();
       CAknSlider *slider = SliderControl();

       if(slider)
       {
          slider->->OverrideColor(EColorLabelText, KRgbBlack); //Set label text color
          slider->DrawNow();
       }
    }
}
内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)内容概要:本文围绕多旋翼无人机组合导航系统,重点介绍了基于多源信息融合算法的设计与实现,利用Matlab进行代码开发。文中采用扩展卡尔曼滤波(EKF)作为核心融合算法,整合GPS、IMU(惯性测量单元)、里程计和电子罗盘等多种传感器数据,提升无人机在复杂环境下的定位精度与稳定性。特别是在GPS信号弱或丢失的情况下,通过IMU惯导数据辅助导航,实现连续可靠的位姿估计。同时,文档展示了完整的算法流程与Matlab仿真实现,涵盖传感器数据预处理、坐标系转换、滤波融合及结果可视化等关键环节,体现了较强的工程实践价值。; 适合人群:具备一定Matlab编程基础和信号处理知识,从事无人机导航、智能控制、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多旋翼无人机的高精度组合导航系统设计;②用于教学与科研中理解多传感器融合原理与EKF算法实现;③支持复杂环境下无人机自主飞行与定位系统的开发与优化。; 阅读建议:建议结合Matlab代码与理论推导同步学习,重点关注EKF的状态预测与更新过程、多传感器数据的时间同步与坐标变换处理,并可通过修改噪声参数或引入更多传感器类型进行扩展实验。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值