質問

フォームの最小サイズとそのクライアントサイズの違いに基づいて、フォーム内の特定のコントロールをプログラムで配置しようとしています-残念ながら、ユーザーが読み込んだテーマに応じて異なる結果が生成されます(主に問題の原因と思われるタイトルバーとフォームの境界線が異なるテーマで異なる高さ/幅を持っているという事実に)。ウィンドウ全体(タイトルバーなどを含む)の高さを使用しようとしましたが、これは期待どおりに機能しないようです(

これにより、残念ながら含まれているコントロールの位置がずれます。この特定の使用シナリオでは、自動レイアウトコントロール(フローレイアウトパネルなど)の使用は実行可能なソリューションではありません。

本当に明らかな何かを見逃しているに違いありません-これを行うより良い方法はありますか?

この質問が愚かに聞こえる場合はおifび

多くの感謝 デイブ

役に立ちましたか?

解決

正確に解決するために私が見つけた唯一の方法は、次のようなことをすることです:

int delta = this.Height - this.ClientRectangle.Height;

そしてそれを使用して、クライアントから何かをベースにする必要があるときはいつでも (フォームの一部のボタンのサイズを自動的に調整し、それらの周囲に等しい境界線を配置する場合に使用しました。)

だからあなたのために:

int delta = this.Height - this.ClientRectangle.Height;
int actualMinHeight = this.MinimumSize.Height - delta;

HTH

編集: SystemInformation.Border3DSize および SystemInformation.BorderSize プロパティを使用しようとしましたが、正しい幅が表示されませんでした。

他のヒント

フォーム、境界線の太さ、アイコンの間隔などに基づいて、実行時に動的にコントロールのサイズを変更できるようにする手段を求めているかどうかは100%確信はありませんが、これが却下された場合、私は責任を負います質問の誤解については、 CodeProject の記事をご覧ください。さまざまな境界サイズなどに言及したので、GetSystemMetrics pinvokesを使用して境界サイズを制御するシステムメトリックを確認し、こちらこちら。 GetSystemMetricsのpinvoke.net ウェブサイトもご覧ください。

>

これが役立つことを願って、 宜しくお願いします、 トム。

この問題に出くわした人にとっても、ここの善良な人々が見つけることができる最善の解決策は、次のようなものを使用することでした:

Dim clientRectDelta As Integer = Me.Height - Me.ClientRectangle.Height - (SystemInformation.Border3DSize.Height * 2)
Dim actualMinimumHeight As Integer = Me.MinimumSize.Height - clientRectDelta
Dim deltaHeight As Integer = Me.ClientRectangle.Height - actualMinimumHeight

ただし、これはコントロール固有のテーマ依存の高さを無視します(つまり、リストビューの列ヘッダーの高さが変わると、リストビューの全体の高さが変わり、オーバーラップなどが発生する可能性があります)。 / p>

この問題を支援してくれたPondidum、tommieb75、nobugzに感謝します! (申し訳ありませんが、私は現在、すべての回答に+1をマークするのに十分な評判を得ていません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top