게임에서 입력 방법 편집기 사용
참고 항목
이 문서에서는 Windows XP IME(입력 방법 편집기)를 사용하는 방법을 자세히 설명합니다. 이 문서에 자세히 설명되지 않은 Windows Vista용 IME가 변경되었습니다.
입력 방법 편집기(IME)는 중국어, 일본어, 한국어 및 복잡한 문자가 있는 다른 언어와 같은 동아시아 언어용 표준 키보드를 사용하여 쉽게 텍스트 입력할 수 있는 프로그램입니다. 예를 들어 IME를 사용하면 사용자가 워드 프로세서에 복잡한 문자를 입력하거나 대규모 멀티 플레이어 온라인 게임의 플레이어가 복잡한 문자로 친구와 채팅할 수 있습니다.
이 문서에서는 전체 화면 Microsoft DirectX 애플리케이션에서 기본 IME 편집 컨트롤을 구현하는 방법을 설명합니다. DXUT를 활용하는 애플리케이션은 자동으로 IME 기능을 가져옵니다. 프레임워크를 사용하지 않는 애플리케이션의 경우 이 문서에서는 편집 컨트롤에 IME 지원을 추가하는 방법을 설명합니다.
목차:
- 기본 IME 동작
- DXUT에서 IME 사용
- 기본 IME 동작 재정의
- 함수
- 메시지
- 예제
- IME 메시지
- 렌더링
- 제한 사항
- 레지스트리 정보
- 부록 A: 운영 체제당 CHT 버전
- 추가 정보
- GetReadingString
- ShowReadingWindow
기본 IME 동작
IME는 키보드 입력을 윗주 구성 요소 또는 선택한 언어와 관련된 다른 언어 요소에 매핑합니다. 일반적인 시나리오에서 사용자는 복잡한 문자의 발음을 나타내는 키를 형식화합니다. IME가 발음을 유효한 것으로 인식하면 사용자에게 최종 선택을 선택할 수 있는 단어 또는 구 후보 목록이 표시됩니다. 선택한 단어는 일련의 Microsoft Windows WM_CHAR 메시지를 통해 애플리케이션으로 전송됩니다. IME는 키보드 입력을 가로채 애플리케이션 아래 수준에서 작동하므로 IME의 존재는 애플리케이션에 투명합니다. 거의 모든 Windows 애플리케이션은 IME의 존재를 인식하지 않고도 특별한 코딩 없이도 쉽게 활용할 수 있습니다.
일반적인 IME는 다음 예제와 같이 문자 입력을 통해 사용자를 안내하는 여러 창을 표시합니다.
창 유형 | 설명 | IME 출력 |
---|---|---|
A. 읽기 창 | 키보드의 키 입력을 포함합니다. 일반적으로 각 키 입력 후에 변경됩니다. | 문자열 읽기 |
B. 컴퍼지션 창 | 사용자가 IME를 사용하여 작성한 문자 컬렉션을 포함합니다. 이러한 문자는 애플리케이션 위에 있는 IME에 의해 그려집니다. 사용자가 컴퍼지션 문자열이 만족스럽다는 것을 IME에 알리면 IME는 일련의 WM_CHAR 메시지를 통해 컴퍼지션 문자열을 애플리케이션에 보냅니다. | 컴퍼지션 문자열 |
C. 후보 창 | 사용자가 유효한 발음을 입력하면 IME는 지정된 발음과 일치하는 후보 문자 목록을 표시합니다. 그런 다음 사용자는 이 목록에서 원하는 문자를 선택하고 IME는 이 문자를 컴퍼지션 창 디스플레이에 추가합니다. | 컴퍼지션 문자열의 다음 문자 |
D. 입력 로캘 표시기 | 사용자가 키보드 입력을 위해 선택한 언어를 표시합니다. 이 표시기는 Windows 작업 표시줄에 포함됩니다. 입력 언어는 국가 및 언어 옵션 제어판 연 다음 언어 탭에서 세부 정보를 클릭하여 선택할 수 있습니다. | - |
DXUT에서 IME 사용
DXUT에서 CDXUTIMEEditBox 클래스는 IME 기능을 구현합니다. 이 클래스는 프레임워크에서 제공하는 기본 편집 컨트롤인 CDXUTEditBox 클래스에서 파생됩니다. CDXUTIMEEditBox는 CDXUTIMEEditBox 메서드를 재정의하여 IME를 지원하도록 편집 컨트롤을 확장합니다. 이 클래스는 개발자가 자체 편집 컨트롤에서 IME 지원을 구현하기 위해 프레임워크에서 수행해야 하는 사항을 학습할 수 있도록 이 방식으로 설계되었습니다. 이 항목의 나머지 단계에서는 프레임워크와 CDXUTIMEEditBox가 기본 편집 컨트롤을 재정의하여 IME 기능을 구현하는 방법을 설명합니다.
CDXUTIMEEditBox의 대부분의 IME 관련 변수는 정적으로 선언됩니다. 많은 IME 버퍼와 상태는 프로세스와 관련이 있기 때문입니다. 예를 들어 프로세스에는 컴퍼지션 문자열에 대한 버퍼가 하나만 있습니다. 프로세스에 10개의 편집 컨트롤이 있더라도 모두 동일한 컴퍼지션 문자열 버퍼를 공유합니다. 따라서 CDXUTIMEEditBox에 대한 컴퍼지션 문자열 버퍼는 정적이므로 애플리케이션이 불필요한 메모리 공간을 차지하지 못하게 합니다.
CDXUTIMEEditBox는 다음 DXUT 코드에서 구현됩니다.
(SDK 루트)\Samples\C++\Common\DXUTgui.cpp
기본 IME 동작 재정의
일반적으로 IME는 표준 Windows 프로시저를 사용하여 창을 만듭니다(Windows 사용 참조). 정상적인 상황에서는 만족스러운 결과를 생성합니다. 그러나 애플리케이션이 게임에 일반적인 것처럼 전체 화면 모드로 표시되면 표준 창이 더 이상 작동하지 않으며 애플리케이션 위에 표시되지 않을 수 있습니다. 이 문제를 해결하려면 애플리케이션이 이 작업을 수행하기 위해 Windows를 사용하는 대신 IME 창 자체를 그려야 합니다.
기본 IME 창 만들기 동작이 애플리케이션에 필요한 것을 제공하지 않는 경우 애플리케이션은 IME 창 처리를 재정의할 수 있습니다. 애플리케이션은 IME 관련 메시지를 처리하고 IMM(Input Method Manager) API를 호출하여 이를 달성할 수 있습니다.
사용자가 IME와 상호 작용하여 복잡한 문자를 입력하는 경우 IMM은 애플리케이션에 메시지를 보내 컴퍼지션 시작 또는 후보 창 표시와 같은 중요한 이벤트를 알립니다. 애플리케이션은 일반적으로 이러한 메시지를 무시하고 기본 메시지 처리기에 전달하므로 IME에서 메시지를 처리합니다. 애플리케이션은 기본 처리기 대신 메시지를 처리할 때 각 IME 이벤트에서 발생하는 일을 정확하게 제어합니다. 종종 메시지 처리기는 IMM API를 호출하여 다양한 IME 창의 콘텐츠를 검색합니다. 애플리케이션에 이 정보가 있으면 디스플레이에 렌더링해야 할 때 IME 창 자체를 제대로 그릴 수 있습니다.
함수
IME는 읽기 문자열을 가져와 읽기 창을 숨기고 읽기 창의 방향을 가져와야 합니다. 다음 표에는 IME 버전별 기능이 표시됩니다.
문자열 읽기 | 읽기 창 숨기기 | 읽기 창의 방향 | |
---|---|---|---|
버전 6.0 이전 | A. 창 액세스 IME 개인 데이터를 직접 읽습니다. "4 구조체" 참조 | IME 프라이빗 메시지를 트래핑합니다. "3개 메시지" 참조 | 레지스트리 정보를 검사합니다. "5 레지스트리 정보"를 참조하세요. |
버전 6.0 이후 | GetReadingString | ShowReadingWindow | GetReadingString |
메시지
ShowReadingWindow()를 구현하는 최신 IME에서는 다음 메시지를 처리할 필요가 없습니다.
다음 메시지는 읽기 창이 표시되지 않도록 애플리케이션 메시지 처리기(예: DefWindowProc에 전달되지 않음)에 의해 트래핑됩니다.
Msg == WM_IME_NOTIFY
wParam == IMN_PRIVATE
lParam == 1, 2 (CHT IME version 4.2, 4.3 and 4.4 / CHS IME 4.1 and 4.2)
lParam == 16, 17, 26, 27, 28 (CHT IME version 5.0, 5.1, 5.2 / CHS IME 5.3)
예제
다음 예제에서는 GetReadingString()이 없는 이전 IME에서 문자열 정보를 읽는 방법을 보여 줍니다. 코드는 다음 출력을 생성합니다.
출력 | 설명 |
---|---|
DWORD dwlen | 읽기 문자열의 길이입니다. |
DWORD dwerr | 오류 문자의 인덱스입니다. |
LPWSTR wstr | 읽기 문자열에 대한 포인터입니다. |
BOOL 유니코드 | true이면 읽기 문자열은 유니코드 형식입니다. 그렇지 않으면 멀티바이트 형식입니다. |
CHT IME 버전 4.2, 4.3 및 4.4
LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
LPBYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 24);
if (!p) break;
dwlen = *(DWORD *)(p + 7*4 + 32*4);
dwerr = *(DWORD *)(p + 8*4 + 32*4);
wstr = (WCHAR *)(p + 56);
unicode = TRUE;
CHT IME 버전 5.0
LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
LPBYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 3*4);
if (!p) break;
p = *(LPBYTE *)((LPBYTE)p + 1*4 + 5*4 + 4*2 );
if (!p) break;
dwlen = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16);
dwerr = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 + 1*4);
wstr = (WCHAR *)(p + 1*4 + (16*2+2*4) + 5*4);
unicode = FALSE;
CHT IME 버전 5.1, 5.2 및 CHS IME 버전 5.3
LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
LPBYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 4);
if (!p) break;
p = *(LPBYTE *)((LPBYTE)p + 1*4 + 5*4);
if (!p) break;
dwlen = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * 2);
dwerr = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * 2 + 1*4);
wstr = (WCHAR *) (p + 1*4 + (16*2+2*4) + 5*4);
unicode = TRUE;
CHS IME 버전 4.1
// GetImeId(1) returns VS_FIXEDFILEINFO:: dwProductVersionLS of IME file
int offset = ( GetImeId( 1 ) >= 0x00000002 ) ? 8 : 7;
LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
BYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + offset * 4);
if (!p) break;
dwlen = *(DWORD *)(p + 7*4 + 16*2*4);
dwerr = *(DWORD *)(p + 8*4 + 16*2*4);
dwerr = min(dwerr, dwlen);
wstr = (WCHAR *)(p + 6*4 + 16*2*1);
unicode = TRUE;
CHS IME 버전 4.2
int nTcharSize = IsNT() ? sizeof(WCHAR) : sizeof(char);
LPINPUTCONTEXT lpIMC = _ImmLockIMC(himc);
BYTE p = *(LPBYTE *)((LPBYTE)_ImmLockIMCC(lpIMC->hPrivate) + 1*4 + 1*4 + 6*4);
if (!p) break;
dwlen = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * nTcharSize);
dwerr = *(DWORD *)(p + 1*4 + (16*2+2*4) + 5*4 + 16 * nTcharSize + 1*4);
wstr = (WCHAR *) (p + 1*4 + (16*2+2*4) + 5*4);
unicode = IsNT() ? TRUE : FALSE;
IME 메시지
전체 화면 애플리케이션은 다음 IME 관련 메시지를 제대로 처리해야 합니다.
WM_INPUTLANGCHANGE
IMM은 사용자가 키 조합(일반적으로 ALT+SHIFT)을 사용하거나 작업 표시줄 또는 언어 모음의 입력 로캘 표시기를 사용하여 입력 로캘을 변경한 후 애플리케이션의 활성 창에 WM_INPUTLANGCHANGE 메시지를 보냅니다. 언어 모음은 사용자가 텍스트 서비스를 구성할 수 있는 화면 컨트롤입니다. (참조) 언어 모음을 표시하는 방법.) 다음 스크린샷은 사용자가 로캘 표시기를 클릭할 때 표시되는 언어 선택 목록을 보여 줍니다.
IMM에서 WM_INPUTLANGCHANGE 메시지를 보내면 CDXUTIMEEditBox는 다음과 같은 몇 가지 중요한 작업을 수행해야 합니다.
- GetKeyboardLayout 메서드는 애플리케이션 스레드에 대한 입력 로캘 식별자(ID)를 반환하기 위해 호출됩니다. CDXUTIMEEditBox 클래스는 나중에 사용할 수 s_hklCurrent 정적 멤버 변수에 이 ID를 저장합니다. 각 언어의 IME에는 고유한 동작이 있기 때문에 애플리케이션에서 현재 입력 로캘을 알고 있는 것이 중요합니다. 개발자는 다른 입력 로캘에 대해 다른 코드를 제공해야 할 수 있습니다.
- CDXUTIMEEditBox는 편집 상자 언어 표시기에서 표시할 문자열을 초기화합니다. 이 표시기는 애플리케이션이 전체 화면 모드에서 실행 중이고 작업 표시줄이나 언어 모음이 표시되지 않을 때 활성 입력 언어를 표시할 수 있습니다.
- ImmGetConversionStatus 메서드는 입력 로캘이 네이티브 변환 모드인지 아니면 네이티브가 아닌 변환 모드인지를 나타내기 위해 호출됩니다. 기본 변환 모드를 사용하면 사용자가 선택한 언어로 텍스트를 입력할 수 있습니다. 기본이 아닌 변환 모드에서는 키보드가 표준 영어 키보드로 작동합니다. 사용자가 키를 누르면 어떤 문자가 예상되는지 쉽게 알 수 있도록 사용자에게 IME가 있는 변환 모드 유형에 대한 시각적 신호를 제공하는 것이 중요합니다. CDXUTIMEEditBox는 언어 표시기 색으로 이 시각적 신호를 제공합니다. 입력 로캘이 네이티브 변환 모드의 IME를 사용하는 경우 CDXUTIMEEditBox 클래스는 m_IndicatorImeColor 매개 변수로 정의된 색으로 표시기 텍스트를 그립니다. IME가 네이티브가 아닌 변환 모드이거나 IME가 전혀 사용되지 않는 경우 클래스는 m_IndicatorEngColor 매개 변수로 정의된 색으로 표시기 텍스트를 그립니다.
- CDXUTIMEEditBox는 입력 로캘을 검사 다른 모든 언어의 경우 정적 멤버 변수 s_bInsertOnType TRUE, FALSE로 설정합니다. 이 플래그는 한국 IME 및 기타 모든 IME의 다양한 동작으로 인해 필요합니다. 한국어 이외의 언어로 문자를 입력하면 사용자가 입력한 텍스트가 컴퍼지션 창에 표시되고 사용자는 컴퍼지션 문자열의 내용을 자유롭게 변경할 수 있습니다. 사용자가 컴퍼지션 문자열에 만족하면 ENTER 키를 누르고 컴퍼지션 문자열은 일련의 WM_CHAR 메시지로 애플리케이션에 전송됩니다. 그러나 한국어 IME에서는 사용자가 키를 눌러 텍스트를 입력하면 문자가 즉시 애플리케이션으로 전송됩니다. 이후에 사용자가 해당 초기 문자를 수정하기 위해 더 많은 키를 누르면 편집 상자의 문자가 사용자의 추가 입력을 반영하도록 변경됩니다. 기본적으로 사용자는 편집 상자에서 문자를 작성합니다. 이러한 두 동작은 CDXUTIMEEditBox가 각각에 대해 특별히 코딩해야 할 정도로 다릅니다.
- 정적 멤버 메서드 SetupImeApi는 IME 모듈인 GetReadingString 및 ShowReadingWindow에서 두 함수의 주소를 검색하기 위해 호출됩니다. 이러한 함수가 있는 경우 ShowReadingWindow가 호출되어 이 IME의 기본 읽기 창을 숨깁니다. 애플리케이션은 읽기 창 자체를 렌더링하므로 전체 화면 렌더링을 방해하지 않도록 기본 읽기 창 그리기를 사용하지 않도록 IME에 알립니다.
IMM은 애플리케이션 창이 활성화될 때 WM_IME_SETCONTEXT 메시지를 보냅니다. 이 메시지의 lParam 매개 변수에는 IME에 그려야 하는 창과 그려서는 안 되는 플래그가 포함되어 있습니다. 애플리케이션이 모든 드로잉을 처리하므로 IME 창을 그리는 데 IME가 필요하지 않습니다. 따라서 애플리케이션의 메시지 처리기는 단순히 lParam을 0으로 설정하고 반환합니다.
애플리케이션이 IME를 지원하려면 IME 관련 메시지 WM_IME_SETCONTEXT 특수 처리가 필요합니다. Windows는 일반적으로 PanoramaInitialize() 메서드를 호출하기 전에 이 메시지를 애플리케이션에 보내므로 Panorama는 후보 목록 창을 표시하기 위해 UI를 처리할 기회가 없습니다.
다음 코드 조각은 Windows 애플리케이션에 후보 목록 창과 연결된 UI를 표시하지 않도록 지정하여 Panorama가 이 UI를 구체적으로 처리할 수 있도록 합니다.
case WM_IME_SETCONTEXT:
lParam = 0;
lRet = DefWindowProc(hWnd, msg, wParam, lParam);
break;
//... more message processing
return lRet;
WM_IME_STARTCOMPOSITION
IMM은 사용자가 키 입력의 결과로 IME 컴퍼지션을 시작하려고 할 때 애플리케이션에 WM_IME_STARTCOMPOSITION 메시지를 보냅니다. IME에서 컴퍼지션 창을 사용하는 경우 컴퍼지션 창에 현재 컴퍼지션 문자열이 표시됩니다. CDXUTIMEEditBox는 다음 두 가지 작업을 수행하여 이 메시지를 처리합니다.
- CDXUTIMEEditBox는 컴퍼지션 문자열 버퍼 및 특성 버퍼를 지웁니다. 이러한 버퍼는 CDXUTIMEEditBox의 정적 멤버입니다.
- CDXUTIMEEditBox는 s_bHideCaret 정적 멤버 변수를 TRUE로 설정합니다. 기본 CDXUTEditBox 클래스에 정의된 이 멤버는 편집 상자가 렌더링될 때 편집 상자의 커서를 그릴지 여부를 제어합니다. 컴퍼지션 창은 텍스트와 커서가 있는 편집 상자와 유사하게 작동합니다. 컴퍼지션 창이 표시되면 혼동을 방지하기 위해 편집 상자는 커서를 숨겨 커서를 한 번에 하나만 볼 수 있도록 합니다.
WM_IME_COMPOSITION
IMM은 사용자가 키 입력을 입력하여 컴퍼지션 문자열을 변경할 때 애플리케이션에 WM_IME_COMPOSITION 메시지를 보냅니다. lParam 값은 애플리케이션이 IMM(입력 메서드 관리자)에서 검색할 수 있는 정보 유형을 나타냅니다. 애플리케이션은 ImmGetCompositionString을 호출 하여 사용 가능한 정보를 검색한 다음 나중에 IME 요소를 렌더링할 수 있도록 개인 버퍼에 정보를 저장해야 합니다.
CDXUTIMEEditBox는 다음 컴퍼지션 문자열 데이터를 검사 검색합니다.
WM_IME_ENDCOMPOSITION
IMM은 IME 컴퍼지션 작업이 종료되면 애플리케이션에 WM_IME_ENDCOMPOSITION 메시지를 보냅니다. 이 문제는 사용자가 Enter 키를 눌러 컴퍼지션 문자열을 승인하거나 ESC 키를 눌러 컴퍼지션을 취소할 때 발생할 수 있습니다. CDXUTIMEEditBox는 컴퍼지션 문자열 버퍼를 빈 값으로 설정하여 이 메시지를 처리합니다. 그런 다음 컴퍼지션 창이 닫히고 편집 상자의 커서가 다시 표시되어야 하므로 s_bHideCaret FALSE로 설정합니다.
CDXUTIMEEditBox 메시지 처리기도 s_bShowReadingWindow FALSE로 설정합니다. 이 플래그는 편집 상자가 자체 렌더링될 때 클래스가 읽기 창을 그릴지 여부를 제어하므로 컴퍼지션이 끝날 때 FALSE로 설정해야 합니다.
WM_IME_NOTIFY
IMM은 IME 창이 변경 될 때마다 애플리케이션에 WM_IME_NOTIFY 메시지를 보냅니다. IME 창의 그리기를 처리하는 애플리케이션은 창 내용에 대한 업데이트를 인식할 수 있도록 이 메시지를 처리해야 합니다. wParam은 실행 중인 명령 또는 변경 사항을 나타냅니다. CDXUTIMEEditBox는 다음 명령을 처리합니다.
IME 명령 | 설명 |
---|---|
IMN_SETOPENSTATUS | 이 특성에는 컴퍼지션 문자열에 있는 각 문자의 상태 같은 정보가 포함됩니다(예: 변환되거나 변환하지 않음). CDXUTIMEEditBox는 특성에 따라 컴퍼지션 문자열 문자의 색을 다르게 지정하기 때문에 이 정보가 필요합니다. |
/ IMN_OPENCANDIDATE IMN_CHANGECANDIDATE | 각각 후보 창을 열거나 업데이트하려고 할 때 애플리케이션으로 전송됩니다. 사용자가 변환된 텍스트 선택을 변경하려는 경우 후보 창이 열립니다. 사용자가 선택 표시기를 이동하거나 페이지를 변경하면 창이 업데이트됩니다. 필요한 작업이 정확히 동일하기 때문에 CDXUTIMEEditBox는 두 명령 모두에 대해 하나의 메시지 처리기를 사용합니다.
|
IMN_CLOSECANDIDATE | 후보 창이 닫히려고 할 때 애플리케이션으로 전송됩니다. 이 문제는 사용자가 후보 목록에서 선택한 경우에 발생합니다. CDXUTIMEEditBox는 후보 창의 표시 플래그를 FALSE로 설정한 다음 후보 문자열 버퍼를 지워 이 명령을 처리합니다. |
IMN_PRIVATE | 사용자가 문자를 입력하거나 제거한 결과로 IME가 읽기 문자열을 업데이트한 경우 애플리케이션으로 전송됩니다. 애플리케이션은 읽기 문자열을 검색하고 렌더링을 위해 저장해야 합니다. CDXUTIMEEditBox에는 IME에서 읽기 문자열이 지원되는 방식에 따라 읽기 문자열을 검색하는 두 가지 메서드가 있습니다.
|
렌더링
IME 요소 및 창의 렌더링은 간단합니다. IME 창이 편집 컨트롤 위에 표시되어야 하므로 CDXUTIMEEditBox를 사용하면 기본 클래스가 먼저 렌더링됩니다. 기본 편집 상자가 렌더링된 후 CDXUTIMEEditBox는 각 IME 창(표시기, 컴퍼지션, 후보 및 읽기 창)의 표시 플래그를 검사 표시되어야 하는 경우 창을 그립니다. 다양한 IME 창 형식에 대한 설명은 기본 IME 동작을 참조하세요.
입력 로캘 표시기
입력 로캘 표시기는 항상 표시되는 요소이므로 다른 IME 창 앞에 렌더링됩니다. 따라서 다른 IME 창 아래에 표시됩니다. CDXUTIMEEditBox는 현재 IME 변환 모드를 반영하는 s_ImeState 정적 변수를 검사하여 표시기 글꼴 색이 결정되는 RenderIndicator 메서드를 호출하여 표시기를 렌더링합니다. IME가 활성화되고 네이티브 변환이 활성화되면 메서드는 m_IndicatorImeColor 표시기 색으로 사용합니다. IME가 비활성화되어 있거나 네이티브가 아닌 변환 모드인 경우 m_IndicatorImeColor 표시기 텍스트를 그리는 데 사용됩니다. 기본적으로 표시기 창 자체는 편집 상자의 오른쪽에 그려집니다. 애플리케이션은 RenderIndicator 메서드를 재정의하여 이 동작을 변경할 수 있습니다.
다음 그림에서는 영어, 영숫자 변환 모드의 일본어 및 네이티브 변환 모드의 일본어에 대한 입력 로캘 표시기의 다양한 모양을 보여 줍니다.
컴퍼지션 창
컴퍼지션 창의 그리기는 CDXUTIMEEditBox의 RenderComposition 메서드에서 처리됩니다. 컴퍼지션 창이 편집 상자 위에 떠 있습니다. 기본 편집 컨트롤의 커서 위치에 그려야 합니다. CDXUTIMEEditBox는 다음과 같이 렌더링을 처리합니다.
- 전체 컴퍼지션 문자열은 기본 컴퍼지션 문자열 색을 사용하여 그려집니다.
- 특정 특수 특성이 있는 문자는 다른 색으로 그려야 하므로 CDXUTIMEEditBox는 컴퍼지션 문자열의 문자를 검토하고 문자열 특성을 검사합니다. 특성이 다른 색을 요구하는 경우 문자는 적절한 색으로 다시 그려집니다.
- 렌더링을 완료하기 위해 컴퍼지션 창의 커서가 그려집니다.
커서는 한국어 IME에 대해 깜박여야 하지만 다른 IME에는 깜박이지 않아야 합니다. RenderComposition은 한국어 IME를 사용할 때 타이머 값을 기반으로 커서를 표시할지 여부를 결정합니다.
읽기 및 후보 창
읽기 및 후보 창은 동일한 CDXUTIMEEditBox 메서드인 RenderCandidateReadingWindow에 의해 렌더링됩니다. 두 창 모두 세로 레이아웃에 대한 문자열 배열 또는 가로 레이아웃의 경우 단일 문자열을 포함합니다. RenderCandidateReadingWindow에 있는 코드의 대부분은 창의 일부가 애플리케이션 창 밖에 있지 않고 잘리도록 창을 배치하는 데 사용됩니다.
제한 사항
I IM에는 텍스트 입력의 용이성을 향상시키기 위한 고급 기능이 포함되어 있는 경우가 있습니다. 최신 IME에서 찾은 기능 중 일부는 다음 그림에 나와 있습니다. 이러한 고급 기능은 DXUT에 없습니다. IME에서 필요한 정보를 얻기 위해 정의된 인터페이스가 없으므로 이러한 고급 기능에 대한 지원을 구현하는 것이 어려울 수 있습니다.
확장된 후보 목록이 있는 고급 중국어 번체 IME:
의미를 설명하는 추가 텍스트가 포함된 일부 후보 항목이 포함된 고급 일본어 IME:
필기 인식 시스템을 포함하는 고급 한국어 IME:
레지스트리 정보
다음 레지스트리 정보는 현재 IME가 GetReadingString()을 구현하지 않는 이전 CHT New 전화tic인 경우 읽기 창의 방향을 결정하기 위해 검사.
키 | 값 |
---|---|
HKCU\software\microsoft\windows\currentversion\IME_Name | 키보드 매핑 |
위치: IME 파일 버전이 5.1 이상인 경우 IME_NAME MSTCIPH입니다. 그렇지 않으면 IME_Name TINTLGNT입니다.
다음 중 하나일 경우 읽기 창의 방향이 가로입니다.
- IME는 버전 5.0이고 키보드 매핑 값은 0x22 또는 0x23
- IME는 버전 5.1 또는 버전 5.2이고 키보드 매핑 값은 0x22, 0x23 또는 0x24.
두 조건이 모두 충족되지 않으면 읽기 창이 세로입니다.
부록 A: 운영 체제당 CHT 버전
운영 체제 | CHT IME 버전 |
---|---|
Windows 98 | 4.2 |
Windows 2000 | 4.3 |
알 수 없음 | 4.4. |
Windows ME | 5.0 |
Office XP | 5.1 |
Windows XP | 5.2 |
독립 실행형 웹 다운로드 가능 | 6.0 |
추가 정보
자세한 내용은 다음을 참조하세요.
- 입력 방법 편집기 설치 및 사용
- 국제 텍스트 표시
- 유니코드 컨소시엄
- 국제 소프트웨어 개발. 닥터 인터내셔널. 2번째 에드. 레드먼드, WA: Microsoft Press, 2003.
GetReadingString
문자열 정보를 읽습니다.
매개 변수
-
himc
-
[in] 입력 컨텍스트입니다.
-
uReadingBufLen
-
[in] WCHAR의 lpwReadingBuf 길이입니다. 0이면 쿼리 읽기 버퍼 길이를 의미합니다.
-
lpwReadingBuf
-
[out] 읽기 문자열을 반환합니다(0단이 아님).
-
pnErrorIndex
-
[out] 있는 경우 읽기 문자열에 오류 문자의 인덱스 반환
-
pfIsVertical
-
[out] TRUE이면 UI 읽기가 세로입니다. 그렇지 않으면 가로 puMaxReadingLen입니다.
-
puMaxReadingLen
-
[out] 읽기 UI 길이입니다. 최대 읽기 길이가 고정되지 않았습니다. 키보드 레이아웃뿐만 아니라 입력 모드(예: 내부 코드, 서로게이트 입력)에 따라 달라집니다.
반환 값
읽기 문자열 길이입니다.
설명
반환 값이 uReadingBufLen 값보다 크면 모든 출력 매개 변수가 정의되지 않습니다.
이 함수는 CHT IME 6.0 이상에서 구현되며 IME 모듈 핸들의 GetProcAddress에서 가져올 수 있습니다. ImmGetIMEFileName 및 LoadLibrary에서 IME 모듈 핸들을 가져올 수 있습니다.
요구 사항
-
Header
-
Imm.h에서 선언되었습니다.
-
라이브러리 가져오기
-
Imm.lib를 사용합니다.
ShowReadingWindow
읽기 창을 표시하거나 숨깁니다.
매개 변수
-
himc
-
[in] 입력 컨텍스트입니다.
-
bShow
-
[in] 읽기 창을 표시하려면 TRUE로 설정하거나 숨기려면 FALSE로 설정합니다.
반환 값
설명
성공하면 TRUE를 반환하고, 그렇지 않으면 FALSE를 반환합니다.
요구 사항
-
Header
-
Imm.h에서 선언되었습니다.
-
라이브러리 가져오기
-
Imm.lib를 사용합니다.