2013-10-31 1 views
0

는 말로 내 문제를 explane 어렵다 사라지지 않는, 그래서 나는 단어와 이미지 :C# 윈도우 폼 상황에 맞는 메뉴 컨트롤은 완전히

내 승리 양식 응용 프로그램에서 상황에 맞는 메뉴를 제어 할 수 있습니다 (MS 비주얼을 함께하려고합니다 스튜디오 프로젝트). 완전히 사라지지 않고, 패널 컨트롤 위에있는 부분이 그대로 있으며, 사용자 정의 패널 클래스 (bordercolor 속성 포함)입니다. 문제는되지 소스 코드

enter image description here

enter image description here 2. 윈도우 7에 Windows XP에서만 발생합니다

public class MyPanel : Panel 
{ 
    private System.Drawing.Color colorBorder = System.Drawing.Color.Transparent; 

    public MyPanel() 
     : base() 
    { 
     this.SetStyle(ControlStyles.UserPaint, true); 
     this.BorderStyle = BorderStyle.None; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     e.Graphics.DrawRectangle(new System.Drawing.Pen(
      new System.Drawing.SolidBrush(colorBorder), 2), e.ClipRectangle); 
    } 

    protected override void OnResize(EventArgs e) 
    { 
     Invalidate(); 
    } 

    public System.Drawing.Color BorderColor 
    { 
     get 
     { 
      return colorBorder; 
     } 
     set 
     { 
      colorBorder = value; 
     } 
    } 
} 

어떻게이 문제를 해결하려면? 상황에 맞는 메뉴가 닫히는 이벤트가 발생할 때 패널을 다시 만들기 위해 Invalidate()를 추가 할 수 있지만이 문제가 정확히 발생하는 이유를 알고 싶습니다. 일부 .NET Framework 버그입니까?

답변

1
e.Graphics.DrawRectangle(new System.Drawing.Pen(
     new System.Drawing.SolidBrush(colorBorder), 2), e.ClipRectangle); 

실제로 코드에서 그래픽 클래스에 해당 사각형을 그어달라고 요청했습니다. ClipRectangle 속성을 사용하면 다시 칠할 부분 주위의 경계 사각형을 나타냅니다. 패널과 컨텍스트 메뉴 사이의 교차점이었습니다. 당신이 을 의미하는 것은 전체 패널 주위에 직사각형을 그리는을 의미했습니다. 또는 패널을 툴 스트립과 분리하는 라인 만 명확하지 않습니다. 원하는 결과로 라인에서 추측 : 당신은 그냥 패널의 상단에 선을 그립니다

protected override void OnPaint(PaintEventArgs e) { 
    base.OnPaint(e); 
    using (var pen = new Pen(colorBorder, 2)) { 
     e.Graphics.DrawLine(pen, Point.Empty, new Point(this.ClientSize.Width, 0)); 
    } 
} 
+0

, 아무것도 더 ... 난 그런 다음 새로운 Rectangle (0, 0, this.ClientSize를 사용 국경 – vinsa

+0

와 패널이 필요합니다 .Width-2, this.ClientSize.Height-2); 올바른 코드를 작성하는 방법을 배우려면 여기에서 답을 주저하지 말고 우리는 실제로 당신을 위해 일하고 싶지는 않습니다 :) ClipRectangle을 사용하는 것이 잘못된 이유를 이해했으면 좋겠군요. –

+0

예, 문제는 ClipRectangle 이었으므로 지금은'new Rectangle (0, 0, this.ClientSize.Width, this.ClientSize.Height)'를 대신 사용합니다. 그러면 아름답게 작동합니다. 감사합니다. – vinsa