MFC裡使用快捷鍵的原理:按鍵組合成一個COMMAND/COMMAND_UI消息放入消息隊列,然後程式對該消息進行處理。
1.添加Accelerator表(按鍵組合與消息的對應表)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR90dJpnTxUleNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1MjMxAzM1MTMwEjMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
編輯Accelerator表
修改表ID
在Resource View視窗修改表ID為 IDR_MYACCEL
2.添加消息處理
第一種:右鍵單擊Accelerator表選項,Add Event Handler
第二種:在程式其他地方處理,比如MenuBar、ToolBar及右鍵菜單消息進行中,隻要其中消息的ID與表中ID一緻即可
3.加載Accelerator資源
在OnInitDialog中:
HACCEL m_hAccel;
m_hAccel = LoadAccelerators ( AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_MYACCEL) );
4.激活快捷鍵
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if ( NULL != m_hAccel &&
pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST )
{
return TranslateAccelerator ( m_hWnd, m_hAccel, pMsg );
}
else
return CDialog::PreTranslateMessage(pMsg);
}
TranslateAccelerator()函數試圖将按鍵組合成COMMAND消息并處理。
或者直接在函數内判斷按鍵的組合情況
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(GetAsyncKeyState(VK_CONTROL)) //CTRL 按下
{
if( pMsg->wParam == 'C') //C按下
OnCopy();
if( pMsg->wParam == 'V') //V按下
OnPaste();
if( pMsg->wParam == 'L') //L按下
OnClear();
if( pMsg->wParam == 'A') //A按下
OnSelectAll();
}
}
else
return CDialog::PreTranslateMessage(pMsg);
}