2016-10-31 3 views
0

높은 DPI 모니터에서 잘 보이고 싶은 Windows 응용 프로그램이 있습니다. 응용 프로그램이 DEFAULT_GUI_FONT을 (를) 많은 곳에서 사용하고 있으며이 방법으로 만든 글꼴이 올바르게 확장되지 않습니다.높은 DPI Windows 응용 프로그램에서 DEFAULT_GUI_FONT 사용

너무 많은 고통을주지 않으면 서이 문제를 해결할 수있는 간단한 방법이 있습니까?

+1

[DEFAULT_GUI_FONT 사용을 중지하십시오.] (https://blogs.msdn.microsoft.com/oldnewthing/20050707-00/?p=35013) 비트 맵 글꼴은 마음에 들지 않습니다. 죄송합니다. – andlabs

+0

@andlabs, DEFAULT_GUI_FONT는 Tahoma를 기본 글꼴로 사용합니다. 이는 벡터입니다. 그리고 하나의 모니터를 사용하고 응용 프로그램에 DPI 인식을 설정하면 Windows 해상도 설정을 통해 모니터에서 DPI를 변경하는 동안 글꼴 크기가 DEFAULT_GUI_FONT로 변경되어 크기가 변경됩니다. – deserg

+0

사실이 아닙니다. 그것은 비트 맵 글꼴입니다. https://blogs.msdn.microsoft.com/oldnewthing/20050707-00/?p=35013 정말 포기 해주세요. –

답변

2

NONCLIENTMETRICSSystemParametersInfo (SPI_GETNONCLIENTMETRICS)로 설정 한 다음 LOGFONT 데이터를 사용하여 자체 글꼴을 만드십시오. 또는 SystemParametersInfo (SPI_GETICONTITLELOGFONT)을 쿼리하여이를 사용할 수 있습니다.

+0

이것은 우리가 실제로 얻게 될 정확한 대답에 가깝다. 나는 개인적으로'lfMessageFont' 나 자신을 사용한다; 더 나은 옵션이 있는지 확실하지 않습니다. 프로그램 초기화시 한 번만 수행하고 핸들에 전역 변수를 사용하십시오. 만약 코드가'GetStockObject (DEFAULT_GUI_FONT)'호출로 흩어져 있고 간단한 find-replace가 도움이되지 않는다면'#define GetStockObject (x) == DEFAULT_GUI_FONT? hMessageFont : (GetStockObject) (x))'또는 어떤 종류의 :/코드 작성 방법에 따라 다릅니다. (물론 이것은'DeleteObject()'도 호출하지 않는다는 것을 의미합니다.) – andlabs

0

다른 용도로 권장되는 글꼴은 NONCLIENTMETRICS 구조에서 얻을 수 있습니다. 자동 DPI 스케일 글꼴

(윈도우 10 1607+이어야 당 모니터 인식 DPI) : 시스템 전체의 DPI를 사용하여 수동으로 글꼴을 확장 할 수 있습니다 이전 Windows 버전의 경우

// Your window's handle 
HWND window; 

// Get the DPI for which your window should scale to 
UINT dpi = GetDpiForWindow(window); 

// Obtain the recommended fonts, which are already correctly scaled for the current DPI 
NONCLIENTMETRICSW non_client_metrics; 

if (!SystemParametersInfoForDpi(SPI_GETNONCLIENTMETRICS, sizeof(non_client_metrics), &non_client_metrics, 0, dpi) 
{ 
    // Error handling 
} 

// Create an appropriate font(s) 
HFONT message_font = CreateFontIndirectW(&non_client_metrics.lfMessageFont); 

if (!message_font) 
{ 
    // Error handling 
} 

(윈도우 7 +는 시스템 DPI 인식해야합니다) :

// Your window's handle 
HWND window; 

// Obtain the recommended fonts, which are already correctly scaled for the current DPI 
NONCLIENTMETRICSW non_client_metrics; 

if (!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(non_client_metrics), &non_client_metrics, 0) 
{ 
    // Error handling 
} 

// Get the system-wide DPI 
HDC hdc = GetDC(nullptr); 

if (!hdc) 
{ 
    // Error handling 
} 

UINT dpi = GetDeviceCaps(hdc, LOGPIXELSY); 

ReleaseDC(nullptr, hdc); 

// Scale the font(s) 
constexpr UINT font_size = 12; 

non_client_metrics.lfMessageFont.lfHeight = -((font_size * dpi)/72); 

// Create the appropriate font(s) 
HFONT message_font = CreateFontIndirectW(&non_client_metrics.lfMessageFont); 

if (!message_font) 
{ 
    // Error handling 
} 

NONCLIENTMETRICS는 또한 많은 다른 글꼴이 있습니다. 귀하의 목적에 맞는 것을 선택하십시오.

최상의 호환성을 위해 application manifest에 DPI 인식 수준을 설명한대로 here으로 설정해야합니다.

관련 문제