1. 程式人生 > >VC編程增加快捷鍵的幾種方式

VC編程增加快捷鍵的幾種方式

nbsp 標題 老師 tran 快捷鍵 註銷 只需要 family c編程

分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

對於這個問題,大家應該都不陌生,寫於此只是進行了歸納總結,算是一個備忘吧

定義快捷方式有下面幾種方法:
1.對於菜單(MENU)或者按鈕(BUTTON)
直接在菜單或按鈕的標題中,包含&X即可,這裏X是任意字符鍵
示例:Tool菜單項的標題可以寫作:"&Tool"或者"工具(&T)",這樣就可以直接用ALT+T直接調用該菜單項的功能

2.對菜單(MENU)
菜單的另一種快捷鍵的定義方式是組合鍵或者虛擬鍵,如Ctrl+O表示打開文件,或F5表示運行等

示例: 在File菜單項的Open字菜單項的標題可以寫作:"&Open\tCtrl+O",這樣我們既可以用ALT+O或Ctrl+O來直接調用菜單項的功能

3.另一種方式定義快捷鍵的就是自定義加速鍵
首先在資源文件Accelerator中添加快捷鍵資源 ID選擇你要關聯菜單項的名稱然後再設置你的快捷鍵
在.h文件中加入一個HACCEL hAccel;
變量然後在OnInitDialog或初始化中加入 hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU_MAIN)); IDR_MENU_MAIN為加速鍵的資源文件名

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

if(::TranslateAccelerator(GetSafeHwnd(),hAccel,pMsg))  
    return   true;

這樣 以後只要在Accelerator資源文件中添加快捷鍵就可以了
註意: 添加快捷鍵的名字一定要與菜單名稱一樣 這樣才能響應.現在只需要在此菜單項中加入OnCommand消息的處理就可以了.
4.第二種自定義加速鍵的方法
還是在資源文件Accelerator中添加快捷鍵資源 ID自己定義一個.然後再設置你的快捷鍵.
在.h文件中定義一個快捷鍵對象HACCEL m_hAccel;

變量然後在OnInitDialog或初始化中加入 hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU_MAIN)); IDR_MENU_MAIN為加速鍵的資源文件名
再添加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;  
} 
這種方式可以任意調用加速鍵


5.菜單添加全局快捷鍵,以對話框程序為例:

在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鍵
註銷熱鍵.

7.按鈕添加局部快捷鍵可以直接在按鈕的標題中用 &+‘X‘ 即可,則按下 Ctrl + ‘x‘ 即按下此按鈕,起到快捷鍵的作用,另外還可以學習菜單添加局部快捷鍵的第二種方式,在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));    
  }

http://blog.csdn.net/pangshaohua/article/details/6999328

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

VC編程增加快捷鍵的幾種方式