2017-02-22 2 views
-3

я следующее, если заявление в моем коде:Почему это ничего не рисует?

//global variables 
int x1; 
int y1; 
int x2; 
int y2; 
int counter = 0; 

private void pictureBox1_Click(object sender, EventArgs e) 
{ 
    if (radioButtonDrawLine.Checked) 
    { 
     if (counter == 0) 
     { 
      x1 = Cursor.Position.X; 
      y1 = Cursor.Position.Y; 
      counter++;       
     }  
     else 
     { 
      x2 = Cursor.Position.X; 
      y2 = Cursor.Position.Y; 

      if (counter == 1) 
      { 
       Graphics g = CreateGraphics(); 
       g.DrawLine(Pens.Black, x2, y2, x1, y1); 
      } 
      counter = 0; 
     } 
    } 
} 

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

+1

'radioButtonDrawLine.Checked == true?' –

+0

все еще не работает. Я думаю, что это должно быть одинаково без использования «== true» –

ответ

3

В коде есть две основные проблемы.

Во-первых, вы вызываете CreateGraphics на форму, а не на коробку с картинками - так что если вы действительно нарисовали нужное место, рисунок будет скрыт в окне изображения.

Во-вторых, ваши координаты выключены, потому что Cursor.Position возвращает экранные координаты, а не координации относительно элемента управления, на который вы рисуете. Но это уже не нужно - вы не должны использовать событие Click в первую очередь, а скорее MouseUp. Click - это другое действие, в котором вообще не нужно включать указывающее устройство (например, нажимать клавишу на кнопке). Вы хотите обрабатывать щелчки мыши, поэтому используйте события мыши. В качестве бонуса вы получите локальные координаты щелчка в аргументе обработчика события.

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

2

Вы должны сделать рисунок в событии Paint. Что-то вроде ниже должно работать:

//global variables 
private Point? p1; 
private Point? p2; 
private int counter = 0; 

private void pictureBox1_Click(object sender, EventArgs e) 
{ 
    if (radioButtonDrawLine.Checked) 
    { 
     if (counter == 0) 
     { 
      p1 = pictureBox1.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y)); 
      counter++; 
     } 
     else 
     { 
      p2 = pictureBox1.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y)); 
      pictureBox1.Refresh(); 
      counter = 0; 
     } 
    } 
} 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (p1.HasValue && p2.HasValue) 
    { 
     e.Graphics.DrawLine(Pens.Black, p1.Value.X, p1.Value.Y, p2.Value.X, p2.Value.Y); 
    } 
} 

pictureBox1.Refresh() вызов, чтобы заставить перекрасить был создан после того, как вторая точка. Обратите внимание, что я также использовал конструкцию Point, а не ints для хранения координат, поскольку это сохраняет координаты в логических группах и делает ее более ясными, каковы они.

+0

Если вы пойдете так, сделайте «PointToClient», как только вы соберете координаты, а не в событие «Paint». Тем временем элемент управления мог перемещаться, что также заставило бы линию двигаться. – Luaan

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