에디트 박스에 현재 입력중인 문자열을 DB등에서 실시간으로 바로 검색하여 결과를 출력하는 루틴을 구현하고 할 때, CEdit 에서 영문이나 숫자 입력시에는, EN_CHANGE Notification Event로 문자열 변경된 상태를 통지 받을 수 있다. 해당 Event가 떨어지면, GetWindowText 등으로 해당 문자열을 가져와 DB Query 수행이 가능하다.
다만, 한글이나 기타 Unicode 문자열 입력의 경우에는 IME를 통해 조합(Composition) 되는 과정이 추가되기 때문에, EN_CHANGE Event에 의존할 시에는 현재 입력중인 문자열을 제대로 취득하지 못하는 문제점이 발생한다.
SOLUTION
1. IME 조합완료 후, Parent에 완료 통지
/* CEdit Derived Custom Class */
BOOL m_bIsComposition; // TODO : Declare in header
LRESULT CCustEditCtrl::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_IME_STARTCOMPOSITION:
m_bIsComposition = TRUE;
break;
case WM_IME_ENDCOMPOSITION:
m_bIsComposition = FALSE;
// TODO : Post a specified user message to its parent
break;
case WM_IME_COMPOSITION:
break;
}
return CEdit::DefWindowProc(message, wParam, lParam);
}
2. Parent 에서 조합완료 메시지를 받아서 문자열 처리
LRESULT CParentDlg::OnEditEndComposition(WPARAM wParam, LPARAM)
{
if(wParam == IDC_EDIT)
{
m_ctrlEdit.GetWindowText(m_strSearch);
QueryDB(m_strSearch);
}
return 0L;
}
3. EN_CHANGE Event에서, IME가 Composition 중일 때에는 무시
if(dwEvent == EN_CHANGE)
{
if(m_ctrlEdit.IsComposition()) // Returns 'm_bIsComposition' sets in CEdit derived custom class
return TRUE;
m_ctrlEdit.GetWindowText(m_strSearch);
QueryDB(m_strSearch);
}
이로써, 에디트창에서 한글 입력의 경우에도, 입력된 문자열을 제대로 실시간 핸들링이 가능해진다.
나열된 Code는 해당 프로젝트에 맞게끔 Member, Function 등을 적절히 추가 및 수정하여 적용.
반응형
댓글