ホーム » VC » ::GetDpiForWindow

2022年10月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

カテゴリー

アーカイブ

ブログ統計情報

  • 99,342 アクセス


::GetDpiForWindow

高 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 で「拡大/縮小」の値を変更したもの.
作成した ::GetDPI を利用した VC6  exe


解像度と DPI の関係が,まだうまく理解できていない.
::GetDpiForWindow は,指定した hwnd の DPI が取得できている.
::GetDeviceCaps では,プライマリの情報が取れる.
「非対応」の場合はスケーリングされた値,「モニターごと」の場合は 100% での値?

Is this 投稿 useful? Useful Useless 0 of 0 people say this 投稿 is useful.

3件のコメント

  1. […] toolBar,UINT idr) { double dpi_s = 1. ; { dpi_s = ::GetDPI_scale(toolBar->GetSafeHwnd()) ; // ::GetDpiForWindow() / 96. } if (dpi_s == 1.) { return TRUE ; } CToolBarCtrl& tbCtrl = toolBar->GetToolBarCtrl() […]

コメントは停止中です。

%d人のブロガーが「いいね」をつけました。