IE 에서 DHTML Editing 컨트롤을 이용한 MFC OCX의 탭 키 처리 문제
현상
DHTML Editing 컨트롤을 Embed하여 MFC OCX를 작성한 경우,
IE에서 이 컨트롤을 사용하면 DHTML Editing 컨트롤에서 방향 키 및 탭 키가 동작하지 않습니다.
IE에서 이 컨트롤을 사용하면 DHTML Editing 컨트롤에서 방향 키 및 탭 키가 동작하지 않습니다.
원인
IE 컨테이너가 Accelerator Key에 대한 이벤트를 MFC OCX에서만 처리할 수 있도록 해주기 때문입니다.
즉, IE 에서 MFC OCX에 Embed된 DHTML Editing 컨트롤이 Accelerator Key인 탭 키 및 방향키에 대한 이벤트를 처리하지 못하기 때문입니다.
즉, IE 에서 MFC OCX에 Embed된 DHTML Editing 컨트롤이 Accelerator Key인 탭 키 및 방향키에 대한 이벤트를 처리하지 못하기 때문입니다.
해결 방법
IOleInPlaceActivateObject 인터페이스를 이용하여 MFC OCX의 TranslateAccelerator 메소드가 호출되었을 때 DHTML Editing 컨트롤의 TranslateAccelerator 메소드가 강제적으로 호출되도록 합니다.
예제 코드
예제 코드
// MFC OCX의 이벤트 핸들러
BOOL CTest1Ctrl::PreTranslateMessage(MSG* pMsg)
{
IOleInPlaceActiveObject* piOleInplace;
IUnknown* piUnknown;
switch (pMsg->message) {
case WM_KEYDOWN:
case WM_KEYUP:
switch (pMsg->wParam)
{
// 처리하려는 키에 대하여
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
case VK_HOME:
case VK_END:
OutputDebugString ("Key down for Arrow Key");
// 생성한 DHTML Editing 컨트롤에 대한 IUnknown 인터페이스
// 포인터를 얻습니다.
// 이 인터페이스 포인터에 대해서는 Release()를 호출하지 않도록 합니다.
piUnknown = m_pCDHTMLEdit->GetControlUnknown();
// IOleInPlaceActivateObject의 인터페이스 포인터를 얻습니다.
piUnknown->QueryInterface(IID_IOleInPlaceActiveObject,(void**)&piOleInplace);
// Accelerator Key 입력에 대한 처리 호출
piOleInplace->TranslateAccelerator(pMsg);
piOleInplace->Release();
return TRUE;
}
break;
}
return COleControl::PreTranslateMessage(pMsg);
}
원문 : http://support.microsoft.com/kb/601529/ko
댓글
댓글 쓰기