DXUTGUI를 멀티바이트 프로젝트에서의 사용.

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

DXUTGUI를 멀티바이트 프로젝트에서의 사용.

Post by 비회원 »

안녕하세요 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고수님들의 도움 부탁드립니다. 꾸벅~
쌀밥
Posts: 1058
Joined: 2003-02-02 20:23
Location: THQ Inc.
Contact:

Post by 쌀밥 »

메인 프로젝트를 유니코드로 빌드하셔야 하지 않을까요?

유니코드가 대세인듯 합니다 =.=b
I want to live in korea, making programs, but...
http://wrice.egloos.com
free108
Posts: 56
Joined: 2001-12-28 09:00

Post by free108 »

궂이 멀티 바이트로 사용하실려면 DXUT 의 라이브러리 설정을 멀티바이트로 변환하고 컴파일하세요.
아마 몇 부분에서 오류가 생길건데 (사실은 엄청 많이...)

일단 DXUT.h 의 상단에 있는
#ifndef UNICODE ~ #endif 부분을 지워주고.

내부 코드에서 보통 wchar_t 를 쓰기 때문에 api 함수등을 호출시에 형 변환 오류가 생깁니다.
오류난 부분들을 모두 변환 시켜 주면 됩니다.
( 예를 들어 StringCchCopy -> StringCchCopyA , 보통 일괄 변경 하시면 될거에요.)

이렇게 변환을 다해주면 멀티바이트로 dxut 가 컴파일되므로 기존 코드와 같이 사용하는데 문제가 없어
집니다.

뭐 하다 보면 좀 많이 귀찬치만 기존 코드의 멀티바이트 부분이 더 많다면 이게 대안이 될수도 있겠네요.
vantiz
Posts: 32
Joined: 2005-05-04 11:48

Post by vantiz »

잘 모르지만 혹시 도움이 될까 해서 올립니다^^;

저도 비슷한 현상을 겪은 적이 있는데..

가#%가#%


가를 입력했을때 바로 뒤에 똑같은 '가' 가 한번 더 붙어서

대?한?민?국? 이런식으로 되었었거든요..


MsgProc 쪽에 똑같은 문자가 한번 더 들어오는지.. 확인해보세요..

CDXUTIMEEditBox::StaticMsgProc( uMsg, wParam, lParam ) 처리 하는 순서? 문제 였던것 같습니다.;;

추측이라 아닐수도 있어요 ;;
비회원

그냥 팁이요.

Post by 비회원 »

저도 멀티 바이트로 고쳐 쓴 적이 있습니다.

아시다시피 그 코드의 IME 관련 부분은 모든 코드가 유니코드 기반으로 돌아가야 합니다.
멀티 바이트라도 와이드 문자로 변환해서 쓰셔야 하고요. 이 부분은 해결하신 것 같으니 패스...

위엣 분 말씀대로, 이상한 문자가 찍히는 것은 WM_CHAR가 두번 날아와서 그런 것 같습니다.
DefWindowProc 등에서 강제로 메시지를 보낼지도 모르니 확인하셔서 디폴트 처리를 막으시면 될 듯...
비회원

음...

Post by 비회원 »

DXUTIME를 multibyte로 고쳐서 현재 회사의 엔진에 붙인 적이 있습니다.

결론은... 열라게 하시면 됩니다.

컴파일 에러도 상당히 뻔한거고... WM_CHAR시에 leadbyte처리만 잘하시면 될 듯.

lparam 이 0이던가 아니던가에 따라 wchar인지 char인지 갈릴테니 그것만 처리하시고 unicode - multibyte글자 처리만 잘하셔도 전혀 문제가 없었습니다.

화이팅~
Locked