@ 2008-03-29
1 IME #참고 사이트;
http://sarangnamu.net/basic/basic_view.php?no=826
http://kr.blog.yahoo.com/ppk314/76884?kbsp=WM_IME_COMPOSITION&kbsref=etc&mp=&mpc=4 http://gfc3.springnote.com/pages/525970 1.1 IME란 무엇인가? #IME란 Input Method Editor로 극동 아시아 언어인 한국어, 중국어, 일본어등 DBCS(Double Byte Character Sets) / MDCS(Multi Byte Character Sets)을 입력 받는 에디터를 말한다.
참고자료 >> http://www.dexgame.com/zbxe/?mid=download&search_target=title&search_keyword=ime&document_srl=5879
다국어 IME 구현 재료 (ANSI 모드 사용) ![]() ![]()
이권일 안녕하세요. 매크로 없는 메비~랍니다.
다국어 IME 구현 자료입니다. 옛날 자료실에 있었는데 이쪽으로 약간 수정한 새 버젼을 올립니다. 기본적으로 ANSI 버젼에서 작동하는 코드이며 다국어 입/출력 관련 코드가 들어 있습니다. Composite 와 Candidate 는 GDI에 직접 그려주고 있으니 뜯어서 게임에 보여주시면 되고 폰트 출력부분을 Unicode 로 하고 있으나 ANSI 로 변환해서 찍어주셔도 됩니다. 변경사항; Vietnam Charset/Codepage 처리 추가 (switch문) 1.2 일반적인 IME의 동작 #일반적인 CWnd를 상속받아서 만든 윈도우는 영문자를 입력 받으로 WM_KEYDOWN 다음에 WM_CHAR메세지가 발생하게 되지만 한글일 경우에는 WM_KEYDOWN 다음에 WM_IME_COMPOSITION이 발생하고 한글이 완성이 되면 WM_CHAR이 두번 발생되게 된다. 왜 두번이냐면 한글은 2byte이므로 한번에 전달할 수 없기 때문이다.
이럴때의 문제점은 한글처리가 자음이나 모음단위로 처리할 수 없고 글자단위로 처리해야 한다는 것이다.
이런 문제를 해결하기 위해서 기본 IME에서 발생되는 메세지에 대한 처리를 프로그래머가 직접해야 하는 것이다.
시스템에서는 IME 윈도우의 변화/조립 문자열의 변화 등 IME의 모든 상태 변화에 대해 WM_IME 로 시작되는 IME 메시지를 포커스 윈도우에 보낸다. 이 메시지들을 처리하지 않고 DefWindowProc() 으로 보낼 경우 프로그램은 완성된 문자에 대해서만 WM_CHAR 메시지를 받게 된다.
1.2.1 IME에 관련된 함수들 #
1.3 한글 입력 관련 윈도우 메세지 #
1.3.1 WM_IME_COMPOSITION의 발생과 취득 한글 코드 #이 부분은 한글을 입력 했을때, 즉 WM_IME_COMPOSITION 메세지가 발생했을때 IME 버퍼의 내용을 표로 만들어 놓은 것이다.WM_IME_COMPOSITION 메세지는 한글모드에서 한글이 입력되면 완성이든 미완성이든 이 메세지를 발생하게 되는데 lParam의 값으로 검사해서 완성된 글자인지 미 완성된 글자인지 알수 있다. 그리고 IME가 저장하고 있는 문자열을 Composition 문자열이라고 한다.
2 CEGUI-SDK-0.5.0b(기준으로 정리) #참고 사이트
http://www.cegui.org.uk/wiki/index.php/Main_Page - 2008.03.27 CEGUI-SDK-0.6.0-vc8
http://acasia.tistory.com/166 http://cafe.naver.com/ogre3d.cafe - OGRE 3D 관련 카페로 게시물 중에 CEGUI에 관한 정리 있음 ![]() ![]() ![]() ![]() 2.1 파일 구조 #'CEGUI-SDK-0.5.0b-vc8\datafiles\'폴드에 저장된 다양한 파일을 로딩해서 사용하며기본적인 구조로 schemes, looknfeel, imagesets, layouts로 구성된다. 2.1.1 schemes #<xml version="1.0" ?> // xml 버전<GUIScheme Name="WindowsLookSkin"> // GUIScheme 이름 <Imageset Name="WindowsLook" Filename="WindowsLook.imageset" /> // 연동될 Image Set <LookNFeel Filename="WindowsLook.looknfeel" /> // 연동될 LookNFeel <WindowSet Filename="CEGUIFalagardWRBase" /> // 연동될 WindowSet <FalagardMapping
WindowType="WindowsLook/Button" // 윈도우 타입
TargetType="CEGUI/PushButton" // 타겟 타입 Renderer="Falagard/Button" // 렌더러 타입 LookNFeel="WindowsLook/Button" /> // LookNFeel 2.1.2 looknfeel #Falagard 스킨을 구성하는 부분으로 기본적인 구조는 다음과 같다.<xml version="1.0" ?> <Falagard>
<WidgetLook name="WindowsLook/Button">
</ Falagard>
<PropertyDefinition name="NormalTextColour" initialValue="FF000000" redrawOnWrite="true" /> // 속성을 정의
</ WidgetLook>2.1.3 imagesets #이미지셋은 이미지/텍스처 상의 정의된 영역의 집합으로 CEImagesetEditor를 통해서 작성할 수 있다.<xml version="1.0" ?> <Imageset Name="WindowsLook" Imagefile="WindowsLook.tga" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"> <Image Name="Background" XPos="9" YPos="9" Width="2" Height="2" /> ... </Imageset> 정의된 영영들은 시스템 내부에서 단일한 이름의 Image로 사용한다. 2.1.4 layouts #CELayoutEditor를 사용해서 레이아웃을 작성할 수 있다.<xml version="1.0" ?> <GUILayout>
<Window Type="Vanilla/Button" Name="Vanilla/Console/Submit">
...
<Property Name="ID" Value="1" />
</Window></GUILayout> 2.2 한글 설정 #2.2.1 한글 출력 #출처; http://blog.naver.com/dekaf?Redirect=Log&logNo=400412345071.CEGUI 0.5.0부터는 몇 가지 등록을 통해서 한글을 출력한다.은 순서로 등록해 준다. 1-1.한글 폰트 등록
-.사용할 폰트를 datafiles\fonts에 넣어준다.
<xml version="1.0" ?>-.한글.font 파일을 작성 <Font Name="Han-12" Filename="H2GTRE.TTF" Type="FreeType" Size="10" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"/> 1-2.프로그램에서 폰트 로딩 1-3.출력할 한글을 UTF-8로 변환
1) 소스코드 자체를 UTF-8로 저장; Visual Studio에서 소스코드를 저장할 때, UTF-8로 저장하면 별 문제없이 한글이 출력
Visual Studio 6.0에서 저장형식을 설정할 수 없음
2) 정적으로 출력할 문자들을 UTF-8로 인코드 해서 File로 저장시켜두고 거기서 읽어서 출력VS 2005에서는 고급옵션에서 UTF-8로 저장 가능(제대로 되지 않는다고 함) VS 2003에서는 잘 된다고 함
VS 2005에서 UTF-8로 인코딩된 파일을 읽어서 찍으면 한글이 잘 나옴
3) MBC 문자열을 UTF-8로 만들어서 CEGUI 모듈로 보내기(변환은 MBC -> Unicode -> UTF-8 순서로) 참고 파일(in orge3d 스터디 카페) ![]()
#include "strconv.h"
#define CONV_UTF8_MBCS(a) convUni2Mbcs(convUtf82Uni(a)).c_str() #define CONV_MBCS_UTF8(a) convUni2Utf8(convMbcs2Uni(a)).c_str() 2.2.2 한글 입력1 #출처; http://www.gpgstudy.com/forum/viewtopic.php?topic=15388WM_IME_COMPOSITION 메세지 처리시에는 return값으로 true를 줘서 ime입력 메세지가 더이상 다른 곳으로 전달되지 않게 막는다.
#pragma comment(lib, "imm32.lib")
#include <imm.h>
void processImeInput(LPARAM lParam, CEGUI::System *pCEGUISystem)
{
// 활성화된 CEGUI윈도우가 Editbox타입이 아니라면 IME 입력처리 안합
for(int i = 0; i < nLength; i++)Window* myRoot = CEGUI::System::getSingleton().getGUISheet(); CEGUI::Editbox *pEditWindow =(CEGUI::Editbox*)myRoot->getActiveChild(); if(pEditWindow == NULL)
return;
// IME 핸들얻기. 실패하면 IME 입력처리 안함HIMC hImc = ImmGetContext(GetWindowReference()); if(hImc == NULL)
return;
// 변수 설정int nLength = 0; wchar_t wszComp[4] = {0,}; // IME 문자 조합이 완료되었다면 if(lParam == GCS_RESULTSTR) {
{
}
if(wszComp[i] != 0)
}
pCEGUISystem->injectChar(wszComp[i]);
// 문자 조합이 완료되었으면 조합중인 문자 선택해제 size_t caretIndex = pEditWindow->getCaratIndex();
pEditWindow->setSelection(caretIndex, caretIndex);
}
}
nLength = ImmGetCompositionStringW(hImc, GCS_COMPSTR, NULL, 0);// IME 문자 조합중이라면 else { if(nLength > 0) {
ImmGetCompositionStringW(hImc, GCS_COMPSTR, wszComp, nLength);
}for(int i = 0; i < nLength; i++) { } // 에디트 입력창을 위해 조합중인 문자가 선택되도록 함 size_t caretIndex = pEditWindow->getCaratIndex(); pEditWindow->setSelection(caretIndex - 1, caretIndex);
문제점; 스페이스바를 눌러줘서 조합을 끝내면 그제서야 보이는 문제가 있음
다음은 WM_CHAR 메시에서 처리하는 방법으로 입력된 글자가 넘어왔을 때 2바이트 문자인지 1바이트문자인지 체크해서
1바이트 문자라면 입력 받는 즉시 넘기고, 2바이트 문자라면 누적시키고 2바이트 누적이 다되면 UTF-8로 컨버트 해서 넘긴다.
#include < ctype.h >
inline int __cdecl isLeadByte(int _C) {return ((unsigned char)(_C) & 0x80); }
switch(pEventRecord->uiMsg)
{
case WM_CHAR:
}{
static char MultiByte[2] = {0};
}static bool isHaveMultiByte = false; if(isHaveMultiByte) {
isHaveMultiByte = false;
}MultiByte[1] = (unsigned char)pEventRecord->wParam; int iLengthUnicode = 0; wchar_t szUnicode; MultiByteToWideChar(CP_ACP, 0, (char*)MultiByte, 2, &szUnicode, 1); CEGUI::System::getSingleton().injectChar((CEGUI::utf32)szUnicode); break; else {
if( isLeadByte(pEventRecord->wParam) )
} { } else { } break; 3 공개 GUI 라이브러리 링크 모음 #GPG에 pacman님이 2004.04.13 정리해 주신 내용 ( http://www.gpgstudy.com/forum/viewtopic.php?topic=5016 )
|
"Say it, don't spray it!" MoniWikiPlugin CategoryTemplate 책갈피_Cocos2d-x_3MobileGame 가가 |