![](/img/trans.png)
[英]How to redraw a PictureBox using a TrackBar Value to affect the drawing
[英]How to redraw a line using values from a trackBar in realtime?
我只是想知道您是否可以帮助我解决这个问题。
在我的程序中,我必须使用paint事件绘制一条充当“炮塔”的线。 我必须使用轨迹栏来选择“发射”此炮塔的角度。 我的问题是我不确定如何编写代码,以便每次更改轨迹栏中的值时都重新绘制“炮塔”行。 我尝试使用Refresh()允许实时绘制线条,但是它导致表单闪烁黑色和白色,并以与所选角度不同的角度重新绘制线条。
任何帮助将不胜感激。 谢谢!
这是该窗体的屏幕截图,来自以下在Visual Basic 2010中运行的代码
public partial class Form1 : Form
{
double xEnd = 0;
double yEnd = 0;
double xOrigin = 30;
double yOrigin = 450;
double xHor = 30;
double yHor = 350;
double xVert = 130;
double yVert = 450;
double lineLength = 100;
public Form1()
{
xEnd = xOrigin + lineLength;
yEnd = yOrigin;
InitializeComponent();
}
private void LineDrawEvent(object sender, PaintEventArgs paint)
{
Graphics drawSurface = paint.Graphics;
Pen turretLine = new Pen(Color.Blue);
Pen graphHorizontal = new Pen(Color.Red);
Pen graphVertical = new Pen(Color.Red);
Pen firedLine = new Pen(Color.Blue);
drawSurface.DrawLine(graphVertical, (int)xOrigin, (int)yOrigin, (int)xHor, (int)yHor);
drawSurface.DrawLine(graphHorizontal, (int)xOrigin, (int)yOrigin, (int)xVert, (int)yVert);
double angleInRadians = ConvertDegsToRads((double)trckBarAngle.Value);
xEnd = xOrigin + lineLength * Math.Cos(angleInRadians);
yEnd = yOrigin - lineLength * Math.Sin(angleInRadians);
drawSurface.DrawLine(turretLine, (int)xOrigin, (int)yOrigin, (int)xEnd, (int)yEnd);
}
private void trckBarAngle_Scroll(object sender, EventArgs e)
{
lblAngle.Text = "Angle is:" + Convert.ToString((double)trckBarAngle.Value / 2);
}
private double ConvertDegsToRads(double degrees)
{
return degrees * (Math.PI / 180.0);
}
}
您可以将表单设置为双缓冲,这将停止闪烁。 this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint |ControlStyles.AllPaintingInWmPaint |ControlStyles.OptimizedDoubleBuffer true); this.UpdateStyles();
在表单的构造函数或OnLoad方法中
或通过将DoubleBufferered
属性设置为true。 我通常将两者结合起来。
我认为OptimizedDoubleBuffer
与其他三个标志的组合相同。 但是,如果没有其他两个, DoubleBuffered
似乎没有任何影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.