UIQ的CPF

參照:http://books.uiq.com/index.php/Commands_and_categories

1. 簡單例子:
 a. 使用資源定義view範圍的commands
 QIK_VIEW_CONFIGURATION
   {
   ui_config_mode = KQikPenStyleTouchPortrait;
   command_list = r_list_view_generic_commands;
   view = r_list_view_view;
   }

 b. 使用資源定義指定page的commands
 QIK_VIEW_PAGE
   {
   page_id = EAppSpecificListViewPageId2;
   tab_bmpid = EMbmCommands1Tab2;
   tab_bmpmaskid = EMbmCommands1Tab2mask;
   page_content = r_list_view_page2_control;
   command_list = r_page2_specific_commands;
   }

2. QIK_COMMAND字段描述:
 enum TQikCommandType
   {
   EQikCommandTypeScreen,   // 命令適用於整個view或dialog
   EQikCommandTypeItem,       // 命令只用於當前獲得焦點的控件
   EQikCommandTypeYes,     
   EQikCommandTypeNo,      
   EQikCommandTypeDone,    
   EQikCommandTypeDelete, 
   EQikCommandTypeCancel, 
   EQikCommandTypeHelp,      // 出現在幫助菜單列表
   EQikCommandTypeSystem, // App 不建議使用一下類型
   EQikCommandTypeOperator,
   EQikCommandTypeFep,          // 由FEP添加
   EQikCommandTypeCategory  // 出現在分類菜單列表
   };

 groupId 分命名分組和無命名分組
 無命名分組將被顯示在一起,以分隔符分開。
 命名分組將會以級聯菜單的方式顯示:               Sort--> Sort by name
   QIK_COMMAND                                                                 Sort by 2nd letter
       {
       namedGroupLinkId = EAppCmdSortCmdsLink;
       priority = EAppCmdSortCascadePriority;
       text = "Sort";
       },
 
    QIK_COMMAND
       {
       namedGroupId = EAppCmdSortCmdsLink;
       priority = EAppCmdSortType1Priority;
       text = "Sort by name";
       },
 
    QIK_COMMAND
       {
       namedGroupId = EAppCmdSortCmdsLink;
       priority = EAppCmdSortType2Priority;
       text = "Sort by 2nd letter";
       },

 priority 顯示的優先級,相同優先級的控件顯示在一起。Copy,Cut,Past
 stateFlags 按鈕顯示類型:
 EQikCmdFlagCheckBox
 EQikCmdFlagDebugOnly 
 EQikCmdFlagDimmed  
 EQikCmdFlagInlinePane // 帶文字的分隔符 -- Sort --
 EQikCmdFlagInvisible
 EQikCmdFlagRadioEnd     // --
 EQikCmdFlagRadioMiddle //  | -- Radio組
 EQikCmdFlagRadioStart    // --
 EQikCmdFlagSortAlphabetic
 EQikCmdFlagSymbolOn    // 對於checkbox命令, EQikCmdFlagSymbolOn表明被選中.
 EQikCmdFlagUnavailable // 用在命令按文本排序而非priority
 
 cpfFlags 控件顯示的位置:按鈕框或菜單

3。代碼中添加刪除commands
void CAppSpecificListView::TabActivatedL(TInt aTabId)
  {
  CQikCommandManager& cm=CQikCommandManager::Static();
  if (aTabId==EAppSpecificListViewPageId1)
    {
    // Page one adds a Create and erase command.
    cm.InsertIntoCommandListL(*this,*this, R_ALTERNATE_COMMANDS);
 
    cm.DeleteCommand(*this,EAppCmdSortAltType1);
    cm.DeleteCommand(*this,EAppCmdSortAltType2);
    }
  else
    {
 
    // Remove any create and erase commands
    // added in page one.
    cm.DeleteFromCommandList(*this,R_ALTERNATE_COMMANDS);
 
    // Manually add a couple of sort commands.
    TBuf<64>bb;
    CQikCommand* q = CQikCommand::NewLC(EAppCmdSortAltType1);
    q->SetType(EQikCommandTypeScreen);
    q->SetPriority(EAppCmdSortType1Priority);
    q->SetGroupId(EAppCmdSortGroup);
    q->SetIcon(KMbmFile, EMbmCommands1Icon0, EMbmCommands1Icon0mask);
    iEikonEnv->ReadResourceL(bb,R_STR_SORT_TYPE1);
    q->SetTextL(bb);
    q->SetHandler(this);
    cm.InsertCommandL(*this,q);
    CleanupStack::Pop(q);
 
    q=CQikCommand::NewLC(EAppCmdSortAltType2);
    q->SetType(EQikCommandTypeScreen);
    q->SetPriority(EAppCmdSortType1Priority);
    q->SetGroupId(EAppCmdSortGroup);
    q->SetIcon(KMbmFile, EMbmCommands1Icon1, EMbmCommands1Icon1mask);
    iEikonEnv->ReadResourceL(bb,R_STR_SORT_TYPE2);
    q->SetTextL(bb);
    q->SetHandler(this);        // We are MQikCommandHandler
    cm.InsertCommandL(*this,q);
    CleanupStack::Pop(q);
    }
 
  CQikMultiPageViewBase::TabActivatedL(aTabId);
  }

4. 創建擁有菜單的控件,如CEikEdwin,CQikListbox。
// ImageButton.h
class CImageButton : public CCoeControl
                   , public MQikCommandListOwner
                   , public MQikCommandHandler
{
 // 其他屬性......
private:
     // from MQikCommandListOwner
    virtual MQikCommandHandler* MapCommandHandler(CQikCommand& aCommand);
  
    // MQikCommandHandler
   virtual void HandleCommandL(CQikCommand& aCommand);

   virtual void PrepareForFocusLossL();
   virtual void PrepareForFocusGainL();

private:
    // ....
}

// ImageButton.cpp
MQikCommandHandler* CImageButton::MapCommandHandler(CQikCommand& aCommand)
{
     if (aCommand.Id() == EImageButtonClickCmd)
     {
         return this;
     }
 
     return NULL;
}

void CImageButton::HandleCommandL(CQikCommand& aCommand)
{
    User::InfoPrint(_L("Hello world"));
}

void CImageButton::PrepareForFocusLossL()
{
     CQikCommandManager& manager = CQikCommandManager::Static(*iCoeEnv);
     manager.DeleteFromCommandList(*this, R_IMAGEBUTTON_COMMANDS);
}

void CImageButton::PrepareForFocusGainL()
{
     CQikCommandManager& manager = CQikCommandManager::Static(*iCoeEnv);
     manager.InsertIntoCommandListL(*this, *this, R_IMAGEBUTTON_COMMANDS);
}

// ImageButton.rss
RESOURCE QIK_COMMAND_LIST r_imagebutton_commands
 {
 items =
      {
      QIK_COMMAND
           {
           id = EImageButtonClickCmd;
           type = EQikCommandTypeItem;
           text = "Click";
           }
      };
 }
// end of file

不過在在S60平臺可以如下實現:
void CImageButton::PrepareForFocusGainL()
{
   iCtrlCba = CEikButtonGroupContainer::NewL(
       CEikButtonGroupContainer::ECba,
       CEikButtonGroupContainer::EHorizontal,
       this, R_IMAGEBUTTON_COMMANDS, *this);
}
void CImageButton::PrepareForFocusLossL()
 {
     delete iCtrlCba;
     iCtrlCba = NULL;
}

// from MEikCommandObserver
void CInsCombox::ProcessCommandL(TInt aCommandId)
{
 if (aCommandId == EImageButtonClickCmd)
 {
  User::InfoPrint(_L("Hello world"));
 }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章