2013-03-10 2 views
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); 
      } 
     } 

так вести меня, как я должен получить привязку СОИ формы, которая будет лучше понятно и заметным. Есть идеи. Благодарю.

ответ

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

или что-то близкое к вышеуказанному - я действительно не смог его протестировать.

+1

он отлично работает – Thomas

Смежные вопросы