11

私は興味深い問題に遭遇しました。少なくともVistaでは、デスクトップDPI設定が100%に設定されていない場合、getSystemMetrics(SM_CXSCREEN)は誤った値を返します。たとえば、1366x768の画面で150%を試したところ、getSystemMetrics()は1366ではなく911を返します(および1366 / 1.5〜911)

MSDNによると、getSystemMetrics(SM_CXSCREEN)はピクセルを返すため、この値はDPI設定の影響を受けないと思いましたが、影響を受けます。では、実際のスケーリングされていない画面解像度を見つけるためのより安全な方法はありますか?

4

3 に答える 3

11

プログラムは、125%を超えたときに真の解像度を取得することが、DPI対応であることをオペレーティングシステムに通知する必要があります。このMSDNライブラリの記事で説明されているように、これはマニフェストを使用して行うのが最適です。

于 2010-04-13T14:53:09.497 に答える
6

アプリケーションにdpimakeおよびmanifestファイルを認識させ、次のテキストをその中に入れます。

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>
于 2011-06-19T01:36:48.590 に答える
2

GetSystemMetricsやGetClientRectなどの関数から正しいピクセルメトリックを取得する前に、アプリはDPIを認識しているため、すべてを台無しにしないことをOSに宣言する必要があります。

これが推奨される方法にいくつかの変更がありました。詳細については、MSDNドキュメントを参照してください。

Windows 10以降:

::SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);

またはWindows8.1以降:

::SetProcessDpiAwareness(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);

またはVista以降:

::SetProcessDPIAware();

これを呼び出した後、関数GetSystemMetricsなどは正しい値をピクセル単位でアプリに返す必要があります。

于 2016-12-15T08:31:18.740 に答える