오늘은 Accelerator을 사용하여 단축키를 추가하는 방법을 알아보겠습니다.
윈도우 응용프로그램은 PreTranslateMessage에서 키 입력을 포함한 여러 가지 메시지들을 볼 수 있습니다.
그 메시지들 중에 키 입력하는 것을 해볼텐데, Accelerator를 사용하지 않으면 매우 복잡해지니 Accelerator을 사용해서 개발해보도록 하겠습니다.
MFC프로젝트를 생성하신 후 아래와 같이 Accelerator를 리소스에 추가합니다.
![](https://3001ssw.com/wp-content/uploads/2023/07/img-min-31.png)
![](https://3001ssw.com/wp-content/uploads/2023/07/img_1-min-26.png)
그러면 리소스 뷰에 아래와 같이 추가 됩니다.
![](https://3001ssw.com/wp-content/uploads/2023/07/img_2-min-22.png)
여기에 ID, 보조키, 키를 아래와 같이 입력합니다.
![](https://3001ssw.com/wp-content/uploads/2023/07/img_3-min-15.png)
그리고 해당 ID를 우클릭 하셔서 이벤트 처리기 추가를 클릭합니다.
![](https://3001ssw.com/wp-content/uploads/2023/07/img_4-min-11.png)
아래와 같이 이벤트 처리기에 입력을 하시고, 추가 및 편집을 선택합니다.
![](https://3001ssw.com/wp-content/uploads/2023/07/img_5-min-7.png)
위 작업을 완료하시면 OnAcceleratorCtrlS() 함수가 추가 됩니다.
이 함수에 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnAcceleratorCtrlS()
{
// TODO: 여기에 명령 처리기 코드를 추가합니다.
AfxMessageBox( _T("Ctrl+S") );
}
우선 Accelerator을 사용해서 메시지를 구별하는 것까지 코딩이 완료되었습니다.
이제 이 Accelerator를 Load해서 PretranslateMessage에 Translate시켜야 합니다.
대화상자 헤더파일에 아래와 같이 선언합니다.
HACCEL m_hAccel;
그리고 OnInitDialog에 아래와 같이 코딩합니다.
m_hAccel = ::LoadAccelerators( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDR_ACCELERATOR1 ) );
아래 그림과 같이 PreTranslateMessage를 추가합니다.
![](https://3001ssw.com/wp-content/uploads/2023/07/img_6-min-6.png)
그리고 PreTranslateMessage 내부에 아래와 같이 코딩합니다.
BOOL CMFCApplication1Dlg::PreTranslateMessage( MSG* pMsg )
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if ( ::TranslateAccelerator( this->m_hWnd, m_hAccel, pMsg ) )
return TRUE;
return CDialogEx::PreTranslateMessage( pMsg );
}
그리고 실행 후 Ctrl + S를 눌러보시면 아래와 같이 작동합니다.
![](https://3001ssw.com/wp-content/uploads/2023/07/img-min-18.gif)
Accelerator을 사용하지 않으면 아래와 같이 복잡해집니다. 개발자 취향이긴 하겠지만, 둘중 비교하셔서 어떤게 더 편한지 확인해보시고 사용하시기 바랍니다.
BOOL CMFCApplication1Dlg::PreTranslateMessage( MSG* pMsg )
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if ( WM_KEYDOWN == pMsg->message ) // 키보드가 눌렸을때 처리
{
switch ( pMsg->wParam )
{
case VK_ESCAPE://ESC키를 눌렀을때..
return TRUE;
break;
case VK_RETURN://Enter키를 눌렀을때..
return TRUE;
break;
// .. 기타 등등 Key 처리
}
}
if ( WM_SYSKEYDOWN == pMsg->message ) // 시스템 키가 눌렸을때 처리
{
// ...
}
return CDialogEx::PreTranslateMessage( pMsg );
}