C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

高DPI使用時のフォームのレイアウト崩れ対応

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■100362 / inTopicNo.1)  高DPI使用時のフォームのレイアウト崩れ対応
  
□投稿者/ こいち (14回)-(2022/07/19(Tue) 17:00:13)

分類:[VB.NET/VB2005 以降] 

VisualStudio 2010 でクラスライブラリのアプリケーション開発をしております。
(.NET Framework3.5)

Windowsのディスプレイ設定:拡大縮小とレイアウトを 100% から例えば、150%に変更した場合、
フォームのレイアウト崩れが発生します。(ラベルがフォームの外まで出て行ってしまう等)
どの拡大率を選択しても、大きくレイアウトが崩れないようにするにはどうすればいいか
ご存じの方はおられますでしょうか?

フォームに、AutoScaleMode というプロパティがあったので"Dpi"を指定してみたのですが、
上手くいきませんでした。

前任者から、app.manifest に dpiAware を true で指定しても上手く行かなかったと聞いています。

何か良い方法があればご教授ください。
お忙しいところ申し訳ございませんが宜しくお願い致します。
引用返信 編集キー/
■100365 / inTopicNo.2)  Re[1]: 高DPI使用時のフォームのレイアウト崩れ対応
□投稿者/ ぶなっぷ (288回)-(2022/07/21(Thu) 11:04:46)
Form と ラベル で、
指定されたフォントやサイズが異なっていませんか?

私の場合、それではまりました。

引用返信 編集キー/
■100369 / inTopicNo.3)  Re[2]: 高DPI使用時のフォームのレイアウト崩れ対応
□投稿者/ こいち (15回)-(2022/07/21(Thu) 14:40:27)
No100365 (ぶなっぷ さん) に返信
> Form と ラベル で、
> 指定されたフォントやサイズが異なっていませんか?
>
> 私の場合、それではまりました。

ご返信ありがとうございます。
ラベルやテキスト、チェックボックスや、グリッド等のサイズが拡大率によって変わっている状況です。
未だに解決しておりません。

Exeで作成したものは、app.manifest が効いているせいだと思うんですが、いい感じで表示されています。
100%表示のフォームの内容がそのまま拡大されたように見えます。

dllの場合、どう対応すればよいのでしょうか・・・
引用返信 編集キー/
■100386 / inTopicNo.4)  Re[3]: 高DPI使用時のフォームのレイアウト崩れ対応
□投稿者/ Azulean (1247回)-(2022/07/23(Sat) 09:31:24)
No100369 (こいち さん) に返信
> Exeで作成したものは、app.manifest が効いているせいだと思うんですが、いい感じで表示されています。
> 100%表示のフォームの内容がそのまま拡大されたように見えます。

これは「高 DPI に非対応」という扱いで、「DPI 仮想化」という仕組みが動いています。
100% 表示のものを拡大して見せるので「ぼやけ」ていますので、高 DPI 環境で使い人にとって「いい感じ」とは言いがたいです。
(あくまで、過去のアプリをとりあえず使えるようにする&開発者がさぼっても困らない程度のものでしかなく、高 DPI に対応しているとは言えない代物です)


> dllの場合、どう対応すればよいのでしょうか・・・

原則的に、DPI に対応している・対応していないは「プロセス単位」となりますので、DLL 提供の場合、 manifest で制御することはできず、「DPI 仮想化前提で割り切る」は難しいことかと思います。
(スレッド分けすればできるのかもしれないが、Windows Forms の複数スレッド運用も非推奨ですし… https://docs.microsoft.com/ja-jp/windows/win32/hidpi/high-dpi-improvements-for-desktop-applications )

であれば、きちんとスケーリング対応すれば良い…となるところですが、Windows Forms のコントロール自体、対応仕切っていないところも多く、4.x で修正されたり、.NET Core 以降で修正されたりしているものがある現状です。

・AutoScaleMode を適切に設定する(Dpi あたりが良いかも)
・コントロールによっては、Font プロパティを親からの継承ではなく、個別に明示的に設定する
・AutoSize/Anchor プロパティに過度に頼らない(二重に調整されてうまく動かないなどあったかも…)


「お手軽に対応できることはない」「完璧に対応することは著しく困難であるか、不可能である」と理解しておいてください。
引用返信 編集キー/
■100391 / inTopicNo.5)  Re[4]: 高DPI使用時のフォームのレイアウト崩れ対応
□投稿者/ こいち (16回)-(2022/07/24(Sun) 22:48:35)
No100386 (Azulean さん) に返信
すみません、遅くなりました。ありがとうございます。

> 原則的に、DPI に対応している・対応していないは「プロセス単位」となりますので、DLL 提供の場合、 manifest で制御することはできず、「DPI 仮想化前提で割り切る」は難しいことかと思います。
> (スレッド分けすればできるのかもしれないが、Windows Forms の複数スレッド運用も非推奨ですし… https://docs.microsoft.com/ja-jp/windows/win32/hidpi/high-dpi-improvements-for-desktop-applications )
>
> であれば、きちんとスケーリング対応すれば良い…となるところですが、Windows Forms のコントロール自体、対応仕切っていないところも多く、4.x で修正されたり、.NET Core 以降で修正されたりしているものがある現状です。

そうなのですね。
FrameWork も 3.5 なので、その辺りも影響しているということでしょうか。
(他の機能に影響することを想定して、FrameWorkを上げることは現時点では凍結されております。)

> ・AutoScaleMode を適切に設定する(Dpi あたりが良いかも)
> ・コントロールによっては、Font プロパティを親からの継承ではなく、個別に明示的に設定する
> ・AutoSize/Anchor プロパティに過度に頼らない(二重に調整されてうまく動かないなどあったかも…)

承知致しました。明日、再作業してみようと思います。
上記の観点を重点的に見直してみます。

> 「お手軽に対応できることはない」「完璧に対応することは著しく困難であるか、不可能である」と理解しておいてください。

そうなのですね。もう100%以外は非推奨という前提で行かせてもらいたいのですが、最近は色んなモニターがあるのでなかなかそうもいかないんですよね。
引用返信 編集キー/
■100393 / inTopicNo.6)  Re[5]: 高DPI使用時のフォームのレイアウト崩れ対応
□投稿者/ Azulean (1248回)-(2022/07/24(Sun) 23:55:16)
No100391 (こいち さん) に返信
> そうなのですね。もう100%以外は非推奨という前提で行かせてもらいたいのですが、最近は色んなモニターがあるのでなかなかそうもいかないんですよね。

たとえば、Surface Pro 8 はデフォルトが 200% らしいので、100% 前提の仕様は通らないでしょう。

----

ところで、近年の Windows は .NET Framework 3.5 はデフォルトで入っておらず、インストールには Windows Update か、インストールディスクを使ったコマンド操作が必要となります。
想定顧客がどうなのかわかりませんが、たとえばオフラインユースの方々には .NET Framework 3.5 アプリは導入しづらいものですよ。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ