INTRODUCTION

에디트 박스에 현재 입력중인 문자열을 DB등에서 실시간으로 바로 검색하여 결과를 출력하는 루틴을 구현하고 할 때, CEdit 에서 영문이나 숫자 입력시에는, EN_CHANGE Notification Event로 문자열 변경된 상태를 통지 받을 수 있다. 해당 Event가 떨어지면, GetWindowText 등으로 해당 문자열을 가져와 DB Query 수행이 가능하다.

PROBLEM

다만, 한글이나 기타 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);
}
CONCLUSION

이로써, 에디트창에서 한글 입력의 경우에도, 입력된 문자열을 제대로 실시간 핸들링이 가능해진다.
나열된 Code는 해당 프로젝트에 맞게끔 Member, Function 등을 적절히 추가 및 수정하여 적용.

공유하기 링크
TAG
, , ,
댓글
댓글쓰기 폼