カテゴリー
アーカイブ
2022/10/28 / ::GetDpiForWindow への3件のコメント
高 DPI 関連でいろいろと調べてみると ::GetDpiForWindow を使う必要がありそう.
ただ使えるのが Win10 1607 以降みたいで,その辺りをどうしたものか?
次の様に呼出せば 指定した hwnd の値が取れることは確認 .
#if (_MSC_VER >= 1900)
{
UINT dpi = ::GetDpiForWindow(hwnd) ;
std::terr << dpi << std::endl ;
}
#endif
ただ,旧 Windows では存在しないため実行時エラーになる.
そのため ::GetProcAddress を 利用した方法に .
// UINT GetDpiForWindow ( [in] HWND hwnd ) ;
typedef UINT (WINAPI* P_GDFW)(HWND) ;
UINT GetDPI (HWND hwnd)
{
UINT dpi = 96/2 ;
HMODULE user32 = ::GetModuleHandle(TEXT("user32.dll")) ;
P_GDFW p_GetDpiForWindow = (P_GDFW)::GetProcAddress(user32,"GetDpiForWindow") ;
if (p_GetDpiForWindow != NULL) {
dpi = p_GetDpiForWindow(hwnd) ;
}
else {
HDC hdc = ::GetDC(hwnd) ;
dpi = ::GetDeviceCaps(hdc,LOGPIXELSX) ;
::ReleaseDC(hwnd,hdc) ;
}
return dpi ;
}
Win11 で「拡大/縮小」の値を変更したもの.
解像度と DPI の関係が,まだうまく理解できていない.
::GetDpiForWindow は,指定した hwnd の DPI が取得できている.
::GetDeviceCaps では,プライマリの情報が取れる.
「非対応」の場合はスケーリングされた値,「モニターごと」の場合は 100% での値?
Is this 投稿 useful?
Useful
Useless
0 of 0 people say this 投稿 is useful.