2013-07-03 2 views
1

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

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

Вопрос в том, как я могу это сделать? Как я могу перетаскивать перекрестие, которое пользователь может перетащить в точку вне формы и отпустить ее, чтобы указать координату экрана для программы?

+1

Это для WinForms или WPF? – RogerN

+0

winforms, но я мог переключиться на wpf, если это действительно необходимо. – user886079

+1

Я пишу в комментариях, потому что это не тот ответ, которого вы ожидали, а просто предложение альтернативы. Почему у вас нет элемента управления, который может иметь изображение любого размера в нем, но с видовым окном размером 50 пикселей x 50 пикселей? Затем пользователь может перетащить область просмотра. Вы делаете снимок экрана о том, что находится в окне просмотра. Я думаю, что это проще, чем получить то, что отображается на мониторе в целом. – Renan

ответ

1

Вы должны сделать все следующее:

  1. Используйте MouseDown/MouseMove/MouseUp событий для отслеживания, когда и где перекрестие тащит
  2. Установите свойство захвата контроля в True, пока перекрестие перетаскивается так, что вы продолжаете получать события MouseMove после того, как мышь покидает вашу форму.
  3. Нарисуйте перекрестие непосредственно на рабочем столе (и аннулируйте окно рабочего стола, чтобы стереть его), получив соответствующий дескриптор окна и создавая для него графический объект. Рабочего стола оконная ручка всегда 0.

Опираясь на рабочий стол довольно легко:

using (var g = Graphics.FromHwnd(IntPtr.Zero)) 
{ 
    g.DrawLine(SystemPens.WindowText, 0, 0, 200, 200); 
} 

Чтобы стереть то, что вы рисуете, вы должны будете использовать Platform Invoke для вызова InvalidateRect для соответствующего места ,

+0

Это сработало. Ну, часть с мышью вниз, двигаться и вверх, и захват вещь. Я смог нарисовать на экране и стереть его, но все стало мерцать, и это выглядело не так, как хотелось. Я просто оставил это сейчас ... – user886079

0

Вот быстрый и грязный пример, позволяющий пользователю щелкнуть левой кнопкой мыши и перетащить на PictureBox и получить изображение под курсором. Он не обновляется хорошо, когда пользователь быстро перемещается:

public partial class Form1 : Form 
{ 

    public Form1() 
    { 
     InitializeComponent(); 
     pictureBox1.Cursor = Cursors.Cross; 
    } 

    private Bitmap bmp = null; 
    private Graphics G = null; 

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      if (bmp == null) 
      { 
       bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
       G = Graphics.FromImage(bmp); 
      } 
     } 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      if (bmp != null && G != null) 
      { 
       Rectangle rc = new Rectangle(Cursor.Position, new Size(1, 1)); 
       rc.Inflate(pictureBox1.Width/2, pictureBox1.Height/2); 
       G.CopyFromScreen(rc.Location, new Point(0, 0), rc.Size); 
       pictureBox1.Image = bmp; 
      }  
     } 
    } 

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