C# での作業私は、Control
またはForm
ビットマップをキャプチャする必要があるプロジェクトを持っています。Control
コンストラクターでパラメーターを受け取り、次のコード (この例では単純化されています) を実行してControl
.
public MyItem(Control control)
{
if (control != null)
{
Control rootParent = control;
while (rootParent.Parent != null)
rootParent = rootParent.Parent;
rootParent.BringToFront();
_bounds = control.Bounds;
Rectangle controlBounds;
if (control.Parent == null)
{
_bounds = new Rectangle(new Point(0, 0), control.Bounds.Size);
controlBounds = _bounds;
}
else
{
_bounds.Intersect(control.Parent.ClientRectangle);
_bounds = new Rectangle(rootParent.PointToClient(control.Parent.PointToScreen(_bounds.Location)), _bounds.Size);
controlBounds = new Rectangle(rootParent.PointToClient(control.Parent.PointToScreen(control.Location)), control.Size);
}
if (_bounds.Height > 0 && _bounds.Width > 0)
{
IntPtr hDC = IntPtr.Zero;
if (control.Parent == null && !Clarity.ClientAreaOnly)
// Used for capturing a form including non-client area
hDC = Win32.GetWindowDC(control.Handle);
else
// Used for capturing a form excluding non-client area or a control
hDC = control.CreateGraphics().GetHdc();
try
{
_controlBitmap = new Bitmap(_bounds.Width, _bounds.Height);
using (Graphics bitmapGraphics = Graphics.FromImage(_controlBitmap))
{
IntPtr bitmapHandle = bitmapGraphics.GetHdc();
Win32.BitBlt(bitmapHandle, 0, 0, _bounds.Width, _bounds.Height, hDC, _bounds.X - controlBounds.X, _bounds.Y - controlBounds.Y, 13369376);
bitmapGraphics.ReleaseHdc(bitmapHandle);
}
}
finally
{
if (hDC != IntPtr.Zero)
Win32.ReleaseDC(control.Handle, hDC);
}
}
}
}
キャプチャする必要があるコントロールごとにこのクラスのインスタンスが作成され、ビットマップが使用され (この場合は画面に描画されます)、不要になったオブジェクトは破棄されます。これはうまく機能し、以下に示すように、指定されたControl
orのビットマップを提供しForm
ます。後者の場合は非クライアント領域を含みます。
http://i.imgur.com/ZizXjNX.png
ただし、Form
もう一度キャプチャしようとすると、問題が発生します。再度キャプチャする前にサイズを変更した場合Form
、2 回目のキャプチャでは、非クライアント領域が正しくないものとして表示されます。
以下は、これを説明するための画像です。左側はフォームが画面上でどのように見えるか (正しい) であり、右側は上記のコードがそれをどのようにキャプチャするか (正しくない) です。
http://i.imgur.com/y46kFDj.png
私は自分の検索から何も思いつかなかったので、誰かが私が間違っている/していないことを指摘できるかどうか疑問に思いましたか?