【问题标题】:DrawLine: Top and Left are incorrectDrawLine:顶部和左侧不正确
【发布时间】:2013-12-19 23:23:59
【问题描述】:

我有一个自定义控件,它由一个面板和一个较小的图片框组成。当我在pictureBox中从Left,Top to Right,Bottom画线时,起点不是从pictureBox的角开始,而是偏移+x和+y。如果我扩展图片框以占据面板的整个大小,它会正确排列。怎么回事?

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();
}

【问题讨论】:

  • 当您还可以使用面板的 Paint 事件时,为什么要使用 extra 控件提出了一个问题。除了仅在面板中具有非零位置偏移的控件之外,PictureBox 还更改 e.Graphics 对象以实现 SizeMode 属性。肯定是这里的 Location 属性。使用 PictureBox 是一种将 DoubleBuffered 属性设置为 true 的真正昂贵的方法。
  • 由于我在父区域(及其他区域)内绘图,因此我正在使用其他控件并认为 OnPaint() 会更新它们...第一次为我编写绘图代码...谢谢。

标签: c# winforms graphics picturebox


【解决方案1】:

控件有自己的坐标系,从 (0, 0) 开始,所以画成这样:

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

pictureBoxPlot.Invalidate() 应该被删除,因为这会导致它递归地调用自己。此外,base.OnPaint(e) 看起来不合适,因为您没有覆盖 paint 方法。

【讨论】:

  • 我用头撞墙了几个小时!我删除了 OnPaint() 和 Invalidate()。按预期工作 - 谢谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    Draw 是相对于您的画布而言的。您正在尝试绘制框在表单上的实际位置。使用PictureBoxPlot.ClientSize

    【讨论】:

    • 这可能是我注意到其他控件被冲洗的原因。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多