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