[解決済み] DPIが高いマシン(例:150%)でアプリが正しく動作するように設定するにはどうすればよいですか?
質問
C# で簡単な Winforms アプリケーションを作成しました。DPI 設定が高い (たとえば、150%) マシン上でアプリケーションを実行すると、アプリケーションが拡大表示されます。ここまではいい感じです。 しかし、フォントを高いフォントサイズでレンダリングする代わりに、すべてのテキストも拡大表示されます。もちろん、これは非常にぼやけたテキスト (ボタンなどのすべてのコントロール) につながります。
Windows はテキストを正しくレンダリングするように対処すべきではありませんか? たとえば、私のアプリケーションのタイトル バーは鮮明にレンダリングされます。
どのように解決するのですか?
100% (または "XP-style DPI scaling" チェックボックスをオンにした場合は 125%) を超えると、デフォルトで Windows が UI のスケーリングを引き継ぎます。 これは、アプリケーションが出力をビットマップにレンダリングし、そのビットマップを画面に描画することによって行われます。 このビットマップのスケールが変更されると、どうしてもテキストがぼやけて見えてしまいます。 DPI 仮想化と呼ばれる機能により、古いプログラムを高解像度モニターで使用できるように維持します。
より高い 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>
ClickOnceでデプロイする場合などに必要なSetProcessDPIAware()をMain()メソッドでピン留めすることもできます。
[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
関連
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?