2012-10-25 4 views
-1

페인트 이벤트에서 RedrawLines() 메서드를 호출하면 효과적 이었지만 효과가 없어야하는 사소한 변경을 수행하고 이제는 문제가 발생합니다. 우선, 내가 각기 UserControl을 포함하는 탭을 전환하면 선은 이전과 같이 다시 그리지 않습니다. 게다가, MouseWheel을 사용할 때 UserControl의 위쪽과 아래쪽에 잘린 것처럼 선이 완전히 그려지지 않습니다. 그러나 ScrollBar를 사용하면 그 전체가 그려집니다. 어떤 생각? 나는 페인트 이벤트에서 이것을이 정확하게그래픽이 C#의 UserControl에 표시되지 않습니다.

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

전화를 호출하는 RedrawLines 방법이

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

을 그럼 다음은

이 필요한 점을 얻기 후에 나의 DrawLine의 일부() 방법입니다 :

private void Switch_Paint(object sender, PaintEventArgs e) 
{ 
    RedrawLines(); 
} 

그러나 내가 말했듯이 엘.

+3

어제이 질문이 표시되지 않았습니까? 두 경우 모두 문제를 재현하는 코드를 게시하십시오. – LarsTech

+0

당신의 열정에 감사 드리며, 아무런 문제가없는 것으로 보이지 않으므로 코드를 게시하지 않을 것입니다. 내면 문제에 더 가깝습니다. – Riftus

답변

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

당신은 단지 임시 도면이다 CreateGraphic 기능을 사용하는 대신이 그래픽 객체를 당신의 DrawLine 방법에 Paint 이벤트에서 그래픽 개체를 전달하고 사용해야하며, DoubleBuffering 설정을 무시하므로 깜박 거립니다.

+0

좋아,이게 좋은 생각 같아 보이지만, OnPaint 이벤트 외부의 다른 장소에서 DrawLine을 호출해야 할 때 어떻게이 동일한 PaintEventArgs를 활용합니까? – Riftus

+0

@ user1721558 다른 곳에서는'DrawLine'을 호출하면 안됩니다. 'DrawLine'을하는 컨트롤을 업데이트해야한다면'this.Invalidate()'를 호출해야합니다. 그러면 윈도우에 페인트 메시지를 보내도록 지시합니다. – LarsTech

+0

나는 아무 것도 얻지 못한다 ... 내 usercontrol DrawLine 않습니다, 당신이 위에서 말한대로 어딘가에 Invalidate() 호출해야합니까? 나는 무엇을 잘못하고있을 것인가? OnPaint 이벤트가 발생하지 않는 것 같습니다. – Riftus

관련 문제