본문 바로가기

Application Programming Interface/Windows API

Windows DDK 문서 IMEIMES.DOC - 3. IME Input Context(IME 입력 컨텍스트)

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

IME 개발을 위한 Win32 다국어 IME 개요

버전 1.32
최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong


IME 입력 컨텍스트

 각 윈도우는 IME 입력 컨텍스트와 연결되어 있습니다. IMM은 IME 상태, 데이터 등을 관리하고 IME 및 어플리케이션과 통신하기 위해 입력 컨텍스트를 사용합니다.

기본 입력 컨텍스트

 기본적으로 시스템은 기본 입력 컨텍스트를 각 쓰레드마다 생성합니다. IME를 인식하지 않는 모든 창에 대한 쓰레드는 이 컨텍스트를 공유합니다.

어플리케이션이 생성한 입력 컨텍스트

 어플리케이션 윈도우는 중간 조합 문자열(Intermediate Composition String)을 포함하여 IME의 모든 상태를 관리하기 위해 윈도우 핸들을 입력 컨텍스트에 연결할 수 있습니다. 어플리케이션이 입력 컨텍스트를 윈도우 핸들에 연결하면 시스템은 해당 윈도우가 활성화 될 때마다 자동으로 컨텍스트를 선택합니다. 이런 식으로 어플리케이션은 포커스-인, 포커스-아웃의 복잡한 처리로부터 자유로울 수 있습니다.

입력 컨텍스트 사용하기

 어플리케이션 또는 시스템이 새로운 입력 컨텍스트를 생성할 때 시스템은 IMC(IMCC) 구성요소와 함께 새로운 입력 컨텍스트를 준비합니다. 이 구성요소들은 hCompStr, hCandInfo, hGuideLine, hPrivatehMsgBuf의 멤버들을 포함하는데 일반적으로 IME는 입력 컨텍스트 및 그 구성요소를 직접 생성할 필요가 없습니다. IME는 이들의 크기를 조정할 수 있고 그들의 실제 포인터를 얻기 위해 핸들을 잠글(lock) 수 있습니다.

HIMC에 접근하기

 IME가 입력 컨텍스트에 접근할 때 IME는 입력 컨텍스트의 실제 포인터를 얻기 위해 ImmLockIMC를 호출해야 합니다. ImmLockIMC는 IMM이 IMC를 잠근 회수를 증가시킵니다. 반면에 ImmUnlockIMC는 IMM이 IMC을 잠근 회수를 감소시킵니다.

HIMCC에 접근하기

 IME가 입력 컨텍스트에 접근할 때, IME는 또한 IMCC의 포인터를 얻기 위해 ImmLockIMCC를 호출해야 합니다. ImmLockIMCC는 IMM이 IMCC를 잠근(lock) 회수를 증가시킵니다. 반면에 ImmUnlockIMCC는 IMM이 IMCC를 잠근 회수를 감소시킵니다. ImmReSizeIMCC는 IMCC의 크기를 지정된 크기로 재조정할 수 있습니다. 때때로 IME는 입력 컨텍스트의 새 구성요소를 생성할 필요가 있습니다. 이 때 IME는 ImmCreateIMCC를 호출할 수 있습니다. 새로 생성한 입력 컨텍스트의 구성요소를 파괴하기 위해서 IME는 ImmDestroyIMCC를 호출할 수 있습니다. 아래 예제는 IMCC에 접근하여 구성요소의 크기를 변견하는 방법을 보여줍니다.

/* 사용 예 */
HIMC hIMC; // IMC의 핸들
LPINPUTCONTEXT lpIMC; // IMC의 실제 포인터
LPCOMOSITIONSTRING lpCompStr; // 현재 조합중인 문자열
HIMCC hMyCompStr;
 
/* hIMC가 NULL이 아니라면 */
if (hIMC)
{
	lpIMC = ImmLockIMC(hIMC);
	if (!lpIMC)
	{
		MyError("Can not lock hIMC");
		return FALSE;
	}
 
	// lpIMC->hCompStr를 사용하기 위해 hCompStr를 잠그기
	lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);

	// lpCompStr에 접근하기

	// 잠금 해제
	ImmUnlockIMCC(lpIMC->hCompStr);
 
	// ReSize lpIMC->hCompStr.
	if(!(hMyCompStr = ImmReSizeIMCC(lpIMC->hCompStr,dwNewSize))
	{
		MyError("Can not resize hCompStr");
		ImmUnlockIMC(hIMC);
		return FALSE;
	}

	lpIMC->hCompStr = hMyCompStr;
	ImmUnlockIMC(hIMC);
}