2017-06-22 14 views
0

高DPI値(100%/ 96dpi以上)をサポートするようにアプリケーションを変更しています。Windows 10 DPI処理ダイアログと標準ダイアログ

私が含まれるように、アプリケーションのマニフェストファイルを変更:

<dpiAware>true/PM</dpiAware> 

私はすべてのDPIは自分のアプリのフォームのスケーリング処理することが可能ですが、どのように私は、Windows標準のダイアログ(フォントの選択、開いているファイルを処理しますフォルダブラウザなど)をWinAPI経由で実行します。より高いDPIのために自動的にスケーリングされたこれらのダイアログのみをウィンドウに手動で通知する方法はありますか? 「SetThreadDpiAwarenessContext」WinAPIの機能を使用した後

*更新*

、(ウィンドウがスケーリングを扱うように見えるんが、代わりにコントロールをスケーリングの画像(ぼやけテキスト)をスケーリングしにそうこれは、 "GetOpenFileNameW"を呼び出すことによって生成されるような標準的なウィンドウコントロールです)。

任意のアイデアをどのように開いているファイルのダイアログボックスを描画するには、テキストがぼやけていない状態で適切に拡大縮小されていますか?

+1

[この回答](https://stackoverflow.com/a/41305062/7571258)が役に立ちます。 – zett42

答えて

0

ありがとうございます@ zett42、将来の訪問者のためのリンクされた答えを要約すると、勝利10 Aniv。エディションは、スレッドごとのDPI認識を設定するための新しい "SetThreadDpiAwarenessContext()"関数を導入し、別のスレッドから標準のWindowsダイアログを開き、Windows DPI設定でダイアログのスケーリングを自動的に処理できるようにしました。

+2

あなたの質問に記載されているシステムダイアログは、一般的に、モーダルかモードレスのいずれかの所有ダイアログとして使用されます。それらを別のスレッドにアンロードすると、他のUIとのクロススレッドウィンドウ階層が生成されます。これは安全ではありません。 [プロセス間の親/子プロセスまたは所有者/所有ウィンドウの関係は正当なものですか?](https://blogs.msdn.microsoft.com/oldnewthing/20130412-00/?p=4683)を参照してください。 – IInspectable

+0

@IInspectable正しいです、プライマリスレッドからhwndOwnerハンドル(モーダルダイアログを設定)で "GetOpenFileNameW"を呼び出すと、フリーズが発生します。このためのエレガントなソリューションはありますか(呼び出し元のウィンドウですべてのキーボードとマウスの入力を無効にする必要はありません)。 – bLight

+0

私はあなたが別のスレッドを必要としないと思う。リンクされた答え:スレッドによって作成されたウィンドウの_DPI認識は、ウィンドウが作成された時の呼び出し側スレッドのDPI認識に依存します。...これを正しく理解すれば、前もって 'SetThreadDpiAwarenessContext()'を呼び出す必要がありますあなたの*メインスレッド*で共通のダイアログの1つを作成し、ダイアログが閉じられた後に以前の設定に復元します。 – zett42

関連する問題