以下是rc文件
IDR_ACCELERATOR_TEMPLATE_REPORT ACCELERATORS
BEGIN
VK_ADD, ID_TEMPLATE_CMD_EXPAND_ALL, VIRTKEY, SHIFT
VK_SUBTRACT, ID_TEMPLATE_CMD_COLLAPSE_ALL, VIRTKEY, SHIFT
VK_ADD, ID_TEMPLATE_CMD_EXPAND, VIRTKEY
VK_SUBTRACT, ID_TEMPLATE_CMD_COLLAPSE, VIRTKEY
VK_F2, ID_TEMPLATE_CMD_ENTER_EDIT_MODE, VIRTKEY
"C", ID_EDIT_COPY, VIRTKEY, CONTROL
"V", ID_EDIT_PASTE, VIRTKEY, CONTROL
// [「-1」を使うことで、キー動作を回避する.]
"X", -1, VIRTKEY, CONTROL
VK_DELETE, ID_EDIT_CLEAR, VIRTKEY
END
IDR_ACCELERATOR_TEMPLATE_PROP_DLG ACCELERATORS
BEGIN
"Z", ID_EDIT_UNDO, VIRTKEY, CONTROL
"Y", ID_EDIT_REDO, VIRTKEY, CONTROL
VK_RETURN, ID_TEMPLATE_CMD_ENTER_KEY, VIRTKEY
"M", ID_TEMPLATE_CMD_FOCUS_TO_TEMPLATE_NAME, VIRTKEY, ALT
END
在代码中
以下是.h类的定义中,函数申明
// [コピーコマンドの処理関数.]
afx_msg void mf_OnCopyCommand();
// [貼り付けコマンドの処理関数.]
afx_msg void mf_OnPasteCommand();
// [削除コマンドの処理関数.]
afx_msg void mf_OnClearCommand();
// [すべてのツリーを展開するコマンドの処理関数.]
afx_msg void mf_OnExpandAllCommand();
// [すべてのツリーを折り畳むコマンドの処理関数.]
afx_msg void mf_OnCollapseAllCommand();
// [ツリーを展開するコマンドの処理関数.]
afx_msg void mf_OnExpandCommand();
// [ツリーを折り畳むコマンドの処理関数.]
afx_msg void mf_OnCollapseCommand();
// [編集モードにするコマンドの処理関数.]
afx_msg void mf_OnEnterEditModeCommand();
// [テンプレートレポートにフォーカスを置くコマンドの処理関数.]
afx_msg void mf_OnFocusToTemplateReportCommand();
// [コピーコマンドの実行条件の判断関数.]
afx_msg void mf_OnUpdateCopyCommand(CCmdUI * ppC_CommandUI);
// [貼り付けコマンドの実行条件の判断関数.]
afx_msg void mf_OnUpdatePasteCommand(CCmdUI * ppC_CommandUI);
// [削除コマンドの実行条件の判断関数.]
afx_msg void mf_OnUpdateClearCommand(CCmdUI * ppC_CommandUI);
以下是.cpp文件,函数实现。
BEGIN_MESSAGE_MAP(CGTDTemplateReport, CXTPReportControl)
ON_WM_PAINT()
ON_WM_CONTEXTMENU()
ON_WM_CHAR()
ON_WM_MOUSEWHEEL()
ON_COMMAND(ID_EDIT_COPY, mf_OnCopyCommand)
ON_COMMAND(ID_EDIT_PASTE, mf_OnPasteCommand)
ON_COMMAND(ID_EDIT_CLEAR, mf_OnClearCommand)
ON_COMMAND(ID_TEMPLATE_CMD_EXPAND_ALL, mf_OnExpandAllCommand)
ON_COMMAND(ID_TEMPLATE_CMD_COLLAPSE_ALL, mf_OnCollapseAllCommand)
ON_COMMAND(ID_TEMPLATE_CMD_EXPAND, mf_OnExpandCommand)
ON_COMMAND(ID_TEMPLATE_CMD_COLLAPSE, mf_OnCollapseCommand)
ON_COMMAND(ID_TEMPLATE_CMD_ENTER_EDIT_MODE, mf_OnEnterEditModeCommand)
ON_COMMAND(ID_TEMPLATE_CMD_FOCUS_TO_TEMPLATE_REPORT, mf_OnFocusToTemplateReportCommand)
ON_COMMAND(ID_TEMPLATE_CMD_OPEN_SETTING_DIALOG, mf_OnOpenSettingDialogCommand)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, mf_OnUpdateCopyCommand)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, mf_OnUpdatePasteCommand)
ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR, mf_OnUpdateClearCommand)
ON_MESSAGE(WM_IME_COMPOSITION, OnImeComposition)
END_MESSAGE_MAP()
在构造函数中load.
void CGTDTemplateReport::mf_LoadAccelerator()
{
HINSTANCE lh_ResourceModule = ((CGTDApp*)AfxGetApp())->mh_Resource;
mh_Accelerator = LoadAccelerators(lh_ResourceModule, MAKEINTRESOURCE(IDR_ACCELERATOR_TEMPLATE_REPORT));
return;
}
部分函数实装示例:
/** 削除コマンドの処理関数.
* @ param : なし.
* @ return : なし.
* @ exception : なし.
*/
void CGTDTemplateReport::mf_OnClearCommand()
{
CGTDTemplateSettingItem * lpC_FocusedSettingItem = mfpC_GetFocusedSettingItem();
if (lpC_FocusedSettingItem != NULL)
{
lpC_FocusedSettingItem->mf_Clear();
}
return;
}
/** すべてのツリーを展開するコマンドの処理関数.
* @ param : なし.
* @ return : なし.
* @ exception : なし.
*/
void CGTDTemplateReport::mf_OnExpandAllCommand()
{
CXTPReportRow *lpC_Row = GetFocusedRow();
ExpandAll();
// [選択状態の行を設定する.]
if (lpC_Row != NULL)
{
GetSelectedRows()->Clear();
// [行を選択する.]
lpC_Row->SetSelected(TRUE);
}
SendNotifyMessage(XTP_NM_REPORT_SELCHANGED);
return;
}
/** すべてのツリーを折り畳むコマンドの処理関数.
* @ param : なし.
* @ return : なし.
* @ exception : なし.
*/
void CGTDTemplateReport::mf_OnCollapseAllCommand()
{
// [すべてのツリーを折り畳む前の選択状態の行を取得する.]
CXTPReportRow *lpC_Row = GetFocusedRow();
CollapseAll();
// [選択状態の行をクリアする.]
GetSelectedRows()->Clear();
// [選択状態の行が属性グループ行の場合.]
//if((lpC_Row->GetRecord()->IsKindOf(RUNTIME_CLASS(CGTDTemplateAttrGroupRecord)) != FALSE))
// [テンプレート編集ダイアログのデータエリア右のグループ行も追加する.]
if (((lpC_Row->GetRecord()->IsKindOf(RUNTIME_CLASS(CGTDTemplateAttrGroupRecord)) != FALSE)) ||
((lpC_Row->GetRecord()->IsKindOf(RUNTIME_CLASS(CGTDTemplateMemberRecord)) != FALSE)))
{
// [属性グループ行を選択する.]
lpC_Row->SetSelected(TRUE);
}
// [選択状態の行が属性グループ行の場合.]
else
{
CXTPReportRow *lpC_ParentRow = lpC_Row->GetParentRow();
// [所属の属性グループ行を選択する.]
//lpC_ParentRow->SetSelected(TRUE);
if (lpC_ParentRow != NULL)
{
lpC_ParentRow->SetSelected(TRUE);
}
}
SendNotifyMessage(XTP_NM_REPORT_SELCHANGED);
return;
}
/** ツリーを展開するコマンドの処理関数.
* @ param : なし.
* @ return : なし.
* @ exception : なし.
*/
void CGTDTemplateReport::mf_OnExpandCommand()
{
CXTPReportRow *lpC_Row = GetFocusedRow();
// [ツリーを展開する.]
lpC_Row->SetExpanded(TRUE);
SendNotifyMessage(XTP_NM_REPORT_SELCHANGED);
return;
}
/** ツリーを折り畳むコマンドの処理関数.
* @ param : なし.
* @ return : なし.
* @ exception : なし.
*/
void CGTDTemplateReport::mf_OnCollapseCommand()
{
CXTPReportRow *lpC_Row = GetFocusedRow();
// [ツリーを折り畳む.]
lpC_Row->SetExpanded(FALSE);
SendNotifyMessage(XTP_NM_REPORT_SELCHANGED);
return;
}