現在快捷鍵的使用已經很頻繁了。快捷鍵可以使我們的操作變得更簡單,更快捷。如何給自己的按鈕加一個快捷鍵呢。
如下圖:我們希望給我們的參照按鈕加一個快捷鍵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。
用加速鍵表來添加快加鍵是很方便的,不需要加很多代碼。