高解像度のDPIモニタを見たいWindowsアプリケーションがあります。多くの場所でアプリケーションがDEFAULT_GUI_FONTを使用しています。この方法で作成されたフォントは正しく拡大縮小されません。高いDPI WindowsアプリケーションでDEFAULT_GUI_FONTを使用する
あまりにも多くの痛みでこの問題を解決する簡単な方法はありますか?
高解像度のDPIモニタを見たいWindowsアプリケーションがあります。多くの場所でアプリケーションがDEFAULT_GUI_FONTを使用しています。この方法で作成されたフォントは正しく拡大縮小されません。高いDPI WindowsアプリケーションでDEFAULT_GUI_FONTを使用する
あまりにも多くの痛みでこの問題を解決する簡単な方法はありますか?
NONCLIENTMETRICS
でSystemParametersInfo
(SPI_GETNONCLIENTMETRICS
)を入力し、LOGFONTデータを使用して自己フォントを作成する必要があります。 SystemParametersInfo
(SPI_GETICONTITLELOGFONT
)を照会して、それを使用することができます
これは私たちが本当に得意な正しい答えに近いものです。私は個人的に 'lfMessageFont'を自分で使います。より良い選択肢があるかどうかは分かりません。プログラムの初期化で一度だけ行い、ハンドルにグローバル変数を使用します。コードが 'GetStockObject(DEFAULT_GUI_FONT)'コールで散らばっていて簡単な検索置換が役に立たないなら、 '#define GetStockObject(x)((x)== DEFAULT_GUI_FONT?hMessageFont:(GetStockObject) (x)) 'または何かの並べ替え:/コードの記述方法に依存します。 (もちろん、これは 'DeleteObject()'も呼び出さないことを意味します)。 – andlabs
NONCLIENTMETRICS
構造から推奨されるフォントは入手できます。自動的にDPIスケーリングされたフォントについては
(Windowsの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
}
(Windowsの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のように設定して、最良の互換性を確保する必要があります。
[DEFAULT_GUI_FONTを使用しないでください。](https://blogs.msdn.microsoft.com/oldnewthing/20050707-00/?p=35013)ビットマップフォントは使用できません。ごめんなさい。 – andlabs
@andlabsの場合、DEFAULT_GUI_FONTはTahomaをデフォルトフォントとして使用します。これはベクターです。また、モニターを1つ使用してアプリケーションにDPI-Awarenessを設定すると、Windows Resolution Settingsを使用してモニターでDPIを変更すると、DEFAULT_GUI_FONTのフォントサイズが変更されます。 – deserg
それは当てはまりません。これはビットマップフォントです。 https://blogs.msdn.microsoft.com/oldnewthing/20050707-00/?p=35013本当に、あきらめてください。 –