안녕하세요 DXUTGUI를 쓰다가 염치불구하고 질문 올립니다.
DXUTGUI가 사용하기 편해보여서 쓰려고 하고있습니다.
근데 원래 쓰려는 엔진이 멀티바이트로 빌드된 라이브러리 인데
문제가 DXUTGUI는 유니코드로만 빌드하게 되어있어서
C:\Program Files\Microsoft DirectX 9.0 SDK (October 2005)\Samples\C++\Common
안에 있는 DXUT 프로젝트를 사용해서 DXUT.lib를 유니코드 기반으로 빌드하여서
멀티바이트 프로젝트에 링크하였습니다.
그냥 링크하니 메인 프로젝트가 멀티바이트로 세팅되어 DXUT.lib에서 에러가 나고
세팅에서 유니코드로 설정하면 엔진부분이 뻑나고...
그래서 아래와 같이...
<Engine.h>
<App.h>
#define UNICODE
<dxstdafx.h>
<dxutgui.h>
이런식으로 하니 에러가 안나고 실행이 됩니다.
근데 문제는 한/영키의 입력을 못받는지 IMEEditbox에서 영어는잘 찍는데 한글이 아예 안나옵니다.
코드상의 이 부분들도 왜 이렇게 한건지 이해가 가질 않고...
Common\DXUTgui.cpp(5785):HIMC (WINAPI * CDXUTIMEEditBox::_ImmGetContext)( HWND ) = CDXUTIMEEditBox::Dummy_ImmGetContext;
Common\DXUTgui.h(931): static HIMC WINAPI Dummy_ImmGetContext( HWND ) { return NULL; }
Common\DXUTgui.h(962): static HIMC (WINAPI * _ImmGetContext)( HWND );
실제로 제 프로젝트를 디버깅을 해보다 보니 _ImmGetContext의 함수포인터가 Dummy_ImmGetContext로 되어있어서
NULL을 리턴해 버립니다. 그래서 s_hImcDef =NULL이 되고 그뒤로 다 꼬이는듯 합니다.
CustomUI 예제를 디버깅해보면 _ImmGetContext가 정상적인 값이 리턴되며 _ImmGetContext의함수 포인터가
Dummy_ImmGetContext로 되어있지 않고 아마도 ImmGetContext로 된듯합니다.
HRESULT CDXUTIMEEditBox::StaticOnCreateDevice()
{
// Save the default input context
s_hImcDef = _ImmGetContext( DXUTGetHWND() );
_ImmReleaseContext( DXUTGetHWND(), s_hImcDef );
return S_OK;
}
그래서 _ImmGetContext부분을 강제로 ImmGetContext로 바꾸니 한글이 나오는데는 성공!!!
그러나 한글이 제대로 나오질 않고
"가가"를 치면 "가#%가#%"처럼 괴상한 쓰레기 문자들이 이어 붙습니다. ㅠㅠ
내용이 넘길어졌는데 간략히 답변의 방향을 유도하자면... ^^;
1. 메인프로젝트도 반드시 유니코드 빌드를 해야한다?
2. 차라리 소스가 있는 DXUT를 멀티바이트 버전으로 바꿔준다.
3. 그냥 잘 붙일 다른 방법이 있을것이다.
4. DXUTGUI 후졌으니 쓰지말고 차라리 이걸써라.
5. 내가 경험해본 문제며 해결했으니 나만 믿으라!
IME고수님들의 도움 부탁드립니다. 꾸벅~
DXUTGUI를 멀티바이트 프로젝트에서의 사용.
Moderator: 류광
-
- Posts: 1058
- Joined: 2003-02-02 20:23
- Location: THQ Inc.
- Contact:
메인 프로젝트를 유니코드로 빌드하셔야 하지 않을까요?
유니코드가 대세인듯 합니다 =.=b
유니코드가 대세인듯 합니다 =.=b
I want to live in korea, making programs, but...
http://wrice.egloos.com
http://wrice.egloos.com
-
- Posts: 56
- Joined: 2001-12-28 09:00
궂이 멀티 바이트로 사용하실려면 DXUT 의 라이브러리 설정을 멀티바이트로 변환하고 컴파일하세요.
아마 몇 부분에서 오류가 생길건데 (사실은 엄청 많이...)
일단 DXUT.h 의 상단에 있는
#ifndef UNICODE ~ #endif 부분을 지워주고.
내부 코드에서 보통 wchar_t 를 쓰기 때문에 api 함수등을 호출시에 형 변환 오류가 생깁니다.
오류난 부분들을 모두 변환 시켜 주면 됩니다.
( 예를 들어 StringCchCopy -> StringCchCopyA , 보통 일괄 변경 하시면 될거에요.)
이렇게 변환을 다해주면 멀티바이트로 dxut 가 컴파일되므로 기존 코드와 같이 사용하는데 문제가 없어
집니다.
뭐 하다 보면 좀 많이 귀찬치만 기존 코드의 멀티바이트 부분이 더 많다면 이게 대안이 될수도 있겠네요.
아마 몇 부분에서 오류가 생길건데 (사실은 엄청 많이...)
일단 DXUT.h 의 상단에 있는
#ifndef UNICODE ~ #endif 부분을 지워주고.
내부 코드에서 보통 wchar_t 를 쓰기 때문에 api 함수등을 호출시에 형 변환 오류가 생깁니다.
오류난 부분들을 모두 변환 시켜 주면 됩니다.
( 예를 들어 StringCchCopy -> StringCchCopyA , 보통 일괄 변경 하시면 될거에요.)
이렇게 변환을 다해주면 멀티바이트로 dxut 가 컴파일되므로 기존 코드와 같이 사용하는데 문제가 없어
집니다.
뭐 하다 보면 좀 많이 귀찬치만 기존 코드의 멀티바이트 부분이 더 많다면 이게 대안이 될수도 있겠네요.