2013-12-19 3 views
1

У меня есть пользовательский элемент управления, который состоит из панели и меньшего pictureBox. Когда я рисую DrawLine слева, сверху вниз, снизу в pictureBox, начальная точка не начинается в углу pictureBox и смещается + x и + y. Если я разворачиваю pictureBox, чтобы охватить весь размер панели, она правильно выстраивается. Что происходит?DrawLine: сверху и слева неверны

PictureBox привязан к вершине, внизу, влево и вправо. Нет стыковки.

private void pictureBoxPlot_Paint(object sender, PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    e.Graphics.DrawLine(Pens.LightGray, 
     pictureBoxPlot.Left, pictureBoxPlot.Top, 
     pictureBoxPlot.Right, pictureBoxPlot.Bottom); 

    pictureBoxPlot.Invalidate(); 
} 
+0

Он задает вопрос, почему вы используете * дополнительный * элемент управления, когда вы также можете использовать событие Paint. Помимо элемента управления, имеющего смещение в панели от ненулевого местоположения, PictureBox также изменяет объект e.Graphics для реализации свойства SizeMode. Конечно, здесь свойство Location. Использование PictureBox - это действительно очень дорогой способ установить для свойства DoubleBuffered значение true. –

+0

Поскольку я рисовал в пределах родительского региона (и за его пределами), я использовал другие элементы управления и думал, что OnPaint() будет их обновлять ... сначала написав код рисования для меня ... Спасибо. – moose

ответ

4

управления имеют свою собственную систему координат, начиная с (0, 0), так что сделать это так:

e.Graphics.DrawLine(Pens.LightGray, 
    0, 0, pictureBoxPlot.ClientSize.Width, pictureBoxPlit.ClientSize.Height); 

pictureBoxPlot.Invalidate() должны быть удалены, так что бы заставить его рекурсивно вызывать саму себя. Кроме того, base.OnPaint(e) выглядит неуместно, так как вы не переопределили метод рисования.

+0

Я бил головой о стену в течение нескольких часов! Я удалил OnPaint() и Invalidate(). Работает как ожидалось - спасибо! – moose

1

Я считаю, что координаты относительно поля изображения. Если вы хотите, чтобы верхний левый и полный строки использовали что-то вроде: 0, 0, pictureBoxPlot.height, pictureBoxPlot.Width

+0

Perfect - спасибо! – moose

1

Ничья относительно вашего холста. Вы пытаетесь нарисовать, где фактическое местоположение коробки находится в форме. Использовать PictureBoxPlot.ClientSize

+0

Вероятно, поэтому я заметил, что другие элементы управления попадают в шланги. Благодаря! – moose

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