zoukankan      html  css  js  c++  java
  • [Symbian] 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();
           }
        }
    }

    发表于: 2008-03-19 ,修改于: 2010-08-30 15:22,已浏览1766次,有评论0条 推荐 投诉

  • 相关阅读:
    利用Oracle创建数据库
    安装Oracle 10g
    安装ArcGIS Engine 9.3
    安装ArcGIS Desktop 9.3
    绘制扇形效果线条小Bug解决
    MFC画线功能总结
    MFC消息映射机制以及画线功能实现
    truncate
    postgresql死锁处理
    python编程中的if __name__ == 'main': 的作用
  • 原文地址:https://www.cnblogs.com/yaoliang11/p/1818056.html
Copyright © 2011-2022 走看看