1

私はMDIアプリケーションを使用しています。sdiフォームを最小化する前に、タイトルバーなしのスクリーンショットをキャプチャしたいのですが、コードは機能していますが、画像をキャプチャする方法がはっきりしていません。このように私はそれをします。これが私のコードです。

protected override void WndProc(ref Message m)
        {

            if (m.Msg == WM_COMMAND && m.WParam.ToInt32() == SC_MINIMIZE)
            {
                OnMinimize(EventArgs.Empty);
            }

            base.WndProc(ref m);
        }

protected virtual void OnMinimize(EventArgs e)
        {

            if (_lastSnapshot == null)
            {
                _lastSnapshot = new Bitmap(100, 100);
            }

            using (Image windowImage = new Bitmap(ClientRectangle.Width, ClientRectangle.Height))
            using (Graphics windowGraphics = Graphics.FromImage(windowImage))
            using (Graphics tipGraphics = Graphics.FromImage(_lastSnapshot))
            {
                Rectangle r = this.RectangleToScreen(ClientRectangle);
                windowGraphics.CopyFromScreen(new Point(r.Left, r.Top), Point.Empty, new Size(r.Width, r.Height));
                windowGraphics.Flush();

                float scaleX = 1;
                float scaleY = 1;
                if (ClientRectangle.Width > ClientRectangle.Height)
                {
                    scaleY = (float)ClientRectangle.Height / ClientRectangle.Width;
                }
                else if (ClientRectangle.Height > ClientRectangle.Width)
                {
                    scaleX = (float)ClientRectangle.Width / ClientRectangle.Height;
                }
                tipGraphics.DrawImage(windowImage, 0, 0, 100 * scaleX, 100 * scaleY);
            }
        }

だから私にどのように私がより明確で目立つようになるsdiフォームのスナップを取得する必要があるかを教えてください。何か案が。ありがとう。

4

1 に答える 1

1

画像を拡大または縮小すると、拡大または縮小に関係なく、画像の品質が低下します。画像をスケーリングする代わりに、ウィンドウの幅と高さを取得し、そのサイズで新しいビットマップを作成し、最後に同じサイズで画像を描画します。

protected virtual void OnMinimize(EventArgs e)
{
    Rectangle r = this.RectangleToScreen(ClientRectangle);

    if (_lastSnapshot == null)
    {
        _lastSnapshot = new Bitmap(r.Width, r.Height);
    }

    using (Image windowImage = new Bitmap(r.Width, r.Height))
    using (Graphics windowGraphics = Graphics.FromImage(windowImage))
    using (Graphics tipGraphics = Graphics.FromImage(_lastSnapshot))
    {
        windowGraphics.CopyFromScreen(new Point(r.Left, r.Top), new Point(0, 0), new Size(r.Width, r.Height));
        windowGraphics.Flush();

        tipGraphics.DrawImage(windowImage, 0, 0, r.Width, r.Height);
    }
}

または上記に近いもの-実際にテストすることはできませんでした。

于 2013-03-10T18:08:36.350 に答える