2013-12-19 128 views
1

我有一个自定义控件,它由一个Panel和一个较小的pictureBox组成。当我从图片框的Left,Top到Right,Bottom的DrawLine中,起点不在图片框的角落开始,并且偏移+ x和+ y。如果我展开pictureBox以占据Panel的整个大小,它将正确排列。这是怎么回事?DrawLine:左上角不正确

图片框是锚定到顶部,底部,左侧和右侧。没有对接。

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事件时使用* extra *控件。除了在控制面板上有一个非零位置的偏移之外,PictureBox还会改变e.Graphics对象来实现SizeMode属性。当然这是位置属性在这里。使用PictureBox是一种非常昂贵的方式来将DoubleBuffered属性设置为true。 –

+0

因为我在父母的地区(以及其他地方)绘图,所以我在等待其他控件,并认为OnPaint()会更新它们......第一次为我绘制代码......谢谢。 – moose

回答

4

控件都有自己的坐标系从(0,0),因此绘制这样的:

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

pictureBoxPlot.Invalidate()应该被删除,因为这会导致它递归调用自身。另外,因为您没有重写paint方法,所以base.OnPaint(e)看起来不合适。

+0

我在墙上撞了几个小时!我删除了OnPaint()和Invalidate()。按预期工作 - 谢谢! – moose

1

我相信坐标是相对于图片框。如果你想要左上角和整行,请使用类似于:0, 0, pictureBoxPlot.height, pictureBoxPlot.Width

+0

完美 - 谢谢! – moose

1

绘制是相对于您的画布。您正在试图绘制框的实际位置在窗体上的位置。使用PictureBoxPlot.ClientSize

+0

这可能是为什么我注意到其他控件变得流畅。谢谢! – moose