MFC之快捷键Command追加自定义快捷键

 

以下是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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值