天天看點

vc / mfc 快捷鍵 的實作

       VC中我們經常使用到快捷鍵,這裡快捷鍵有多種,包括menu,button。另外還區分local的和global的, 其中local的職能在目前程式有焦點(被激活)時有效,而global的,則無論什麼時候都有效,測試local的要優先于global的,就是如果目前激活視窗的快捷鍵與未激活視窗的快捷鍵重疊,目前激活視窗優先響應。

      這裡将快捷鍵分為menu和button兩種。

      menu添加local快捷鍵又分為兩種, 一種是直接與菜單項關聯的加速鍵,另一種就是自定義的加速鍵.

// zz :http://www.cnblogs.com/thankgoodness/articles/1136617.html

 第一種: 首先在資源檔案Accelerator中添加快捷鍵資源 ID選擇你要關聯菜單項的名稱 然後再設定你的快捷鍵.什麼?下一步?在.h檔案中加入一個    HACCEL   hAccel;變量 然後在OnInitDialog或初始化中加入hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU_MAIN));  後面的參數改成加速鍵的資源檔案名.

最後在PreTranslateMessage(MSG* pMsg) 中加入:

    if(::TranslateAccelerator(GetSafeHwnd(),hAccel,pMsg))  

        return   true;

這樣 以後隻要在Accelerator資源檔案中添加快捷鍵就可以了

注意: 添加快捷鍵的名字一定要與菜單名稱一樣 這樣才能響應.現在隻需要在此菜單項中加入OnCommand消息的處理就可以了.

第二種: 還是在資源檔案Accelerator中添加快捷鍵資源 ID自己定義一個.然後再設定你的快捷鍵.下一步...就是在.h檔案中定義一個快捷鍵對象

HACCEL m_hAccel;

然後在.cpp檔案中初始

 m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));

IDR_ACCELERATOR1為你的加速資源名稱.注意不是剛剛定義的加速鍵ID.

再添加PreTranslateMessage消息處理 在裡面加入以下代碼:

 //儲存快捷鍵被啟用

 if(m_hAccel   !=   NULL)  

 {  

  if (TranslateAccelerator(m_hWnd, m_hAccel, pMsg))  

   return   TRUE;   

 }  

再添加OnCommand消息處理 加入以下代碼:

//響應加速鍵

  switch(LOWORD(wParam))  

  {  

  case  SHOW_DIAL0G:   //加速鍵ID  

//...添加處理語句

  break;  

  case   SHOW_DIALOG_02:   //加速鍵ID  

//...添加處理語句

  break;  

  }  

      menu添加global快捷鍵,以對話框程式為例:

在OnInitDialog中添加注冊熱鍵的代碼:

RegisterHotKey(GetSafeHwnd(),1001,NULL,VK_F2);//F2鍵

RegisterHotKey(GetSafeHwnd(),1002,MOD_ALT,'1');//Alt+1鍵

BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)

...

END_MESSAGE_MAP()

中添加WM_HOTKEY的消息映射:

ON_MESSAGE(WM_HOTKEY,&CXXXDlg::OnHotKey)//快捷鍵消息映射手動加入

在頭檔案中添加OnHotKey的聲明:

protected:

afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);//手動加入.

CPP中OnHotKey的實作代碼:

//相應快捷鍵的消息映射

LRESULT CXXXDlg::OnHotKey(WPARAM wParam,LPARAM lParam)

{

    if(wParam ==1001)

    { 

        MessageBox("熱鍵F2已經按下!");

        //這裡可以加上你按鈕要執行的操作,或者直接調用按鈕映射的消息函數

    }

    else if (wParam==1002)

    {

        MessageBox("熱鍵ALT+1已經按下!");

    }

    return 0;

}

關閉對話框時使用

UnregisterHotKey(GetSafeHwnd(),1001);//登出F2鍵

UnregisterHotKey(GetSafeHwnd(),1002);//登出Alt+1鍵

登出熱鍵.

    button添加locak快捷鍵可以直接在button的caption中用 &+'X' 即可,則按下 Ctrl + 'x' 即按下此按鈕,起到快捷鍵的作用,另外還可以學習menu添加local快捷鍵的第二種方式,在PreTranslateMessage中添加處理函數,譬如:

BOOL   CYourDlg::PreTranslateMessage(MSG*   pMsg)    

  {  

          //   TODO:   Add   your   specialized   code   here   and/or   call   the   base   class  

          BOOL   bHandledMsg   =   FALSE;  

          switch   (pMsg->message)  

          {                                              

                  case   WM_KEYDOWN:  

                  {  

                          switch   (pMsg->wParam)  

                          {  

                                  case   VK_ESCAPE://ESC鍵  

                                          bHandledMsg   =   TRUE;  

                                          break;  

                                  case   13://回車  

                                          bHandledMsg   =   TRUE;  

                                          break;  

                                  default:   break;  

                          }   //   switch   (pMsg->wParam)  

                  }  

                  break;  

                  default:   break;                          

          }   //   switch   (pMsg->message)                                      

          return   (bHandledMsg   ?   TRUE   :   CDialog::PreTranslateMessage(pMsg));    

  }

button添加global快捷鍵同menu添加global快捷鍵。