글
cegui 한글 폰트 사용하기.
cegui를 처음 설치시에는 한글입출력이 되지 않습니다.
혹시나 cegui를 사용하시는데 한글ime를 사용하시게 되면 참고 하시면 되겠습니다.
먼저 cegui 버전 0.5.0 부터는 특별한 설정을 하지 않아도 한글 출력이 가능합니다.
단, 한글폰트가 있는 font파일을 cegui에서 인식할수있게 등록해준뒤 출력할 한글문자를 utf-8형태로 인코딩
해주어야 합니다.글쓴 시점의 현재 0.6.2 버전을 기준으로 작성합니다.
-일단 cegui에 한글폰트를 등록해줘야 합니다. 폰트파일을 Datafile에서 인식할수 있도록 폰트파일을 설정합니다.
1. fonts 폴더에 font파일 복사
2. font 파일작성.( 메모장으로 새로만드신후 아래 내용을 써주신후에 파일확장자를 폰트로 바꿔주시면 됩니다 )
font 파일 내용은
<?xml version="1.0" ?>
<Font Name="enterp" Filename="enterp.ttf" Type="FreeType" Size="9" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"/>
와 같이 적으시면 됩니다. 당연히 각 항목에는 사용할 폰트에 알맞게 수정해 주셔야하구요 .
(.ttf 파일의 크기가 작을으면 작을 수록, .ttf에 들어있는 문자의 개수가 작으면작을 수록
폰트 로딩과, 폰트 삭제 시간이 줄어든다.
.ttf파일이 한글을 지원해줘야 한글 출력이 가능하고, 일어를 지원해야 일어 출력이 가능하다)
- cegui초기화를 한 후에 FontManager::getSingleton().createFont("enterp.font");
를 삽입해서 해당 폰트를 불러오도록 하세요. (주폰트로 사용하게 .. ) 저는 엔터 풀입체를 사용했습니다.
-이제 출력할 한글을 cegui에서 인식하는 utf-8 형식으로 인코딩 한후 출력하여야 합니다.
인코딩 방법은 2가지가 있습니다.
1. 소스코드 자체를 UTF-8로 만드는 방법
Visual Studio에서 애시당초 소스코드를 저장할때 utf-8로 저장하면 별 문제없이 한글이 잘 출력 됩니다.
하지만 Visual Studio 6.0에서는 저장형식을 설정할수 있는 메뉴가 없고 ..
VS 2005에서는 고급 옵션에서 UTF-8로 저장할수 있는 옵션이 있긴 하지만,, 제대로 되질 않습니다.(어디서 듣기로 2005자체에 버그가 있다고 하더군요 .. )
고로 이것도 VS 2003에서만 잘된다는 정보가 있습니다.
유효한 방법은 정적으로 출력할 스트링(=문자)들을 FILE을 만들어서 저장시켜두고 거기서 읽어와서 출력하되, 그 파일은 UTF-8로 인코딩해서 저장하면 됩니다.
VS2005에서 UTF-8로 인코딩된 파일을 읽어서 찍으니 한글이 잘 나오더군요 ..
2. MBC 문자열을 UTF-8로 변환후 CEGUI모듈로 보내주기
변환은 MBC -> Unicode -> UTF-8 순서로 이루어집니다.
strconv.h 첨부파일로 포함합니다. 해당 파일을 포함하신후 사용하시면 됩니다.
사용방법은 아래와 같습니다.
#define CONV_UTF8_MBCS(a) convUni2Mbcs(convUtf82Uni(a)).c_str()
#define CONV_MBCS_UTF8(a) convUni2Utf8(convMbcs2Uni(a)).c_str()
사용시, (utf8*)CONV_MBCS_UTF8(txt) 형태로 사용하시면 됩니다.
이런식으로..history->setText((utf8*)CONV_MBCS_UTF8("막장 타이틀!"));
2번의 방법으로 포함후 사용했는데 문제없이 출력됩니다.
-이제 출력은 해결되었고 입력관련하여 조금 추가를 하면 됩니다.
만드시는 프로젝트의 msgproc 부분에서 한글입력시에 작동되게끔 넣어주시면 됩니다.
case WM_IME_COMPOSITION:
{
CEGUI_ImeInput(pEventRecord->hWnd, pEventRecord->lParam);
return true;
}
break;
위의 코드는 msgproc 부분에 넣어주시구요. ime에서 필요한 hwnd값과 키값을 알기위해 lparam값을
인자값으로 넘겨줍니다. 함수의 원형은 아래와 같으며 그대로 쓰셔도 될거에요.
void LoadNif::CEGUI_ImeInput(HWND hWnd, LPARAM lParam) // IME Input //
{
CEGUI::Window* target=0;
CEGUI::Window* d_modalTarget = m_pCeguiSystem->getModalTarget();
if (!d_modalTarget)
{
target = m_pCeguiSystem->getGUISheet()->getActiveChild();
}
else
{
target = d_modalTarget->getActiveChild();
if (!target)
{
target = d_modalTarget;
}
}
if(!target)
return;
CEGUI::Editbox *pEditWindow = (CEGUI::Editbox*)target;
// IME 핸들얻기. 실패하면 IME 입력처리 안함
HIMC hImc = ImmGetContext(hWnd);
if(hImc == NULL)
return;
// 변수 설정
int nLength = 0;
wchar_t wszComp[4] = {0,};
// IME 문자 조합이 완료되었다면
if(lParam == GCS_RESULTSTR)
{
nLength = ImmGetCompositionStringW(hImc, GCS_RESULTSTR, NULL, 0);
if(nLength > 0)
{
ImmGetCompositionStringW(hImc, GCS_RESULTSTR, wszComp, nLength);
for(int i = 0; i < nLength; i++)
{
if(wszComp[i] != 0)
m_pCeguiSystem->injectChar(wszComp[i]);
}
// CEGUI::System::getSingleton().injectCharSelect( false );
// 문자 조합이 완료되었으면 조합중인 문자 선택해제
size_t caretIndex = pEditWindow->getCaratIndex();
pEditWindow->setSelection(caretIndex, caretIndex);
}
}
// IME 문자 조합중이라면
else
{
nLength = ImmGetCompositionStringW(hImc, GCS_COMPSTR, NULL, 0);
if(nLength > 0)
{
ImmGetCompositionStringW(hImc, GCS_COMPSTR, wszComp, nLength);
for(int i = 0; i < nLength; i++)
{
if(wszComp[i] != 0)
{
m_pCeguiSystem->injectChar(wszComp[i]);
}
}
// CEGUI::System::getSingleton().injectCharSelect( true );
// 에디트 입력창을 위해 조합중인 문자가 선택되도록 함
size_t caretIndex = pEditWindow->getCaratIndex();
if(caretIndex >= 0)
pEditWindow->setSelection(caretIndex - 1, caretIndex);
}
}
// IME 핸들 해제
ImmReleaseContext(hWnd, hImc);
}
-위의 코드는 상위 msgproc에 위치할경우 edit박스에 관해서만 carat위치를 변경할수 있는데
이를 해결하기 위하여 저는 cuguisystem.h 파일에 아래와 같은 함수를 추가후 위의 코드를 아래와 같이
변경하였습니다.
void System::injectCharSelect(bool select)
{
if (d_activeSheet)
{
Window* dest = getKeyboardTargetWindow();
if( dest ) //에디트 박스인 경우
{
if( dest->getWindowRenderer()->getClass() == Editbox::EventNamespace )
{
Editbox* pEditBox = (Editbox*)dest;
size_t caretIndex = pEditBox->getCaratIndex();
if(caretIndex >= 0)
{
if( select )
pEditBox->setSelection( pEditBox->getCaratIndex() - 1, pEditBox->getCaratIndex() );
else
pEditBox->setSelection( pEditBox->getCaratIndex(), pEditBox->getCaratIndex() );
}
}
else if( dest->getWindowRenderer()->getClass() == MultiLineEditbox::EventNamespace )
{
MultiLineEditbox* pMultiLineEditBox = (MultiLineEditbox*)dest;
size_t caretIndex = pMultiLineEditBox->getCaratIndex();
if(caretIndex >= 0)
{
if( select )
pMultiLineEditBox->setSelection( pMultiLineEditBox->getCaratIndex() - 1, pMultiLineEditBox->getCaratIndex() );
else
pMultiLineEditBox->setSelection( pMultiLineEditBox->getCaratIndex(), pMultiLineEditBox->getCaratIndex() );
}
}
}
}
}
줄이 좀 밀리네요 작아서..ㅋㅋ
위의 함수를 ceguisystem.h에 추가후 저~위의 CEGUI_ImeInput 함수의 injectCharSelect 사용부분의 주석을
푸시고 바로 밑의 setSelection함수 부분을 지우시면 됩니다. 이제 에디트박스던 멀티라인박스던
상관없이 사용하실수 있습니다.
혹시나 cegui를 사용하시는 분들을 위하여 참고하시라고 남기구요. 한글을 사용하시면 이제 특문리스트도
출력을 해주셔야 할텐데 너무 길어져서 특문리스트 출력관련은 빠른시간내에 정리해서 올려드리겠습니다.
그럼 모드 즐프 하세요~
cegui를 처음 설치시에는 한글입출력이 되지 않습니다.
혹시나 cegui를 사용하시는데 한글ime를 사용하시게 되면 참고 하시면 되겠습니다.
먼저 cegui 버전 0.5.0 부터는 특별한 설정을 하지 않아도 한글 출력이 가능합니다.
단, 한글폰트가 있는 font파일을 cegui에서 인식할수있게 등록해준뒤 출력할 한글문자를 utf-8형태로 인코딩
해주어야 합니다.글쓴 시점의 현재 0.6.2 버전을 기준으로 작성합니다.
-일단 cegui에 한글폰트를 등록해줘야 합니다. 폰트파일을 Datafile에서 인식할수 있도록 폰트파일을 설정합니다.
1. fonts 폴더에 font파일 복사
2. font 파일작성.( 메모장으로 새로만드신후 아래 내용을 써주신후에 파일확장자를 폰트로 바꿔주시면 됩니다 )
font 파일 내용은
<?xml version="1.0" ?>
<Font Name="enterp" Filename="enterp.ttf" Type="FreeType" Size="9" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"/>
와 같이 적으시면 됩니다. 당연히 각 항목에는 사용할 폰트에 알맞게 수정해 주셔야하구요 .
(.ttf 파일의 크기가 작을으면 작을 수록, .ttf에 들어있는 문자의 개수가 작으면작을 수록
폰트 로딩과, 폰트 삭제 시간이 줄어든다.
.ttf파일이 한글을 지원해줘야 한글 출력이 가능하고, 일어를 지원해야 일어 출력이 가능하다)
- cegui초기화를 한 후에 FontManager::getSingleton().createFont("enterp.font");
를 삽입해서 해당 폰트를 불러오도록 하세요. (주폰트로 사용하게 .. ) 저는 엔터 풀입체를 사용했습니다.
-이제 출력할 한글을 cegui에서 인식하는 utf-8 형식으로 인코딩 한후 출력하여야 합니다.
인코딩 방법은 2가지가 있습니다.
1. 소스코드 자체를 UTF-8로 만드는 방법
Visual Studio에서 애시당초 소스코드를 저장할때 utf-8로 저장하면 별 문제없이 한글이 잘 출력 됩니다.
하지만 Visual Studio 6.0에서는 저장형식을 설정할수 있는 메뉴가 없고 ..
VS 2005에서는 고급 옵션에서 UTF-8로 저장할수 있는 옵션이 있긴 하지만,, 제대로 되질 않습니다.(어디서 듣기로 2005자체에 버그가 있다고 하더군요 .. )
고로 이것도 VS 2003에서만 잘된다는 정보가 있습니다.
유효한 방법은 정적으로 출력할 스트링(=문자)들을 FILE을 만들어서 저장시켜두고 거기서 읽어와서 출력하되, 그 파일은 UTF-8로 인코딩해서 저장하면 됩니다.
VS2005에서 UTF-8로 인코딩된 파일을 읽어서 찍으니 한글이 잘 나오더군요 ..
2. MBC 문자열을 UTF-8로 변환후 CEGUI모듈로 보내주기
변환은 MBC -> Unicode -> UTF-8 순서로 이루어집니다.
strconv.h 첨부파일로 포함합니다. 해당 파일을 포함하신후 사용하시면 됩니다.
사용방법은 아래와 같습니다.
#define CONV_UTF8_MBCS(a) convUni2Mbcs(convUtf82Uni(a)).c_str()
#define CONV_MBCS_UTF8(a) convUni2Utf8(convMbcs2Uni(a)).c_str()
사용시, (utf8*)CONV_MBCS_UTF8(txt) 형태로 사용하시면 됩니다.
이런식으로..history->setText((utf8*)CONV_MBCS_UTF8("막장 타이틀!"));
2번의 방법으로 포함후 사용했는데 문제없이 출력됩니다.
-이제 출력은 해결되었고 입력관련하여 조금 추가를 하면 됩니다.
만드시는 프로젝트의 msgproc 부분에서 한글입력시에 작동되게끔 넣어주시면 됩니다.
case WM_IME_COMPOSITION:
{
CEGUI_ImeInput(pEventRecord->hWnd, pEventRecord->lParam);
return true;
}
break;
위의 코드는 msgproc 부분에 넣어주시구요. ime에서 필요한 hwnd값과 키값을 알기위해 lparam값을
인자값으로 넘겨줍니다. 함수의 원형은 아래와 같으며 그대로 쓰셔도 될거에요.
void LoadNif::CEGUI_ImeInput(HWND hWnd, LPARAM lParam) // IME Input //
{
CEGUI::Window* target=0;
CEGUI::Window* d_modalTarget = m_pCeguiSystem->getModalTarget();
if (!d_modalTarget)
{
target = m_pCeguiSystem->getGUISheet()->getActiveChild();
}
else
{
target = d_modalTarget->getActiveChild();
if (!target)
{
target = d_modalTarget;
}
}
if(!target)
return;
CEGUI::Editbox *pEditWindow = (CEGUI::Editbox*)target;
// IME 핸들얻기. 실패하면 IME 입력처리 안함
HIMC hImc = ImmGetContext(hWnd);
if(hImc == NULL)
return;
// 변수 설정
int nLength = 0;
wchar_t wszComp[4] = {0,};
// IME 문자 조합이 완료되었다면
if(lParam == GCS_RESULTSTR)
{
nLength = ImmGetCompositionStringW(hImc, GCS_RESULTSTR, NULL, 0);
if(nLength > 0)
{
ImmGetCompositionStringW(hImc, GCS_RESULTSTR, wszComp, nLength);
for(int i = 0; i < nLength; i++)
{
if(wszComp[i] != 0)
m_pCeguiSystem->injectChar(wszComp[i]);
}
// CEGUI::System::getSingleton().injectCharSelect( false );
// 문자 조합이 완료되었으면 조합중인 문자 선택해제
size_t caretIndex = pEditWindow->getCaratIndex();
pEditWindow->setSelection(caretIndex, caretIndex);
}
}
// IME 문자 조합중이라면
else
{
nLength = ImmGetCompositionStringW(hImc, GCS_COMPSTR, NULL, 0);
if(nLength > 0)
{
ImmGetCompositionStringW(hImc, GCS_COMPSTR, wszComp, nLength);
for(int i = 0; i < nLength; i++)
{
if(wszComp[i] != 0)
{
m_pCeguiSystem->injectChar(wszComp[i]);
}
}
// CEGUI::System::getSingleton().injectCharSelect( true );
// 에디트 입력창을 위해 조합중인 문자가 선택되도록 함
size_t caretIndex = pEditWindow->getCaratIndex();
if(caretIndex >= 0)
pEditWindow->setSelection(caretIndex - 1, caretIndex);
}
}
// IME 핸들 해제
ImmReleaseContext(hWnd, hImc);
}
-위의 코드는 상위 msgproc에 위치할경우 edit박스에 관해서만 carat위치를 변경할수 있는데
이를 해결하기 위하여 저는 cuguisystem.h 파일에 아래와 같은 함수를 추가후 위의 코드를 아래와 같이
변경하였습니다.
void System::injectCharSelect(bool select)
{
if (d_activeSheet)
{
Window* dest = getKeyboardTargetWindow();
if( dest ) //에디트 박스인 경우
{
if( dest->getWindowRenderer()->getClass() == Editbox::EventNamespace )
{
Editbox* pEditBox = (Editbox*)dest;
size_t caretIndex = pEditBox->getCaratIndex();
if(caretIndex >= 0)
{
if( select )
pEditBox->setSelection( pEditBox->getCaratIndex() - 1, pEditBox->getCaratIndex() );
else
pEditBox->setSelection( pEditBox->getCaratIndex(), pEditBox->getCaratIndex() );
}
}
else if( dest->getWindowRenderer()->getClass() == MultiLineEditbox::EventNamespace )
{
MultiLineEditbox* pMultiLineEditBox = (MultiLineEditbox*)dest;
size_t caretIndex = pMultiLineEditBox->getCaratIndex();
if(caretIndex >= 0)
{
if( select )
pMultiLineEditBox->setSelection( pMultiLineEditBox->getCaratIndex() - 1, pMultiLineEditBox->getCaratIndex() );
else
pMultiLineEditBox->setSelection( pMultiLineEditBox->getCaratIndex(), pMultiLineEditBox->getCaratIndex() );
}
}
}
}
}
줄이 좀 밀리네요 작아서..ㅋㅋ
위의 함수를 ceguisystem.h에 추가후 저~위의 CEGUI_ImeInput 함수의 injectCharSelect 사용부분의 주석을
푸시고 바로 밑의 setSelection함수 부분을 지우시면 됩니다. 이제 에디트박스던 멀티라인박스던
상관없이 사용하실수 있습니다.
혹시나 cegui를 사용하시는 분들을 위하여 참고하시라고 남기구요. 한글을 사용하시면 이제 특문리스트도
출력을 해주셔야 할텐데 너무 길어져서 특문리스트 출력관련은 빠른시간내에 정리해서 올려드리겠습니다.
그럼 모드 즐프 하세요~
'OGRE3D' 카테고리의 다른 글
| 컴파일 방법 (0) | 2009/11/16 |
|---|---|
| CEGUI 한글설정 (0) | 2009/11/16 |
| cegui 한글 ime 입출력 (0) | 2009/11/16 |
| ogre3d 빌더~굿~~~~~초강추 (0) | 2009/11/15 |
| ogre3d 씬 빌더~ (0) | 2009/11/15 |
| OGRE3D EXPORTER 모음 (0) | 2009/11/15 |
RECENT COMMENT