Как мне сделать снимок части окна моего приложения? - PullRequest
2 голосов
/ 27 октября 2010

В настоящее время я пытаюсь сделать снимок указанной части окна моего приложения из указанной начальной координаты (в этом и заключается моя проблема).

Rectangle bounds = new Rectangle((this.Width/2)-400,(this.Height/2)-200, 800,400);

using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppArgb))
{   
    using (Graphics graphics = Graphics.FromImage(bitmap))
    {
        IntPtr hdc = graphics.GetHdc();
        PrintWindow(this.axS.Handle, hdc, 0);
        graphics.ReleaseHdc(hdc);
        graphics.Flush();
        string file = "example.png";
        bitmap.Save(file, ImageFormat.Png);
    }
}

Я пытаюсь сделатьдинамически-адаптивный метод, чтобы сделать скриншот центра окна, даже после изменения размера.Я не уверен, как применить x и y к скриншоту в качестве отправной точки для скриншота.Размеры всегда будут оставаться 800,400 и всегда будут делать снимок экрана в центре приложения независимо от размера окна.

При каждой попытке разметки растровое изображение делало снимок экрана с 0 (+800), 0 (+400), где 0, 0 мне нужноизменить.

Способен ли Bitmap на это?Если нет, какой другой метод я мог бы использовать?

Ответы [ 2 ]

0 голосов
/ 27 октября 2010

Вы можете использовать SetViewportOrgEx для установки источника на HDC. Я обнаружил, что строка заголовка окна отбрасывает расчет центральной точки, поэтому я принял это во внимание.

int x = (this.Width / 2) - 400;
int y = ((this.Height + SystemInformation.CaptionHeight) / 2) - 200;

Rectangle bounds = new Rectangle(x, y, 800, 400);

using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppArgb))
{
    using (Graphics graphics = Graphics.FromImage(bitmap))
    {
        IntPtr hdc = graphics.GetHdc();
        POINT pt;

        SetViewportOrgEx(hdc, -x, -y, out pt);

        // rest as before
    }
}

И подписи для SetViewportOrgEx и POINT:

[DllImport("gdi32.dll")]
static extern bool SetViewportOrgEx(IntPtr hdc, int X, int Y, out POINT lpPoint);

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;

    public POINT(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }

    public static implicit operator System.Drawing.Point(POINT p)
    {
        return new System.Drawing.Point(p.X, p.Y);
    }

    public static implicit operator POINT(System.Drawing.Point p)
    {
        return new POINT(p.X, p.Y);
    }
}
0 голосов
/ 27 октября 2010

Вместо использования PrintWindow попробуйте использовать Graphics.CopyFromScreen, который позволяет указывать как левый верхний угол, так и размеры.

http://msdn.microsoft.com/en-us/library/6yfzc507.aspx

Выполняет передачу битового блока цветных данных, соответствующих прямоугольнику пикселей, с экрана на поверхность рисования графики.

CopyFromScreen работает с координатами на экране, поэтому вам придется рассчитать это для вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...