2024년 12월 14일 토요일

DirectWrite - TextBox 구현

Dwrite로 텍스트 박스 구현을 해보았음


텍스트 관련 입력은 윈도우 프로시저 WNDPROC 함수에서

WM_CHAR 메시지를 처리하여 매개변수로 전달하고

마우스 클릭 같은건 DirectInput으로 처리하였음



LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{

	if (msg == WM_CHAR)
	{
		if (wparam == VK_BACK)
		{
			//백스페이스의 경우 '\b'가 저장되므로 예외로 문자를 지우는 함수 호출 (\n는 괜찮음)
			InputClass::GetInstance().RemoveLastChar();
		}
		else
		{
			//글자가 입력될 때 마다 inputClass의 멤버 변수에 저장
			InputClass::GetInstance().AddText(static_cast<wchar_t>(wparam));
		}
	}
	
	return DefWindowProc(hwnd, msg, wparam, lparam);
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT umessage, WPARAM wparam, LPARAM lparam)
{
	switch (umessage)
	{
	case WM_DESTROY:
	{
		PostQuitMessage(0);
		return 0;
	}
	case WM_CLOSE:
	{
		PostQuitMessage(0);
		return 0;
	}
	default:
	{
		return ApplicationHandle->MessageHandler(hwnd, umessage, wparam, lparam);
	}
	}
}

이렇게 전역 클래스의 멤버 변수에 문자를 

계속 밀어 넣는 방식으로 처리

백스페이스는 문자를 뒤에서 부터 지우는 함수를 호출



이렇게 저장된 문자열은 TextBox 클래스에서 사용



TextBox의 현재 상태는 Enum으로 평소 상태, 포커싱 상태 두가지로

텍스트 박스를 클릭하면 포커싱 상태로 전환하고 

그외 다른 부분을 누르면 원상태로 복귀하게 함



텍스트 박스의 문자열은 당연히 Dwrite로 렌더링 하는데

텍스트 정렬, 색상, 굵기 등을 담당하는 브러쉬와 포맷을

클래스의 멤버 변수로 저장해놨다가 각 텍스트 박스마다

다른 글꼴을 갖게 설계




TextClass 에서 새로운 브러쉬와 포맷을 설정 가능한 함수를 구현



IDWriteTextFormat, ID2D1SolidColorBrush 는 반드시 더블 포인터로 전달




크기, 위치 적당히 조정해주고 브러쉬 포맷까지 초기화

참고로 글꼴은 밑의 사진의 뻘건 글씨로 돼있는걸로 적으면 됨




결과



소스 코드

GitHub - h117562/Tutorial_UI2: Button, Slider, TextField...


댓글 없음:

댓글 쓰기

c++ thread.h

 c++에서 쓰레드 돌릴려면 thread.h 헤더를 쓰면 되는데 이 친구는 쓰레드가 아직 실행 중인지, 아니면 강제 종료하거나 하는 함수가 없어서 조금 아쉬운 애다. std::thread 는 로컬 변수로 선언하든 new 동적 할당을 하든 start 함...