wpf 기본 폰트 적용

wpf에서 텍스트가 출력되는 부분들의 폰트가 따로 설정하지 않는 한 제가 알기로는 맑은 고딕이 기본값인 것 같은데 맞나요?

1 Like

윈도우 OS 기본 시스템 폰트를 따라가지 않나요?

1 Like

AI의 어시스트를 받아서 찾아본 바로는 다음의 메커니즘을 따르는 것으로 보입니다.

  • WPF는 Win32의 SystemParametersInfo API에 SPI_GETNONCLIENTMETRICS 인덱스를 호출하여 값을 되돌려받는데, LOGFONT 구조체가 직렬화된 형태의 바이너리 데이터를 수신합니다.
  • 이 데이터 자체는 HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics 레지스트리의 CaptionFont, SmCaptionFont, MenuFont, StatusFont, MessageFont 항목에 LOGFONT 바이너리 값이 serialization 된 상태로 저장되어있는 것으로 보입니다.

이걸 LOGFONT로 System.Runtime.InteropServices 네임스페이스의 Marshal 클래스로 디코딩 (혹은 unsafe 버전의 LOGFONT 구조체로 캐스팅) 시도해보시면 엄밀한 의미에서 "어떤 시스템 폰트”가 쓰이고 있는지 판정하시는데 도움이 될 것 같습니다.

ps. HKEY_USERS\.DEFAULT 를 기준으로 HKEY_USERS\.DEFAULT\Control Panel\Desktop\WindowMetrics 항목을 찾아보시면 궁극적으로 현재 사용자가 무슨 폰트 값을 상속받아서 만든 것인지도 더블 체크 가능합니다.

4 Likes

WPF에서 일반적인 컨트롤의 폰트는 부모 컨트롤 요소의 FontFamily 속성 값을 상속(Property value inheritance)받으며, 최상위 컨트롤인 Window 클래스 인스턴스의 FontFamily 속성 값을 따릅니다.

Window 클래스는 Control 클래스를 상속받으며, 해당 클래스의 FontFamily 속성 기본값은 SystemFonts.MessageFontFamily 속성 값으로 지정되어 있습니다.

SystemFonts.MessageFontFamily

NONCLIENTMETRIC.lfMessageFont

이 값은 @rkttu 님께서 답변주신 레지스트리에 정의 된 Caption, Menu, Message 등 윈도우즈 시스템 테마 속성으로 지정된 값입니다.

WPF는 Windows XP 시절부터 존재했던 이유로 이 값을 참조하고 있으며, 레거시 윈도우의 디스플레이 속성 설정의 화면 배색에서 지정가능했던 폰트 설정 값 입니다.

7 Likes