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
댓글
댓글 쓰기