WinFormsでクリップされたコントロールの表示部分のサイズを取得する方法はありますか?
非常に簡単な例:フォームにコントロールを配置し、フォームの幅をコントロールの幅よりも小さくします。コントロールの表示領域の幅をどのように取得しますか?この場合、フォームのClientSizeを使用できますが、必ずしもそれほど単純ではありません。
より複雑な(そして実際の)例:AutoSizeがtrueに設定されたラベルがあり、それを含むコントロールの幅を超えて拡大し、クリップされる可能性があります。これが起こるとき、私は知る必要があります。ラベルの幅をコンテナの幅と比較するほど簡単ではありません。コンテナもAutoSize=trueであり、クリップされている可能性があるためです。
現在の私のアプローチは、AutoSize = falseのコンテナが見つかるまでコンテナツリーを上に移動し、その幅を取得することです。また、各コンテナのパディングも考慮に入れる必要があります。ただし、これは、コントロールがそのコンテナまたはそのコンテナのコンテナなどによってクリップされていることのみを考慮します。問題のコントロールまたはいずれかのコンテナが、より高いZオーダーの兄弟コントロールによってクリップされている場合は機能しません。そして、このアプローチを簡単に破る方法は他にもあると思います。
ラベルAutoSizeをfalseに変更することはオプションではありません。ラベルは、AutoSizeに設定されたUserControlにあるため、ラベルが大きくなると、UserControlも一緒に大きくなります。AutoSizeを使用せずにこれを機能させるのは面倒です。
私が使ってみたもの、失敗したもの:
Control.ClientSize
、、、、。Control.ClientRectangle
_ Control.PreferredSize
_Control.CreateGraphics().VisibleClipBounds
グラフィックスのクラスで少し遊んだことがありますが、頭がおかしいです。Graphics.VisibleClipBounds
有望に聞こえましたが、言及された他のサイズのプロパティと同じように常に返されるようです。
これは特にWinFormsに関係します。それがすべてある場合、私はap/invokeソリューションに満足しています。
投稿する前に徹底的な検索を行いました。同様の質問はどれも役に立ちません。