1

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);
                }
            }
        }
    }

キャプチャする必要があるコントロールごとにこのクラスのインスタンスが作成され、ビットマップが使用され (この場合は画面に描画されます)、不要になったオブジェクトは破棄されます。これはうまく機能し、以下に示すように、指定されたControlorのビットマップを提供しFormます。後者の場合は非クライアント領域を含みます。

http://i.imgur.com/ZizXjNX.png

ただし、Formもう一度キャプチャしようとすると、問題が発生します。再度キャプチャする前にサイズを変更した場合Form、2 回目のキャプチャでは、非クライアント領域が正しくないものとして表示されます。

以下は、これを説明するための画像です。左側はフォームが画面上でどのように見えるか (正しい) であり、右側は上記のコードがそれをどのようにキャプチャするか (正しくない) です。

http://i.imgur.com/y46kFDj.png

私は自分の検索から何も思いつかなかったので、誰かが私が間違っている/していないことを指摘できるかどうか疑問に思いましたか?

4

1 に答える 1