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;
}

 

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