112

C#で簡単なWinformsアプリケーションを作成しました。DPI設定が高い(たとえば150%)マシンでアプリケーションを実行すると、アプリケーションがスケールアップします。ここまでは順調ですね!ただし、フォントサイズを大きくしてフォントをレンダリングする代わりに、すべてのテキストも拡大されます。もちろん、それは非常にぼやけたテキストにつながります(ボタンなどのすべてのコントロールで)。

Windowsはテキストのレンダリングを正しく処理するべきではありませんか?たとえば、私のアプリケーションのタイトルバーは鮮明でクリアにレンダリングされます。

4

5 に答える 5

144

100%(または[XPスタイルのDPIスケーリング]チェックボックスがオンになっている場合は125%)を超えると、デフォルトでWindowsがUIのスケーリングを引き継ぎます。これは、アプリに出力をビットマップにレンダリングさせ、そのビットマップを画面に描画することによって行われます。そのビットマップを再スケーリングすると、必然的にテキストがぼやけて見えます。「DPI仮想化」と呼ばれる機能で、古いプログラムを高解像度モニターで使用できるようにします。

<dpiAware>マニフェストに要素を追加することで、より高いDPI設定を処理できることを明示的に通知する必要があります。MSDNページはここにありますが、UAC設定が省略されているため、完全ではありません。プロジェクト+新しいアイテムの追加、「アプリケーションマニフェストファイル」を選択します。マニフェストテキストを編集するか、これをコピーして貼り付けます。

<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
    <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>true</dpiAware>
        </asmv3:windowsSettings>
    </asmv3:application>
</assembly>

Main()メソッドでSetProcessDPIAware()をピンボークすることもできます。たとえば、ClickOnceを使用してデプロイする場合に必要です。

    [STAThread]
    static void Main() {
        if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());             // Edit as needed
    }

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool SetProcessDPIAware();

UPDATE、VS2015 Update 1以降を使用する場合、この一般的なニーズは最終的に少し簡単になります。追加されたマニフェストにはすでに関連するディレクティブがあり、コメントを削除するだけです。


この投稿を見つけることができるように検索するためのキーワード:dpiAware

于 2012-11-05T08:37:17.103 に答える
18

アプリケーションは、2 つの異なるモードで開発できます。

1 つ目は、アプリケーションが非 DPI 対応であることを宣言することです (何も宣言しないと、デフォルトでこれになります)。この場合、オペレーティング システムは予想される 96 DPIでアプリケーションをレンダリングし、前に説明したビットマップ スケーリングを行います。その結果、ぼやけた外観のアプリケーションになりますが、正しいレイアウトになります。

2 番目のオプションは、アプリケーションを DPI 対応として宣言することです。この場合、OS はスケーリングを行わず、画面の元の DPI に従ってアプリケーションをレンダリングさせます。モニターごとの DPI 環境の場合、アプリケーションはすべての画面の中で最も高い DPI でレンダリングされ、このビットマップは各モニターの適切なサイズに縮小されます。ダウンスケーリングは、アップスケーリングよりも優れた表示エクスペリエンスをもたらしますが、まだぼやけていることに気付く場合があります。

それを避けたい場合は、アプリケーションをモニターごとの DPI 対応として宣言する必要があります。次に、アプリケーションが異なるモニター間でドラッグされたことを検出し、現在の DPI に従ってレンダリングする必要があります。

DPI 対応の宣言は、マニフェスト ファイルで行われます。

次のリンクを参照してください

于 2014-12-04T05:58:40.127 に答える