zoukankan      html  css  js  c++  java
  • 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();
           }
        }
    }
  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/yaoliang11/p/1849956.html
Copyright © 2011-2022 走看看