在Paint事件中调用一个有效的RedrawLines()方法,但我做了一些应该没有效果的小改动,现在我遇到了问题。首先,当我切换标签时,每个标签都包含我的UserControl,这些行不像以前那样重绘。此外,当我使用MouseWheel时,线条不会完全绘制,因为它们在UserControl的顶部和底部被截断。然而,当我使用ScrollBar时,它们是完整的。有什么想法吗?
获得必要的点之后,这是我的DrawLine()方法的一部分:
System.Drawing.Pen myPen;
myPen = new System.Drawing.Pen(Color.Black);
myPen.Width = 3;
System.Drawing.Graphics formGraphics = this.CreateGraphics();
formGraphics.DrawLine(myPen, p1.X, p1.Y, p2.X, p2.Y);
myPen.Dispose();
formGraphics.Dispose();
所以我有一个RedrawLines方法可以准确地调用它
private void RedrawLines(){
Graphics g = Graphics.FromHwnd(this.Handle);
g.Clear(Color.White);
g.Dispose();
for (int i =0; i < Set_Of_Connections.Count; i++)
{
DrawLine(Set_Of_Connections[i].ins.cb, Set_Of_Connections[i].outs.cb, Color.Green);
}
}
在Paint Event中调用它:
private void Switch_Paint(object sender, PaintEventArgs e)
{
RedrawLines();
}
但就像我说的那样,这根本不会对你有所帮助。
答案 0 :(得分:0)
试试这样:
public UserControl1() {
InitializeComponent();
this.DoubleBuffered = true;
this.ResizeRedraw = true;
}
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
e.Graphics.Clear(Color.White);
for (int i = 0; i < Set_Of_Connections.Count; ++i)
{
DrawLine(e.Graphics,
Set_Of_Connections[i].ins.cb,
Set_Of_Connections[i].outs.cb,
Color.Green);
}
}
protected override void OnMouseWheel(MouseEventArgs e) {
base.OnMouseWheel(e);
this.Invalidate();
}
protected override void OnScroll(ScrollEventArgs se) {
base.OnScroll(se);
this.Invalidate();
}
你应该将Paint对象从Paint事件传递给DrawLine方法,并在那里使用图形对象,而不是使用CreateGraphic函数,这只是一个临时绘图,会导致闪烁,因为它会忽略任何DoubleBuffering设置。