MFC---給按鈕加上快捷鍵


   現在快捷鍵的使用已經很頻繁了。快捷鍵可以使我們的操作變得更簡單,更快捷。如何給自己的按鈕加一個快捷鍵呢。
    如下圖:我們希望給我們的參照按鈕加一個快捷鍵CTR + F。 

 

    不要以為在按鈕的標題上加上F就行了,這只是給用戶看的。 我們需要實現它,實現它有兩種方法。先說方法一。
    我們可以這樣想,我們截取用戶的F按鍵,如果用戶按了F按鍵的話,判斷一下ctr鍵是否被按下,如果被按下的話,說明用戶按了CTR + F ,然后我們去調相應的按鈕事件就可以了。
   我們需要覆寫CDialog類的 PreTranslateMessage(MSG* pMsg);這是一個虛方法。
  代碼如下:

 BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
        //先判斷是否是鍵盤輸入消息
	if (pMsg-> message== WM_KEYDOWN) {
		int nkeyDown =  pMsg->wParam;
                 //ctr鍵的狀態獲取
		BOOL bkeyState = GetKeyState(VK_CONTROL);
                //0x46是F鍵的16進制表示 
		if (nkeyDown == 0x46 && bkeyState) {
                       //調相應的按鈕事件 
			OnBnClickedButtonOpenfile();
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
} 

這就完成了。

我們仔細看一下上面的代碼會發現:只要滿足CTR被按下的同時F鍵也被按下,那么就會觸發這個事件。換句話說ctr 和F被同時按下的時候,其他鍵也被按下,也會觸發該事件。如CTR + ALT + F也行。當然在要求不嚴格的情況下,這樣已經OK了。
      有一天我發現CTR + F這個快捷鍵是許多軟件的查找快捷鍵。當然我把ctr+ F定義成文件打開快捷鍵也沒錯。這有點看起來不倫不類。很多人認為CTR + F是查找快捷鍵 ,你把ctr+ F定義成文件打開快捷鍵,別人用的程序會不習慣的。
    后來我把快捷鍵定義成ctr + ALT + F。代碼如下:

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
    //先判斷是否是鍵盤輸入消息
  if (pMsg-> message== WM_KEYDOWN) {
    int nkeyDown =  pMsg->wParam;
       //ctr鍵的狀態獲取
    BOOL bCtrkeyState = GetKeyState(VK_CONTROL); 
       BOOL bAltkeyState = GetKeyState(VK_MENU);  
       //0x46是F鍵的16進制表示 
       if (nkeyDown == 0x46 && bCtrkeyState && bAltkeyState  ) {
            //調相應的按鈕事件 
	  OnBnClickedButtonOpenfile();
	}
  }
  return CDialog::PreTranslateMessage(pMsg);
} 

發現這樣就OK了。后來我的leader告訴我CTR + ALT + F 按起來不方便,一只手按有點困難,你把CTR + ALT + F改成 ALT + F。
我認為這是很簡單的一件事。我說很容易,我這樣做的: 

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
    //先判斷是否是鍵盤輸入消息
  if (pMsg-> message== WM_KEYDOWN) {
	int nkeyDown =  pMsg->wParam;
        //alt鍵的狀態獲取
        BOOL bAltkeyState = GetKeyState(VK_MENU);  
        //0x46是F鍵的16進制表示 
     if (nkeyDown == 0x46 && bAltkeyState  ) {
            //調相應的按鈕事件 
	  OnBnClickedButtonOpenfile();
	}
  }
  return CDialog::PreTranslateMessage(pMsg);
}  

  我發現失敗了, 按alt + F 根本不會進入if (pMsg-> message== WM_KEYDOWN) { }這個塊里。查了許多資料,發現alt很特殊,它的宏定義是
VK_MENU,其實它是MENU菜單的快捷鍵。
    alt + F是不是就實現不了呢?不是的,是可以實現的,這就是加快捷鍵的第二種方法。 
   我們可以用加速鍵表來添加快加鍵。
  打開資源視圖,新建Accelerator資源。加入ALT + F快捷鍵。

  這里的ID就是相應按鈕的ID。定義一個成員變量HACCEL m_hAccel;
  在OnInitDialog()方法里進行初始化:

m_hAccel = LoadAccelerators(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
    if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST) 
    { 
        HACCEL hAccel = m_hAccel; 
        if (hAccel && ::TranslateAccelerator(m_hWnd, hAccel, pMsg)) 
            return TRUE; 
    } 
    return CDialog::PreTranslateMessage(pMsg);
}

運行,發現OK。
   用加速鍵表來添加快加鍵是很方便的,不需要加很多代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM