2010-02-26 8 views
1

게시물의 길이에 두려워하지 마십시오. 이어야합니다. 많은 사람들이 전에 문제를 설명했을 때 저를 오해 해 왔기 때문에 저는 매우 구체적으로하려고 노력하고 있습니다.WinForm Controls + Transparency

나는 이것에 대한 해결책을 찾아 보았지만 내가 찾고있는 것을 찾지 못했습니다.

런타임에 동적으로 추가되는 여러 중첩 컨트롤에 투명도 설정을 지정하려고합니다. 나는 프로그램의 전체 투명 색상을 사용하여 시도했지만 투명 레이어를 그린 후 컨트롤을 그립니다.

어떤 레이어가 투명한지에 대한 더 많은 제어를 원한다. 그래서 패널, 사각형이 아닌 이미지가있는 PictureBox 컨트롤 및 기타 항목을 레이어 할 수 있습니다. 이 PictureBox에는 클릭, 마우스 오버, 컨텍스트 메뉴 및 기타 관련된 것들이 있기 때문에 그림 (Paint) 이벤트 (다른 ​​곳에서 큰 성공을 거두었습니다)에서 이미지를 그릴 수 없습니다.

제한이 있습니다.

아래 예제에서 WinForm은 '탭'을 사용하여 다음 '장'으로 이동하고 다양한 그래픽은 '책 안에'표시합니다. 아래의 중요한 기술 비트. Picture (slightly outdated)

FlowLayoutPanel FLP = 큰 사각형 패널. 나는 그것의 FlowLayout 능력을 위해서만 사용되기 때문에 'completly transparent'하고, 많은 컨트롤을 깨끗하게 이동/크기를 조정하기를 원한다. 여기에는 다음과 같은 컨트롤이 포함되어 있습니다.

1) 패널 왼쪽 탭 = 왼쪽 탭이있는 패널입니다.

2) 패널 북 = 많은 자식 컨트롤이 포함 된 패널. 배경 이미지가 있습니다 (투명도 문제는 없지만 하위 컨트롤은 문제입니다).

3) 패널 RightTabs = RightTabs가 포함 된 패널입니다.

***** 문제 1 : 투명한 탭 패널 ***** 탭 패널에는 둥근 모서리가있는 그림 상자 컨트롤이 겹쳐져 있습니다. 이러한 탭의 누락 된 모서리는 다음 아래쪽 탭의 이미지가 아니라 컨트롤의 배경을 표시합니다. 위의 그림에서 필자는 아직 손으로 그린 ​​PictureBoxes를 사용하고 있었지만 지금은 탭을 탭 패널로 옮기고 있습니다. 의 배경을 투명하게하려면을 사용하고 싶습니다.

가 ***** 문제 2 : [책] 패널 제어 많은 아동 패널 (아이 층 1)를 포함 ***** [책] 패널 내 자식 컨트롤 및 각각 다른있는 PictureBox를 포함하고 NumericUpDown 컨트롤의 가변 수 (하위 레이어 2)
NUD는 괜찮지 만 PictureBox (CL2)는 더 둥근 모서리가 있습니다.
패널 (CL1)은 완전히 투명해야하며 (권한 및 로직을 그룹화 할 때만 사용) 투명도는 장부 패널 수준에서 중지되어야합니다.

모두 의미가 있습니다. 나는 여러 가지 문제를 해결하기 위해 과거에 많은 수정을 시도했지만, 이제는이 문제를 해결하기로했습니다. 컨트롤 ([컨트롤] .Region)의 모양을 변경해 보았지만 그 솔루션은 거의 지저분하고 향후 변경 (사용자 지정 스킨)을 거의 불가능하게 만듭니다.

+0

안녕하세요, 저는 귀하의 예를 볼 수 없습니다. 제발/ – Ikaso

+0

코드 예를 의미합니까? 나는 그림을 게시 했으므로 나는 그것이 당신이 원하는 것이라고 생각할 수있다. 내가 원하는 것을 시도하기 시작하는 방법조차 모르기 때문에 나는 지금 어떤 코드도 갖고 있지 않다. 관련 코드는 현재 다른 컨트롤에 컨트롤을 동적으로 추가하는 것 외에는 아무런 역할을하지 않습니다. 필자가 생각할 수있는 유일한 다른 관련 기능은 PictureBox 컨트롤 중 일부에 사용하는 Paint() 이벤트 핸들러이지만 기본적으로 e.Graphics.DrawImage() 명령의 긴 목록입니다. 질문을 명확히 할 수 있습니까? –

답변

2

짧은 버전 :

문제점을 해결할 수있는 방법을 찾았습니다.

컨트롤의 REGION을 사용하는 것과 관련이 있습니다.

컨트롤의 영역을 변경하여 기능 투명성 시스템을 가짜로 관리했습니다. 가장 효율적이거나 사용자에게 친숙한 방법은 아니지만 작업이 완료됩니다.

 int SizeW = this.Size.Width; 
     int SizeH = this.Size.Height; 
     int ArcSize = (int)((float)SizeW * 0.40); 

     if (tabType == TabType.LeftTab) 
     { 
      //Make a six-sided polygon, a rectangle with the "outside" corners cut off. 
      //The next step will round the corners with Arcs 
      Point[] points = new Point[] { 
       new Point(SizeW, 0), new Point(ArcSize, 0), 
       new Point(0,ArcSize), new Point(0,SizeH-ArcSize), 
       new Point(ArcSize,SizeH), new Point(SizeW,SizeH)}; 
      Byte[] bytes = new byte[] { 
       1, 1, 
       1, 1, 
       1, 1}; 
      System.Drawing.Drawing2D.FillMode fm = 
       System.Drawing.Drawing2D.FillMode.Winding; 

      System.Drawing.Drawing2D.GraphicsPath tempGP = 
       new System.Drawing.Drawing2D.GraphicsPath(points, bytes, fm); 

      //add the arcs 
      ArcSize = ArcSize * 2; 
      tempGP.AddArc(0, 0, ArcSize, ArcSize, -90, -90); 
      tempGP.CloseFigure(); 
      tempGP.AddArc(0, SizeH - ArcSize, ArcSize, ArcSize, 180, -90); 
      tempGP.CloseFigure(); 

      Region tempRegion = new Region(tempGP); 
      this.Region = new Region(tempGP); 
     }