1

従来の WinForms アプリを使用しており、セッション間でウィンドウの位置とサイズを保存したいと考えています。FormClosing および Load イベント中にGetWindowPlacementおよびSetWindowPlacementを使用しています。私が得ている問題は、より高い DPI 設定 (中、サイズ 125% など) でサイズが膨張し続けることです。特定のサイズで SetWindowPlacement を呼び出しますが、GetWindowPlacement が呼び出されると、ウィンドウが最初から同じサイズであったとしても、それらの数値は 25% 大きくなります。フォーム内のサイズ変更可能な要素のサイズを保存する場合にも、同じ種類の問題が存在します。

新しい WinForms プロジェクトを作成すると、これで問題なく動作します。より高い DPI で実行しても、サイズは安定しています。プロジェクトの腸内にいくつかのレガシー設定があるか、それを台無しにしている難解なフォーム設定があると思いますが、どこにあるのかわかりません。

両方のプロジェクトでIsProcessDPIAwareを呼び出しましたが、どちらもtrue. 誰がこれを引き起こしているのか知っていますか?

4

2 に答える 2

1

フォームの AutoScaleMode プロパティで選択されているように、何らかの形でスケーリングをトリガーしているように聞こえます。2 つのプロジェクトの違いは、AutoScaleDimensions プロパティであり、Designer.cs ファイルに表示されます。

なぜこれが問題を引き起こすのかはわかりませんが、Form クラスはすでに GetWindowPlacement() を内部で使用しており、RecreateHandleCore() および UpdateWindowState() メソッドを使用しています。本当の助けを得るには、再現プロジェクトをどこかに投稿する必要があると思います。

于 2010-04-09T16:09:46.397 に答える
1

フォームの .resx ファイルで、この問題のある設定を見つけました。

<data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing">
  <value>5, 13</value>
</data>

これが存在する場合、VS は AutoScaleBaseSize を自動的に変更して、DPI で機能するようにしますが、他の人の DPI では機能しません。他のすべての人にとって、フォームは常に拡大または縮小します。

デザイナーのプロパティ パネルで AutoScaleMode = Font を選択すると、VS が起動し、フォント スケーリング設定が「モダナイズ」されました。すべての DPI で機能するようになりました。

于 2010-04-09T16:39:08.893 に答える