'C# TabControl'에 해당되는 글 1건

  1. 2016.11.23 C# TabControl의 TabPage에 닫기 버튼 넣기
C#2016. 11. 23. 11:03

 

C#의 TabControl을 사용하다가 TabPage에 닫기 버튼을 넣고 싶었다.

TabPage라는 단어로 검색을 했더니 TabControl 에서 처리해야 된다는 걸 알게 되었다.

 

TabControl 의 TabPage 에 닫기 버튼을 추가하는 방법에 대한 내용을 정리했다.

 

 

우선 TabControl을 상속을 받는다.

그리고 생성자에서 DrawMode를 OwnerDrawFixed로 해줘야 한다.

 

     public class ucTabControl : TabControl
    {
        private Point _imageLocation = new Point(18, 5);
        private Point _imgHitArea = new Point(15, 3);


        public ucTabControl()
        {
            this.DrawMode = TabDrawMode.OwnerDrawFixed;
        }

 

닫기 버튼에 대한 이미지는 2개를 만들어서 Resource에 만들어 놓았다.

 

하나는 선택된 TabPage의 닫기 버튼을 위한 이미지이며,

다른 하나의 나머지 다른 TabPage의 닫기 버튼을 위한 이미지이다.

 

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            base.OnDrawItem(e);

 

            try
            {
                Image img;          

                Font f = this.Font;

                Rectangle r = e.Bounds;
                Brush titleBrush = new SolidBrush(Color.Black);
                string title = this.TabPages[e.Index].Text;

 

                r = this.GetTabRect(e.Index);
                r.Offset(2, 2);

 

                // SelectedTab의 Background Color 는 White으로 처리
                if(this.SelectedIndex == e.Index)
                    e.Graphics.FillRectangle(new SolidBrush(Color.White), e.Bounds);

 

                // 각 Tab별로 close button 에 대한 image값 
                if (this.SelectedTab == this.TabPages[e.Index])
                    img = Properties.Resources.Close_BWhite;
                else
                    img = Properties.Resources.Close_BGray;

 

                // TabPage Text
                e.Graphics.DrawString(title, f, titleBrush, new PointF(r.X, r.Y));


                // TabPage 의 닫기 버튼
                e.Graphics.DrawImage(img, new Point(r.X + this.GetTabRect(e.Index).Width - _imageLocation.X, _imageLocation.Y));

                img.Dispose();
                img = null;               
            }


            catch (Exception)
            {
            }
        }

 

 

OnDrawItem 메소드 하나만 override 하면 TabPage 별로 닫기 버튼 넣기가 처리가 된다.

 

아래의 그림에서 보면 SelectTab의 닫기버튼은 다른 TabPage 와 배경색이 구분된다.

 

 

 

그런데 문제는 TabControl을 사용해보면 처음 두개의 TabPage 처럼  TabPage Text 와 닫기 버튼이 중첩되어 버린다.

 

this.ucTabControl1.TabPages.Add("New Page3  "); 

 

위와 같은 TabPage 추가시 Text에 공백2개 정도을 추가하면 닫기 버튼 중첩을 회피 할 수는 있다.

 

 

* 위의 내용은 구글 검색중에서 알게 된 내용을 정리하였으며, 출처는 모르겠음.

Posted by kongzz