본문 바로가기

예전/3D

[3D UI] Dx로 EditBox 만들기



IME 란 입력기 또는 입력 방식 편집기 (Input method Editor, IME)로 한글, 한자 처럼 컴퓨터 자판에 있는 글쇠보다 더 많은 수의 문자(즉, 조합해서 사용해야 하는 문자)를 계산하거나 입력해주는 시스템 소프트웨어이다. 


MS의 IME는 IME함수 및 메시지 인터페이스를 통해 입력과정을 수행하는 DLL이다.



IME를 이용한 한글 입력기

풀 모드상에서 한글 입력을 어떻게 받는지? IME를 어떻게 제어하는지?


기본적으로 WM_CHAR에서 받고, 조합 중인 글자만 IME함수를 사용해서 얻어오면 된다. 그리고 한자키를 누르면 특수 문자 및 한자를 얻어와 화면에 9개를 찍어주면 된다.


윈도우 메시지 조작이 아니기 때문에 메시지 루틴 내의 가공이 필요하다. 


메시지 루틴 내에서 메시지 루틴에 들어가기 전




이렇게 한 후 imm32.lib를 링크하면 된다.





텍스트를 저장하기 위한 변수에는 글이 들어간다.

조합 중인 문자는 특수문자 혹은 변수등을 위해 쓰인다.


조합중인 문자의 길이는 4byte정도만 있어도 된다.


조합중이라는 메시지는 문자를 조합하는 중이라는 뜻이고 IME 함수를 사용해 조합중인 글씨를 얻어온다.


WM_CHAR는 영어면 그냥 넘어가고, 한글같은 문자이면 한 글자가 완성되면 넘어온다.




아래에 있는 메시지는 한자키를 눌렀을 때 나오는 메시지 이고, 한자키를 눌러서 나온 특수문자 박스의 좌우 이동을 위한 것도 있다.












IME 메시지


시스템은 IME 윈도우의 변화나 조립 문자열 등의 변화등 모든 상태 변화에 대헤 IME메시지를 윈도우로 보낸다. 이 메시지를 무시하고, DefWindowProc으로 보낼 경우 응용 프로그램은 완성된 문자에 대해서만 WM_CHAR 메시지를 받게 될 것이다.


한글 조합에 관련된 메시지


- WM_IMG_STARTCOMPOSITION 

IME가 조립 문자열을 만들기 직전에 보낸다. 조립을 시작한다는 단순한 통지일 뿐 전달되는 인자 혹은 리턴 값은 없다.

만약 Custom IME윈도우를 작성할 경우 이 메시지를 커스텀 IME 윈도우에 전달해야 한다.

디폴트 IME 윈도우는 이 메시지를 받았을 때 조립 윈도우를 보여준다. 만약 DefWindowProc으로 보내지 않으면 조립 윈도우는 나타나지 않는다.


즉, 한글입력이 시작됬을 때 발생한다.


- WM_IME_ENDCOMPOSITION

조립이 끝났다는 통지 메시지 이며, 역시 인자, 리턴 값이 없다. 


즉, 한글 입력 도중 다른 문자가 입력되었을 때 발생



- WM_IMG_COMPOSITION 

가장 중요하고 핵심적인 메시지로 조립 상태가 변경될 때마다 보내진다. 조립 중인 상태를 보여주고 싶다면, 이메시지를 처리해야한다.



wParam 에는 조립중인 문자 코드가 전달되는데, 이 코드는 2byte의 DBCS 문자로 조립중인 중간 문자 코드이다.

lParam 에는 조립 상태가 어떻게 변경되었는지, 이 문자를 어떻게 처리해야 하는지를 나타내는 플래그의 집합이다. 


많은 플래그 중 2개의 플래그가 중요하다.


GCS_COMPSTR : 아직 조립중인 문자라는 뜻으로, 한 음절이 완성되지 않았다는 것이다.

GCS_RESULTSTR : 한 음절이 완성됬다는 뜻이다.


lParam을 보면 문자가 완성 됬는지 조립중인지 위 플래그로 알 수 있다.



- WM_IME_SETCONTEXT


응용 프로그램이 활성화 또는 비활성화될 때 보내진다. wParam이 TRUE이면 활성화되었다는 뜻이고, FALSE이면 비활성화 됬다는 뜻이다.

한글 윈도우의 경우 DefWindowProc으로 이 메시지를 보내면된다. 커스텀 IME 윈도우를 생성할 경우 이 메시지를 받았을 때, ImmIsUIMessage 함수를 호출해 조립 윈도우와 후보 윈도우를 보이도록 해야한다.


윈도우가 활성화 될 때 기본 IME의 초기화를 위해서 발생된다. 프로그램 내에서 미완성 글자를 표시한다면 lParam에서 

ISC_SHOWUICOMPOSITIONWINDOW와 ISC_SHOWUIALLCANDIDATEWINDOW를 제거해야 한다. 



- WM_IME_CHAR 

문자 하나가 완성 되었을 때 보내진다. wParam 으로 완성된 문자의 코드가 전달되는데 1byte문자만 전달하는 WM_CHAR와 달리 이 코드는 DBCS일 수가 있다. 유니코드에서는 WM_CHAR와 완전히 동일하다.


완성된 문자를 직접처리하려면 이 메시지를 처리하고, 아니면 DefWindowProc으로 보낸다. 

이 메시지를 무시하면 한글 한 문자에 WM_CHAR메시지를 2번 받는다.


- WM_IME_NOTIFY

IME윈도우가 변경되었다는 통지메시지로 wParam으로 어떤 변경메시지인지가 전달된다. 한/영 입력모드가 변경되었을 때 이메시지가 전달되며, 특정 IME 이벤트에 반응하고자 할 때, 이 메시지를 처리한다.





'예전 > 3D' 카테고리의 다른 글

뷰포트  (0) 2012.12.11
[3D UI] 캐럿 (Caret)  (0) 2012.11.16
[3D] SkyBox  (0) 2012.11.06
[3D UI] ShellExecute  (0) 2012.10.22
[3D] 문자 집합  (0) 2012.10.12