1

私の質問はこれに関連しています: .Net WinForms コントロールのスクリーン キャプチャをプログラムで取得する方法は?

C# で System.Windows.Forms.Control のスクリーンショットを撮りたいです。上記のリンクの質問で提案されている DrawToBitmap メソッドを使用していますが、ほとんどの場合、これが機能します。ただし、いくつかの問題があります。

問題 1 :
2 つのタブページがあります。A と B と呼びましょう。スクリーンショットを撮りたいコントロールはタブページ B にあります。タブページ A のボタンが押されたときにスクリーンショットを撮りたいです。これは、タブページ B がまだアクセスされていない場合を除いて、ほとんどの場合機能します。その場合、スクリーンショットは真っ白になります。最初にタブページ B にアクセスしてからタブページ A に戻り、ボタンをクリックしてスクリーンショットを撮ると、正常に動作します。これは、まだ行われていないタブでのコントロールのロードまたはビルドが原因であると推測していますが、正確にはわかりません (または、まったく別のものである可能性があります)。ResumeLayout、PerformLayout、Show、Update、Invalidate を使用してロードまたはビルドを強制しようとしましたが、うまくいきません。
編集:使用してこれを解決することができましたDrawToBitmapコントロール自体ではなく、含まれているタブページ コントロールで、そのタブページで Show を実行します。

問題 2:
特定のカスタム コントロール (UserControl のサブクラス) のスクリーンショットを撮ると、スクリーンショットに小さな四角形の白い領域があります (明らかにあるべきではない場所)。長方形の領域は、ボタンやテキスト ボックスのようなコントロールの特定の部分にあるわけではないので、何が原因なのかわかりません。他のカスタム コントロール (UserControl のサブクラスでもある) では問題なく動作するため、それ自体が問題になることはありません。
編集:解決しました。その上に描画されていた空のコントロールがありました。そのコントロールの Visible を false に設定すると解決しました。

4

2 に答える 2

0

問題1の場合:「最初にタブページBにアクセスし、次にタブページAに戻り、ボタンをクリックしてスクリーンショットを撮ると、正常に機能します」の場合、そのアクションを模倣したformloadeventを追加します。

tabControl.SelectedIndex = IndexOfTabB;
tabControl.SelectedIndex = IndexOfTabA;

それはトリックですが、うまくいきます。

問題2の場合:コントロールのサイズとそのスクリーンショットを比較して、結果を提供できますか?Control.Widthがビットマップ画面の幅と等しくない場合、それは実際の問題です。

于 2011-09-28T09:29:11.027 に答える
0

このコードで行うことができます。残りの作業と正しい座標を見つけることは、読者が宿題をすることです。

int screenWidth = Screen.GetBounds(new Point(0, 0)).Width;
int screenHeight = Screen.GetBounds(new Point(0, 0)).Height;
Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight);
Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
bmpScreenShot.Save("test.jpg", ImageFormat.Jpeg);
于 2011-09-28T09:15:49.847 に答える