[MFC] 단축키 추가 – PreTranslateMessage, Accelerator

[MFC] 단축키 추가 – PreTranslateMessage, Accelerator

오늘은 Accelerator을 사용하여 단축키를 추가하는 방법을 알아보겠습니다.

윈도우 응용프로그램은 PreTranslateMessage에서 키 입력을 포함한 여러 가지 메시지들을 볼 수 있습니다.
그 메시지들 중에 키 입력하는 것을 해볼텐데, Accelerator를 사용하지 않으면 매우 복잡해지니 Accelerator을 사용해서 개발해보도록 하겠습니다.

MFC프로젝트를 생성하신 후 아래와 같이 Accelerator를 리소스에 추가합니다.

그러면 리소스 뷰에 아래와 같이 추가 됩니다.

여기에 ID, 보조키, 키를 아래와 같이 입력합니다.

그리고 해당 ID를 우클릭 하셔서 이벤트 처리기 추가를 클릭합니다.

아래와 같이 이벤트 처리기에 입력을 하시고, 추가 및 편집을 선택합니다.

위 작업을 완료하시면 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를 추가합니다.

그리고 PreTranslateMessage 내부에 아래와 같이 코딩합니다.

BOOL CMFCApplication1Dlg::PreTranslateMessage( MSG* pMsg )
{
	// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
	if ( ::TranslateAccelerator( this->m_hWnd, m_hAccel, pMsg ) )
		return TRUE;

	return CDialogEx::PreTranslateMessage( pMsg );
}

그리고 실행 후 Ctrl + S를 눌러보시면 아래와 같이 작동합니다.

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 );
}