본문 바로가기

IT

[ Win32 - C언어 ] 초간단 한글 IME 입력기 구현하기

반응형


한글 입력기를 만들 때, 커서 처리는 어떻게 할까?

영어의 경우는 a부터 z까지 모두 1바이트로 구성되어 있어서 키보드가 입력될때마다 커서를 한칸씩 이동하면 되고 참 간단합니다. 그러나 한글이나 한자 등.. 조합형 문자는 글자가 완성되기 까지는 커서를 이동하면 않되기때문에 커서 처리가 어렵습니다. 이러한 문제를 처리하기 위해서 Win32에서는 IME라는 입력기 라이브러리를 지원하고 있습니다.


한글 입력기를 구현하기 위해서는 한글 조합형원리를 이해하셔야 하는데요. 처음부터 복잡한 소스를 보면 적응도 않되고 부담이 되실 것입니다. 그래서 아래 초간단 예제를 직접 소스에 적용해 보시고 '아~ 이런식으로 한글 조합이 이루어지는 구나~!'하고 감을 잡으시기를 바랍니다. ^^;


뭐 저처럼 초보들을 위해서 준비했습니다. 자 초간단 예제 시작합니다~ ㅋㅋㅋ


1. Win32 프로젝트를 하나 생성합니다.

 



2. 프로젝트는 "Hello World!" 프로젝트를 선택합니다.



3. 프로젝트 Setting -> Link 탭에서 "imm32.lib" 를 추가합니다.

 



4. 소스 코드 추가.

소스 부분중에 IME_KOREAN_SAMPLE 이라는 부분만 프로젝트에 추가해 주시면 됩니다.


#include <stdio.h>
#define IME_KOREAN_SAMPLE

#if defined(IME_KOREAN_SAMPLE)
char Text[255];     // 텍스트를 저장하기위한 변수
char Cstr[10];      // 조합중인 문자!!

int GetText(HWND hWnd,UINT msg,WPARAM wparam, LPARAM lparam);
#endif

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	
	// 생략..

#if defined(IME_KOREAN_SAMPLE)
	if(GetText(hWnd, message, wParam, lParam) == 0)		
	{
		return 0;
	}
#endif

	switch (message)
	{
	// 생략..
	}
}


#if defined(IME_KOREAN_SAMPLE)
int GetText(HWND hWnd,UINT msg,WPARAM wparam, LPARAM lparam)
{
	int len;     		
	HIMC m_hIMC=NULL;   // IME 핸들
	
	switch (msg)
	{
	case WM_IME_COMPOSITION:
		m_hIMC = ImmGetContext(hWnd);	// ime핸들을 얻는것
		
		if (lparam & GCS_RESULTSTR)
		{
			if ((len = ImmGetCompositionString(m_hIMC, GCS_RESULTSTR, NULL, 0)) > 0)
			{
				// 완성된 글자가 있다.
				ImmGetCompositionString(m_hIMC, GCS_RESULTSTR, Cstr, len);
				Cstr[len] = 0;
				strcpy(Text+strlen(Text),Cstr);
				memset(Cstr,0,10);
				
				
				{
					char szTemp[256] = "";
					sprintf(szTemp, "완성된 글자 : %s\r\n", Text);
					OutputDebugString(_T(szTemp));
				}
			}
			
		}
		else if (lparam & GCS_COMPSTR)	
		{  
			// 현재 글자를 조합 중이다.

			// 조합중인 길이를 얻는다.
			// str에  조합중인 문자를 얻는다.
			len = ImmGetCompositionString(m_hIMC, GCS_COMPSTR, NULL, 0);
			ImmGetCompositionString(m_hIMC, GCS_COMPSTR, Cstr, len);
			Cstr[len] = 0;

			{
				char szTemp[256] = "";
				sprintf(szTemp, "조합중인 글자 : %s\r\n", Cstr);
				OutputDebugString(_T(szTemp));
			}
		}
		
		ImmReleaseContext(hWnd, m_hIMC);	// IME 핸들 반환!!
		return 0;
		
		
	case WM_CHAR:				// 1byte 문자 (ex : 영어)
		return 0;
	case WM_IME_NOTIFY:			// 한자입력...
		return 0;
	case WM_KEYDOWN:			// 키다운..
		return 0;
	}
	return 1;
}
#endif



 
1~4번 과정 마져도 귀찮으신 분들은 Visual Studio 6.0 으로 만든 간단한 예제를 첨부파일로 공유 드립니다.


 
다운 받아서 실행해 보세요~ ^^

 
5. 실행 결과 화면

테스트 입력으로 ("즐거운 블로그 ")를 입력했을 때, 출력 화면입니다.





결론은 한글은 완성된 글자 이벤트가 올때, 커서를 이동시켜 주면 됩니다.!!
도움이 되셨기를 바랍니다~
반응형