参照: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"));
}
}
【