C# 如何在C语言中用背景图像在面板上画线#

C# 如何在C语言中用背景图像在面板上画线#,c#,C#,我有一个双缓冲面板,它有一个背景图像。现在,当我在面板上画线时,它很好,但当我在面板区域中移动这条线时,它会在它最初所在的位置拍摄快照或背景。我原以为双缓冲面板可以解决这个问题,但它不起作用,我也尝试在鼠标按下事件中添加刷新面板代码,但随后该行不断闪烁,所以请大家帮助我 public void LineMouseDown(object sender, MouseEventArgs e) { var l = (Line)sender; if (GetDistance(e.X,

我有一个双缓冲面板,它有一个背景图像。现在,当我在面板上画线时,它很好,但当我在面板区域中移动这条线时,它会在它最初所在的位置拍摄快照或背景。我原以为双缓冲面板可以解决这个问题,但它不起作用,我也尝试在鼠标按下事件中添加刷新面板代码,但随后该行不断闪烁,所以请大家帮助我

 public void LineMouseDown(object sender, MouseEventArgs e)
{
    var l = (Line)sender;

    if (GetDistance(e.X, e.Y, l.StartPoint.X, l.StartPoint.Y) < 30 ||
        GetDistance(e.X, e.Y, l.EndPoint.X, l.EndPoint.Y) < 30)
    {
        _rotating = true;
    }
    else
    {
        _dragging = true;
       panel5.Refresh();
    }

    _clickX = e.X;
    _clickY = e.Y;

    panel5.Refresh();
    _clickCoords = new Point(l.Left + e.X, l.Top + e.Y);

    UpdateCircle(l);
    UpdateMiddle(l);
}

public void LineMouseUp(object sender, MouseEventArgs e)
{
    _rotating = false;
    _dragging = false;
    panel5.Refresh();
}

public void LineMouseMove(object sender, MouseEventArgs e)
{
    var l = (Line)sender;
    if (_rotating)
    {
        if ((DateTime.Now - lastRotate).TotalMilliseconds > 60)
        {
            try
            {
                var angle = GetAngle(l.Left + e.X, l.Top + e.Y, _centerX, 0, _centerX, _centerY);

                var newStartPoint = new Point(
                    (int)Math.Round(_middleX + _radius * Math.Sin(angle)),
                    (int)Math.Round(_middleY + _radius * Math.Cos(angle))
                );

                var newEndPoint = new Point(2 * _middleX - newStartPoint.X, 2 * _middleY - newStartPoint.Y);

                l.SetPoints(newStartPoint, newEndPoint);

                UpdateMiddle(l);

                lastRotate = DateTime.Now;
            }
            catch
            {
                //ignored
            }
        }
    }
    else if (_dragging)
    {
        l.Left = l.Left + e.X - _clickX;
        l.Top = l.Top + e.Y - _clickY;
    }
}

请看我附上的图片,它会让你清楚地知道我的意思。。谢谢你说的“移动背景”是什么意思?还有:你是怎么画线的??那么updatexx调用在做什么???背景图像是否缩放或拉伸?最后:你说的是红线还是灰色的半圆?面板似乎有某种透明效果,好像它的OnPaintBackground()方法没有运行。。您发布的代码都与此问题无关。随机猜测:在面板中绘制需要禁用仅适用于容器控件的绘制优化。在构造函数中将ResizeRedraw属性设置为true。下一个随机猜测:避免WS_EX_透明。下一个随机猜测:在OnLocationChanged()的重写中调用Invalidate()。不要强迫我们随机猜测。您应该使用
Invalidate()
发出重画信号,而不是调用
Refresh()
。如果您正确设置了双缓冲,应该可以解决该控件的闪烁问题,但Winforms wrt双缓冲中存在一些“问题”。请提供一个良好的,可靠地再现问题。对不起,信息和代码不足,但我不确定这是该行或面板的问题。所以我添加了我使用的dubblebuffered面板的代码。1.现在我添加了ResizeRedraw属性并将其设置为true,但问题仍然存在2。我在mousemove事件中使用了panel5.Invalidate,但它不起作用。因此,如果您有任何其他建议,请在此发表评论,如果您需要任何其他代码,请发表评论。而且闪烁也不是问题,问题是我在图片中附加了什么。请注意你会有更多的想法。谢谢
 public class DoubleBufferPanel : Panel
{


    public DoubleBufferPanel()
    {

        // Set the value of the double-buffering style bits to true.
        this.DoubleBuffered = true;



        this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint |
         ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw , true);


        this.UpdateStyles();


    }


}