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...
댓글 없음:
댓글 쓰기