高 DPI 環境下における印刷プレビュー ダイアログ表示時の問題について
こんにちは、Visual Studio サポート チームです。
今回は、Windows フォーム アプリケーションで、印刷プレビュー ダイアログを表示した場合に、高 DPI 環境下で生じる表示上の問題についてお知らせします。
前提
Windows フォーム アプリケーションでは、マニフェスト ファイルにて、dpiAware を true とすることにより、高 DPI に対応しているアプリケーション (DPI Aware なアプリケーション) であることを宣言することができます。
この場合、Windows 8.1 の高 DPI 設定下では、DPI 設定と一致するように、文字列のサイズ等が自動的にスケーリングされます。
DPI Aware なアプリケーションについては、以下の技術資料をご確認ください。
高 DPI アプリケーションの記述方法
<https://blogs.msdn.com/b/ttanaka/archive/2014/07/16/dpi-high-dpi-1-dpi.aspx>
High DPI
<https://msdn.microsoft.com/en-us/library/windows/desktop/dd464646.aspx>
現象
Windows フォーム アプリケーションでは、PrintPreviewDialog クラスや PrintPreviewCotrol クラスを用いて、印刷プレビュー ダイアログを表示させることができます。
その際、印刷プレビューの初期化処理中を示すステータス ダイアログとして、以下のとおり「プレビューを生成しています。」ダイアログが表示されます。
DPIAware なアプリケーションの場合、高 DPI 環境下においてはスケーリングが行われますが、このダイアログ内の、[キャンセル] ボタンのキャプションが欠けてしまうことがあります。
たとえば、DPI を 150% に設定した場合、ダイアログは以下のとおりキャプションの一部が欠けた状態となります。
原因
本現象は .NET Framework の PrintControllerWithStatusDialog クラスが高 DPI に対応していない不具合に起因して発生します。
上記の「プレビューを生成しています。」ダイアログは、PrintControllerWithStatusDialog クラスが表示しますが、本クラスでは、内部で Form クラスを継承したクラスを利用して Label や Button を配置し、ダイアログを設定しています。
この設定の際、Button サイズを固定サイズで指定しており、DPI を考慮した設計となっていないため、DPI 値によっては、文字が欠ける現象が発生します。
弊社製品の不具合によりお客様にご迷惑をおかけしておりますこと、深くお詫び申し上げます。
修正予定について
本問題は、将来バージョンの .NET Framework (4.6.x 以降) では修正される予定です。
このため、アプリケーションの実行環境に .NET Framework 4.6.x 以降をインストールすることで、本問題を解消することが可能でとなる見込みです。
現時点 (2015 年 6 月) で最新の .NET Framework のバージョンは 4.5.2 であり、 当該バージョンの具体的なリリース スケジュールは確定しておりませんが、弊社開発部門にて修正に着手しています。
なお、上記ダイアログの設定部分はハード コーディングされているため、何らかのプロパティの設定やメソッド呼び出しなど、アプリケーションの修正によって、本動作を変更する手法はございません。