밀어서 잠금해제

DirectX11에 EditBox를 만들어보자 2 - 평범한 윈도우에 글자를 입력받아 보자. - 본문

Programming||Study/DirectX

DirectX11에 EditBox를 만들어보자 2 - 평범한 윈도우에 글자를 입력받아 보자. -

HAYAN_DEV! 2014.07.20 13:56

이전 글에서 글자를 출력 했으니 글자를 입력하는 방법을 알아야겠죠. EditBox를 만들어야 하는데 입력이 안되면 쓰나요.
누구나 Windows 프로그래밍을 처음 배울 때 키보드에서 입력하면 영어만 입력되는 아주 간단하지만 매우 의미있는 프로그램을 만들어 본 적이 있을거라 믿습니다.
허나 제가 원하는건 저번 시간에도 말했듯이 채팅이 되는 온라인 게임이란 말입니다. 근대 영어만 입력되면 쓰나요. 요즘 초등학생들이 영어 실력이 워낙 뛰어나다 보니 영어만 입력되도 상관 없을지도 모르겠지만 제가 영어를 못해서 한국어를 써야한다 이 말입니다. 그 뿐입니까? 해외 사용자도 배려해서(영어를 쓰면 되겠네요) 중국어라던가 일본어라던가도 입력 가능하게 해야한다 이말입니다!(그러니까 영어를 쓰면 된다고.)

그럼 어떻게 영어말고(어이) 다른 나라 언어를 입력 할 수 있을까요?
우리가 사용하는 EditBox는 IME라는걸 이용해서 글자를 입력받습니다.
좋습니다. 그럼 우리도 EditBox를 만드는 거니 이 녀석을 사용해보죠.

IME를 Windows에서 이용하기 위해서는 imm.h와 imm32.lib가 필요합니다. Windows.h를 인클루드 하시면 기본적으로 포함되어 있습니다.

자 그럼 잠시 살펴보죠.
일단 Win32 프로젝트를 하나 만듭니다. 귀찮으니 자동 생성 코드를 사용해서 만듭니다.(어차피 테스트하고 버릴거기 때문에 상관 없습니다.)

윈도우 프로시져 콜백 함수를 보시죠. 으음. IME를 언제 프로그램에 등록하면 좋을까요? 보통 EditBox는 창에 포커스 상태일 때 입력을 받습니다.
Focus 상태일 때 메시지를 MSDN에서 확인하는건 테스트 프로그램 만들 때 너무 귀찮으니 그냥 ACTIVATE 메시지를 이용해서 해보죠.(너무 대충이잖아 wwwwwww)

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	static HIMC imeID = nullptr;
	static std::wstring str;

	switch ( message )
	{
		case WM_ACTIVATE:
			if ( imeID == nullptr )
			{
				imeID = ImmCreateContext();
				ImmAssociateContext(hWnd, imeID);
			}
			break;
		case WM_IME_STARTCOMPOSITION:
			break;
		case WM_IME_CHAR:
			str.push_back((wchar_t)wParam);
			SetWindowText(hWnd, str.c_str());
			break;
		case WM_CHAR:
			if ( (wchar_t)wParam == '\b' )
			{
				str.pop_back();
			}
			else
			{
				str.push_back((wchar_t)wParam);
			}
			SetWindowText(hWnd, str.c_str());
			break;
		case WM_DESTROY:
			ImmDestroyContext(imeID);
			PostQuitMessage(0);
			break;
		// 나머지 메시지는 변경사항 없으므로 생략.
	}
	return 0;
}

발로 짜도 저것보단 잘 나오겠군요. 뭐 쓰고 버릴 코드니까 간단하게 테스트해보죠.

잘 되는군요. 중간에 일본어로 바꿔서 입력해도 잘 됩니다. 글자 변환도 잘 되구요.


이건 덤 입니다. 다음에 사용할 ScriptString 관련 함수들을 사용해서 간단히 테스트한거죠.
짤막하게 설명하자면 지금 Client 좌표계 기준으로 X=79 좌표에 '.'이 있는데 이 인덱스가 7이라는겁니다.
이게 왜 필요할까요?
마우스로 클릭하면 커서가 옮겨져야죠. 저희는 Client의 어떤 좌표에 어떤 글자가 써져있는지 알아야하니까요.


여기서 글을 끝내기로 하겠습니다 ㅇㅅㅇ.
다음에는 DirectX 프로그램에 실제로 적용해 보기 전에 GDI+로 커서를 구현해보도록 하겠습니다.

0 Comments
댓글쓰기 폼
Prev 1 2 3 4 5 6 7 Next