2

これは前の質問へのフォローアップです。フォローアップがルールに反する場合は申し訳ありません! 私も確信が持てず、この質問に回答した人にも完全な回答の信用を与えたいと思っていました.

フォームの特定のセクションのスクリーンショットを取得しようとしており、CopyFromScreen を使用しています。パネルのスクリーンショットと、パネル上にあるアイテム (上にボタンが浮かんでいる) が必要でした。

ともあれ、実装してみるとスクリーンショットがパネル左上の超遠方に出てきました。スクリーンショットはパネル自体ではなく、パネルのごく一部のみが写真の右下に表示されており、パネルの上と左側の領域が実際に描かれています。

私の実装はどこかでオフになっており、どこにあるのか完全にはわかりません。私が何を間違えたのか分かりますか?(繰り返しますが、スクリーンショットはパネル領域の写真である必要があります。他には何もありません)。

        Rectangle rect = new Rectangle(0, 0, panel1.Width, panel1.Height);
        Bitmap bmp = new Bitmap(panel1.Width, panel1.Height, PixelFormat.Format32bppArgb);
        Graphics g = Graphics.FromImage(bmp);
        g.CopyFromScreen(panel1.Left, panel1.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
        bmp.Save("Test.jpg", ImageFormat.Jpeg);
4

2 に答える 2

3

CopyFromScreen を使用する場合は、画面座標を指定する必要があります。ここでは、フォームに相対的な座標を指定します。

あなたがすべきことは次のとおりです:(コードがパネルを含むフォームにある場合)

int borderWidth = (this.Width – this.ClientSize.Width) /2;
int titleBarHeight = this.Height – this.ClientSize.Height – 2 * BorderWidth;
g.CopyFromScreen(this.Left + panel1.Left + titleBarHeight, this.Top + panel1.Top + borderWidth, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
于 2013-04-03T15:59:57.990 に答える
2

より良い答えはここにあります。リンクには、FormBorderStyle とは無関係にフォームの左上隅を取得するための正しい計算があります。

Rectangle r = this.RectangleToScreen(this.ClientRectangle);
int titleHeight = r.Top - this.Top;
int borderWidth = r.Left - this.Left; 

g.CopyFromScreen(this.Left + borderWidth + panel1.Left, this.Top + titleHeight + panel1.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
于 2014-09-29T14:29:00.100 に答える