Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抽绳:顶部和左侧不正确_C#_Winforms_Graphics_Picturebox - Fatal编程技术网

C# 抽绳:顶部和左侧不正确

C# 抽绳:顶部和左侧不正确,c#,winforms,graphics,picturebox,C#,Winforms,Graphics,Picturebox,我有一个自定义控件,它由一个面板和一个较小的pictureBox组成。在pictureBox中从左、从上到右、从下绘制线时,起点不从pictureBox的角开始,而是偏移+x和+y。如果我展开pictureBox以占据面板的整个尺寸,它将正确对齐。发生什么事了 pictureBox固定在顶部、底部、左侧和右侧。禁止停靠 private void pictureBoxPlot_Paint(object sender, PaintEventArgs e) { base.OnPaint(e);

我有一个自定义控件,它由一个面板和一个较小的pictureBox组成。在pictureBox中从左、从上到右、从下绘制线时,起点不从pictureBox的角开始,而是偏移+x和+y。如果我展开pictureBox以占据面板的整个尺寸,它将正确对齐。发生什么事了

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,0)开始,因此按如下方式绘制:

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

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

控件有自己的坐标系,从(0,0)开始,因此请按如下方式绘制:

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

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

我相信坐标是相对于图片框的。如果您想要左上角和一条完整的线,请使用以下内容:
0,0,picturebexplot.height,picturebexplot.Width

我相信坐标是相对于图片框的。如果您想要左上角和一条完整的线,请使用类似以下内容:
0,0,picturebexplot.height,picturebexplot.Width

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

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

当您还可以使用面板的绘制事件时,为什么要使用额外的控件。除了控制面板中非零位置的偏移之外,PictureBox还更改e.Graphics对象以实现SizeMode属性。当然,这是这里的位置属性。使用PictureBox将Double Buffered属性设置为true是一种非常昂贵的方法。因为我是在父级区域(以及父级区域以外)内绘制的,所以我使用了其他控件,并认为OnPaint()会更新它们。。。第一次为我写绘图代码。。。谢谢。这就引出了一个问题:当您还可以使用面板的绘制事件时,为什么要使用额外的控件。除了控制面板中非零位置的偏移之外,PictureBox还更改e.Graphics对象以实现SizeMode属性。当然,这是这里的位置属性。使用PictureBox将Double Buffered属性设置为true是一种非常昂贵的方法。因为我是在父级区域(以及父级区域以外)内绘制的,所以我使用了其他控件,并认为OnPaint()会更新它们。。。第一次为我写绘图代码。。。谢谢。我的头撞在墙上好几个小时了!我删除了OnPaint()和Invalidate()。工作如期-谢谢!我的头撞在墙上好几个小时了!我删除了OnPaint()和Invalidate()。工作如期-谢谢!这可能就是我注意到其他控制装置被冲洗的原因。谢谢这可能就是我注意到其他控制装置被冲洗的原因。谢谢