2

アプリケーションで開いている特定のフォームのスクリーンショットを作成しようとしています。これらのフォームは、他の開いているフォームによって覆われている/隠されている場合があります。CopyFromScreen の使用は実用的ではありません。フォーム レベルでDrawToBitmapを使用することで、希望する場所に非常に近づくことができます。

コントロールでDrawToBitmapを使用する際の問題の1 つは、次のとおりです。

コンテナー内のコントロールは逆の順序でレンダリングされます。

症状: フォーム A にコントロール B とコントロール C があります。フォーム A でDrawToBitmapが呼び出されたときにコントロール B がコントロール C の前にある場合、最初にコントロール B が描画され、次にコントロール C が描画されます。コントロール C はコントロール B の上に描画されるため、結果のビットマップはコントロール C が前にあるように見えます。コントロール B の

私の現在の計画は次のとおりです。

  1. SuspendLayoutを呼び出す
  2. フォーム上のすべてのコントロールの Z オーダーを再帰的に逆にする
  3. ResumeLayoutを呼び出す
  4. DrawToBitmapを呼び出すと、正しい順序を示す画像が作成されます
  5. 手順 1、2、3 をもう一度実行して、元の状態に戻します。

それは正しいと思いますか?

ctrl.Parent.Controls.GetChildIndex(ctrl)を使用して現在の Z オーダー インデックスを取得し、 SetChildIndexで同様の呼び出しを行って新しい値に設定できると確信しています。

今、私は可能な限り効率的な方法で並べ替えの部分を達成するのに役立つコード サンプルを探しています。

4

1 に答える 1

1

これを試して:

For Each ctl As Control In Me.Controls.OfType(Of Control).OrderBy(Function(c) Me.Controls.GetChildIndex(c))
  ctl.BringToFront()
Next

そして、同じことをもう一度実行して、元に戻します。

フォームにネストされたコントロールがある場合は、処理を簡単にするために(つまり、再帰の必要がないように)、このツリーを配列に線形化することをお勧めします。

于 2012-10-25T17:39:15.607 に答える