2013-05-16 3 views
0

그래서 둥근 스위치를 클릭하면 왼쪽 또는 오른쪽으로 슬라이드하여 기본적으로 켜거나 끕니다 (다른 것들에 사용될 수 있음). 나는 약간의 수정 작업을하는 사각형 버전을 가지고있다. (나는 마음 속으로 몇 가지 개조 해보고 싶다.) 그러나 내가 달리고있는 문제는 둥근 사각형을 사용하는 것이다. 내 자신을 돕기 위해 몇 가지 수업을했다. 하나는 RoundRectanglePath입니다. Create 메서드를 사용하여 사각형 (또는 x, y, w, h)과 모서리 반경을 지정하고 닫힌 GraphicsPath를 반환합니다. 그래야 Graphics를 사용할 수 있습니다. [Fill | Draw] Path with. 그런 다음 Label과 매우 유사한 역할을하는 컨트롤 인 RoundRectangle 클래스가 있습니다. OnPaintBackground를 재정의하고 기본 이벤트를 보내지 않고 사각형 대신 Parent.BackColor와 같은 색을 칠하면 컨트롤이 실제로 둥글다는 환상을 얻었습니다. (투명하게 할 수있는 관련 보조 노트로)Windows Forms 사용자 지정 컨트롤이 올바르게 페인팅되지 않습니다.

내 RoundMovableSwitch 클래스의 경우 2 RoundRectanglePaths를 사용하여 컨트롤을 절반으로 분할합니다. 왼쪽은 초록색이고 오른쪽은 분홍색입니다. 이제는 수평 형 LinearGradient 브러시를 사용할 수 있습니다. 그런데 오케이스를 잘 맞 춥니 다.) 그런 다음 반대쪽에 문자열을 켜고 끕니다. 그 컨트롤에 RoundRectangle을 추가합니다. 사용자가 RoundRectangle 또는 MoveableSwitch 중 하나를 클릭하면 컨트롤은 RoundRectangle을 한 번에 1 픽셀 씩 왼쪽 또는 오른쪽으로 이동합니다. 운동은 훌륭하게 작동합니다. 내가 가지고있는 문제는 이것입니다. RoundRectangle의 바깥 쪽 가장자리가 올바른 투명 색상입니다. 안쪽 가장자리가 잘못된 색입니다. 아래 그림에서 RoundMovingSwitch 1과 2를 참조하십시오. 코드가 제대로 작동하면 다시 돌아가서 코드를 좀 더 재구성 할 것입니다.

Example of problem

코드는 GitHub의에서 호스팅됩니다. Here

답변

2

"나는 데 문제는이입니다 RoundRectangle의 바깥 쪽 가장자리는 올바른 투명 색상 내부 가장자리가 잘못된 색상입니다.. "

내가 문제를 이해 확실하지 ...

당신은 둥근 모서리 외부에있는 파란색 모서리를 제거하려고합니까?

그렇다면, RoundRectangle이 시도 : 컨트롤의 크기가 변경 후 새 크기로 지역() 속성을 다시 설정해야 enter image description here

public RoundRectangle() 
    { 
     this.ResizeRedraw = true; 
     this.VisibleChanged += new EventHandler(RoundRectangle_VisibleChanged); 
    } 

    private bool RegionSet = false; 
    void RoundRectangle_VisibleChanged(object sender, EventArgs e) 
    { 
     if (this.Visible && !RegionSet) 
     { 
      RegionSet = true; 
      var r = new RectangleEx(this.ClientRectangle); 
      var path = RoundRectanglePath.Create(r.ToRectangle(), this.Radius, this.Corners); 
      this.Region = new Region(path); 
     } 
    } 

*합니다.

편집 :이 지역을 다시 만들려면 때 크기 변경 :

protected override void OnSizeChanged(EventArgs e) 
    { 
     base.OnSizeChanged(e); 
     var r = new RectangleEx(this.ClientRectangle); 
     var path = RoundRectanglePath.Create(r.ToRectangle(), this.Radius, this.Corners); 
     this.Region = new Region(path); 
    } 
+0

당신이 보여 사진은 내가 달성하기 위해 노력하고 있습니다 것입니다. RoundRectangle 크기가 변경 될 때 문제가 나타나지 않지만 아무 것도 시도하지 않습니다 :) –

+0

YOU DID IT !!!! 감사합니다. 감사합니다. –

관련 문제