2015-09-17 5 views
0

У меня есть программа, которая снимает снимок выбранной области (которую я выбираю с помощью мыши) и сохраняет ее в буфер обмена. Проблема в том, что он работает только в том случае, если я делаю выбор сверху донизу. Если я попытаюсь сделать выбор в любом другом направлении (снизу вверх, справа налево, слева направо), программа выйдет из строя. Это код MouseMove:Выбор снимка экрана приводит к сбою программы C#

public void Window_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) 
    { 
     if (this.isMouseDown) 
     { 
      double curx = e.GetPosition(null).X; 
      double cury = e.GetPosition(null).Y; 


      System.Windows.Shapes.Rectangle r = new System.Windows.Shapes.Rectangle(); 
      SolidColorBrush brush = new SolidColorBrush(Colors.White); 
      r.Stroke = brush; 
      r.Fill = brush; 
      r.StrokeThickness = 1; 

      r.Width = Math.Abs(curx - x); 
      r.Height = Math.Abs(cury - y); 
      selekt.Children.Clear(); 
      selekt.Children.Add(r); 
      Canvas.SetLeft(r, x); 
      Canvas.SetTop(r, y); 
      if (e.LeftButton == MouseButtonState.Released) 
      { 
       selekt.Children.Clear(); 
       width = e.GetPosition(null).X - x; 
       height = e.GetPosition(null).Y - y; 
       this.CaptureScreen(x, y, width, height); 
       this.x = this.y = 0; 
       this.isMouseDown = false; 
       this.Close(); 
      } 
     } 
    } 

И это для CaptureScreen:

public void CaptureScreen(double x, double y, double width, double height) 
    { 
     int ix, iy, iw, ih; 
     ix = Convert.ToInt32(x); 
     iy = Convert.ToInt32(y); 
     iw = Convert.ToInt32(width); 
     ih = Convert.ToInt32(height); 
     Bitmap slika = new Bitmap(iw, ih, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
     Graphics g = Graphics.FromImage(slika); 
     g.CopyFromScreen(ix, iy, 0, 0,new System.Drawing.Size(iw, ih),CopyPixelOperation.SourceCopy); 
     System.Windows.Forms.Clipboard.SetImage(slika); 

enter image description here

+0

Какая ошибка возникает? Какая линия? – TestWell

+0

TL; DR - Я не вижу вызовов (например, «Math.Min'), которые нормализуют координаты ... Убедитесь, что вы отправили полный образец (и включили точную ошибку). –

+0

Что такое сообщение об исключении и stacktrace? где приложение падает? – user1666620

ответ

0

вы получаете ошибку нижеуказанным код? Кажется, это место, где вы его получите.

Canvas.SetLeft(r, x); 
     Canvas.SetTop(r, y); 

Если да, то вот потому SetLeft принимает UIElement и двойные значения

public static void SetLeft(
UIElement element, 
double length) 

А также, я предполагаю, что х и у являются двойными и объявлены открытыми.

+0

Я не получаю сообщение об ошибке. Он просто падает (см. Комментарий выше, который я написал). X и y являются двойными и общедоступными. – drake

+0

Если это сбой, это потому, что есть исключение. Доля трассировки стека. Это поможет понять, что привело к его краху. – SonalKhodiyar

+0

Я добавил изображение ошибки. – drake

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