2013-09-04 2 views
1

나는 C#에서 사용자 정의 된 TabControl 클래스를 작성합니다. (생성자에 의해 호출된다)수동으로 TabControl.DisplayRectangle 업데이트

InitializeComponent 방법은 사용자 제어 그리기 위해,과 같이 동작 :

private void InitializeComponent() 
{ 
    this.SetStyle(ControlStyles.UserPaint, true); 
    this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
    this.SetStyle(ControlStyles.ResizeRedraw, true); 
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
    this.UpdateStyles(); 
    this.DrawMode = TabDrawMode.OwnerDrawFixed; 
} 

TabControl에 두 개의 구형면을 사용하는 단계;

  • 전체 제어
  • I는 DisplayRectangle을 조정 원하는대로 제어 부분 TabPage 콘텐츠

를 표시이다 DisplayRectangle 포함 된 ClientRectangle, I는 (그것의 속성을 재정의하는) 만 얻을 수있다 :

public override Rectangle DisplayRectangle 
{ 
    get 
    { 
     return this.displayRectangle; // points to a local rectangle, rather than base.DisplayRectangle 
    } 
} 

은 그 때 나는 OnSizeChanged을 무시했습니다 디스플레이 사각형의 크기를 업데이트하기 위해 다음 TabControl이 크기 다시 때 부모 폼이 최대화 될 때

protected override void OnSizeChanged(EventArgs e) 
{ 
    base.OnSizeChanged(e); 
    this.displayRectangle = this.ClientRectangle; 
    this.displayRectangle.Y += this.ItemSize.Height + 4; 
    this.displayRectangle.Height -= this.ItemSize.Height + 4; 
} 
는 내가 발생하고있어 문제는의 DisplayRectangle 작품과 재 크기 따라,하지만/최소화

(따라서 컨트롤 크기를 변경하는 경우), 표시 사각형은 업데이트되지 않습니다.

이 문제를 해결하려면 어떻게해야합니까? 디스플레이 사각형을 수동으로 관리하기위한 지침이 있습니까?

+0

"채우기"로 설정하고 폼의 크기를 변경하면 TabControl의 크기가 변경되고 SizeChange 이벤트가 호출되어 코드가 실행됩니다. 원하는 경우 Main form resizing 이벤트에 의존하여 "수동으로"TabControl의 크기를 조정할 수 있습니다. 하지만 TabControl의 SizeChanged 이벤트가 호출되지 않는 이유를 생각해 낼 수 있습니다. 크기가 변경되지 않았습니다. – varocarbas

+0

당신이하려는 것을보기 어렵습니다. 소유자가 그려주는 것은 페이지가 아닌 탭에만 해당됩니다. 해결하려는 실제 문제를 설명하십시오. –

+0

@HansPassant, 해결했습니다. 문제는 디스플레이 사각형이 변경 될 때 각 TabPage의 경계를 업데이트하지 않는다는 것입니다. 각 TabPage의 경계를 업데이트하자마자 표시 사각형이 자동으로 수정됩니다. – series0ne

답변

0

이 문제를 해결하는 데 도움이되는 몇 가지 사항을 발견했습니다. 그들은; 하여 onResize 방법의 재정의를 사용하여 디스플레이 사각형의 크기를 조정하고, 당신은 예를 들면 ... 디스플레이 사각형의 크기를 조정 끝나면 탭 컨트롤의 각 탭에 대한 경계를 설정하려면 다음을 TabControl의 Dock 속성 인 경우

protected override void OnResize(EventArgs e) 
{ 
    base.OnResize(e); 
    this.displayRectangle = this.ClientRectangle; 
    this.displayRectangle.Y += this.ItemSize.Height + 4; 
    this.displayRectangle.Height -= this.ItemSize.Height + 4; 
    foreach(TabPage page in this.TabPages) 
    { 
     page.SetBounds(
      this.DisplayRectangle.X, 
      this.DisplayRectangle.Y, 
      this.DisplayRectangle.Width, 
      this.DisplayRectangle.Height, 
      SpecifiedBounds.All 
     ); 
    } 
    this.Refresh(); // Can optimize this! 
}