23

C++ でフォントに使用される dpi 設定ではなく、実際の画面 dpi/ppiを取得したいと思います。

次のコードで試しました:

バージョン 1 は 72 dpi を報告しますが、これは間違っています。

SetProcessDPIAware(); //true
HDC screen = GetDC(NULL);
double hSize = GetDeviceCaps(screen, HORZSIZE);
double vSize = GetDeviceCaps(screen, VERTSIZE);
double hRes = GetDeviceCaps(screen, HORZRES);
double vRes = GetDeviceCaps(screen, VERTRES);
double hPixelsPerInch = hRes / hSize * 25.4;
double vPixelsPerInch = vRes / vSize * 25.4;
ReleaseDC(NULL, screen);
return (hPixelsPerInch + vPixelsPerInch) * 0.5;

バージョン 2 では、フォントの Windows dpi 設定である 96 dpi が報告されますが、実際の画面 dpi ではありません。

SetProcessDPIAware(); //true
HDC screen = GetDC(NULL);
double hPixelsPerInch = GetDeviceCaps(screen,LOGPIXELSX);
double vPixelsPerInch = GetDeviceCaps(screen,LOGPIXELSY);
ReleaseDC(NULL, screen);
return (hPixelsPerInch + vPixelsPerInch) * 0.5;
4

4 に答える 4

14

あなたが求めていることは、残念ながら、一般的なケースでは不可能です。

Windows は物理的な画面サイズを認識していません。Windows は、画面が 1024x768 ピクセルであることを認識している可能性がありますが、実際の画面の大きさは認識していません。古い 13 インチ画面からケーブルを引き抜いて、解像度を変更せずに 19 インチ モニターに接続することもできます。DPI は異なりますが、Windows はモニターを変更したことを認識しません。

プリンターの実際の物理的な寸法と DPI は取得できますが (ドライバーが嘘をついていないと仮定して)、画面の場合は取得できません。少なくとも確実ではありません。

更新しました

他の人が指摘しているように、新しいモニターと OS (EDID) の間の双方向通信には標準があり、この情報を一部のデバイスで利用できるようにする可能性があります。しかし、この情報を提供するモニターをまだ見つけていません。

EDID が普遍的に利用可能であったとしても、ディスプレイがビデオ プロジェクターである可能性があり、DPI がズーム、フォーカス、レンズの種類、および投影距離に依存するため、一般的なケースではまだ解決できません。プロジェクターが投影距離を知ることはほとんどないため、実際の DPI を報告する方法はありません。

于 2012-09-29T16:36:56.880 に答える
1

DPI 情報を取得すると、以下の方法を使用して正確な値が生成されることがわかります。

ID2D1Factory* m_pDirect2dFactory;
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pDirect2dFactory);
FLOAT dpiX, dpiY;
m_pDirect2dFactory->GetDesktopDpi( &dpiX, &dpiY );
于 2012-12-19T11:33:02.673 に答える
0

あなたが求めているのは次のとおりだと思います:

GetDeviceCaps(hdcScreen, LOGPIXELSX); GetDeviceCaps(hdcScreen, LOGPIXELSY);

于 2016-05-02T17:15:04.267 に答える