본문 바로가기
Dev.Stuff

[WM6] 한글 입력시 실시간 검색을 위한 CEdit Handling

by Devkin 2010. 12. 2.

에디트 박스에 현재 입력중인 문자열을 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 등을 적절히 추가 및 수정하여 적용.

반응형

댓글