c\#TabControl 컨트롤 을 다시 써 서 닫 기 단 추 를 누 르 는 방법

1.c\#안에 있 는 TabControl 컨트롤 이 닫 히 지 않 고 보기 흉 합 니 다.
2.이미 만들어 진 제3자 컨트롤 이 있 지만 비용 을 받는다.
3.제 고장 난 트 리 추리 진단 항목 은 그림 을 그 릴 때 여러 문 서 를 동시에 열 어 조작 할 수 있 기 때문에 브 라 우 저 와 유사 한 다 중 태그 기능 을 실현 하고 닫 을 수 있 습 니 다.
4.그래서 스스로 TabControl 클래스 를 계승 하 는 방법 을 쓰 고 그 안에 있 는 방법 을 다시 쓰 면 이 루어 집 니 다.
5.특색:닫 기 단추 가 있 고,탭 은 배경 색 이 있 으 며,선택 한 탭 은 선택 하지 않 은 색상 과 다 르 며,마우스 가운데 단추 와 오른쪽 단 추 를 사용 합 니 다.
먼저 제 프로젝트 의 전체 코드 를 보 세 요.많은 코드 가 제 프로젝트 의 수요 입 니 다.당신 의 프로젝트 수요 에 따라 삭제 할 수 있 습 니 다.핵심 코드 뒤에 상세 하 게 설명 할 수 있 습 니 다.

 /// <summary>
    /// TabControl
    /// </summary>
    public class MyTabControl : TabControl
    {
        private int iconWidth = 16;
        private int iconHeight = 16;
        private Image icon = null;
        private Brush biaocolor = Brushes.Silver; //
        private Form_paint father;// , , dispose
        private AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl axDrawingControl1;
        public MyTabControl(AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl axDrawingControl)
            : base()
        {
            this.axDrawingControl1 = axDrawingControl;
            this.ItemSize = new Size(50, 25); // , ⒉  
            //this.Appearance = TabAppearance.Buttons; //
            this.DrawMode = TabDrawMode.OwnerDrawFixed;
            icon = Properties.Resources.close.ToBitmap();
            iconWidth = icon.Width; iconHeight = icon.Height;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="fp"> </param>
        public void setFather(Form_paint fp)
        {
            this.father = fp;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="e"></param>
        protected override void OnDrawItem(DrawItemEventArgs e)// 。
        {
            Graphics g = e.Graphics;
            Rectangle r = GetTabRect(e.Index);
            if (e.Index == this.SelectedIndex)    // Tab ,
            {
                Brush selected_color = Brushes.Gold; //
                g.FillRectangle(selected_color, r); //
                string title = this.TabPages[e.Index].Text + "   ";
                g.DrawString(title, this.Font, new SolidBrush(Color.Black), new PointF(r.X + 3, r.Y + 6));//PointF
                r.Offset(r.Width - iconWidth - 3, 2);
                g.DrawImage(icon, new Point(r.X - 2, r.Y + 2));// fntTab = new System.Drawing.Font(e.Font, FontStyle.Bold);
            }
            else//
            {
                g.FillRectangle(biaocolor, r); //
                string title = this.TabPages[e.Index].Text + "   ";
                g.DrawString(title, this.Font, new SolidBrush(Color.Black), new PointF(r.X + 3, r.Y + 6));//PointF
                r.Offset(r.Width - iconWidth - 3, 2);
                g.DrawImage(icon, new Point(r.X - 2, r.Y + 2));//
            }
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            #region
            if (e.Button == MouseButtons.Left)
            {
                Point p = e.Location;
                Rectangle r = GetTabRect(this.SelectedIndex);
                r.Offset(r.Width - iconWidth - 3, 2);
                r.Width = iconWidth;
                r.Height = iconHeight;
                if (r.Contains(p)) //
                {
                    string temp = this.SelectedTab.Text;
                    if (temp[temp.Length - 5] == '*')//
                    {
                        // VSD ft_doc_Path
                        DialogResult response = MessageBox.Show(" " + this.SelectedTab.Name + " ", " ", MessageBoxButtons.YesNoCancel,
                                         MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
                        if (response == System.Windows.Forms.DialogResult.Yes)//
                        {
                            axDrawingControl1.Document.SaveAs(GlobalVariables.ft_doc_Path + axDrawingControl1.Document.Title + ".vsd");//
                            string datetime = DateTime.Now.ToString();//
                            helpTool.saveVsdDB(axDrawingControl1.Document.Title, datetime);// vsd
                            helpTool.setDatetimeToXml(axDrawingControl1.Document.Title, datetime);// xml ,

                            this.SelectedTab.Text = temp.Substring(0, temp.Length - 5) + "   ";// ,
                        }
                        else if (response == System.Windows.Forms.DialogResult.Cancel)//
                        {
                            return;// , 。
                        }
                    }
                    if (this.TabCount == 1)// , ,
                    {
                        father.DisposeForTabControl(true);
                    }
                    else//
                    {
                        this.TabPages.Remove(this.SelectedTab);
                    }
                }
            }
            #endregion
            #region
            else if (e.Button == MouseButtons.Right)    // 
            {
                  for (int i = 0; i < this.TabPages.Count; i++)
                  {
                        TabPage tp = this.TabPages[i];
                        if (this.GetTabRect(i).Contains(new Point(e.X, e.Y)))
                        {
                              this.SelectedTab = tp;
                              break;
                        }
                  }
            }
            #endregion
            #region
            else if (e.Button == MouseButtons.Middle)//
            {
                for (int i = 0; i < this.TabPages.Count; i++)
                {
                    TabPage tp = this.TabPages[i];
                    if (this.GetTabRect(i).Contains(new Point(e.X, e.Y)))// ,
                    {
                        this.SelectedTab = tp;
                        string temp = tp.Text;
                        if (temp[temp.Length - 5] == '*')//
                        {
                            // VSD ft_doc_Path
                            DialogResult response = MessageBox.Show(" " + this.SelectedTab.Name + " ", " ", MessageBoxButtons.YesNoCancel,
                                             MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
                            if (response == System.Windows.Forms.DialogResult.Yes)//
                            {
                                axDrawingControl1.Document.SaveAs(GlobalVariables.ft_doc_Path + axDrawingControl1.Document.Title + ".vsd");//
                                string datetime = DateTime.Now.ToString();//
                                helpTool.saveVsdDB(axDrawingControl1.Document.Title, datetime);// vsd
                                helpTool.setDatetimeToXml(axDrawingControl1.Document.Title, datetime);// xml ,

                                this.SelectedTab.Text = temp.Substring(0, temp.Length - 5) + "   ";// ,
                            }
                            else if (response == System.Windows.Forms.DialogResult.Cancel)//
                            {
                                return;// , 。
                            }
                        }
                        if (this.TabCount == 1)// , ,
                        {
                            father.DisposeForTabControl(true);
                        }
                        else//
                        {
                            this.TabPages.Remove(this.SelectedTab);
                        }

                        break;
                    }
                }
            }
            #endregion
        }
    }

实现关闭按钮的关键代码是重写OnDrawItem(DrawItemEventArgs e)方法:


protected override void OnDrawItem(DrawItemEventArgs e)// 。
        {
            Graphics g = e.Graphics;
            Rectangle r = GetTabRect(e.Index);
            if (e.Index == this.SelectedIndex)    // Tab ,
            {
                Brush selected_color = Brushes.Gold; //
                g.FillRectangle(selected_color, r); //
                string title = this.TabPages[e.Index].Text + "   ";
                g.DrawString(title, this.Font, new SolidBrush(Color.Black), new PointF(r.X + 3, r.Y + 6));//PointF
                r.Offset(r.Width - iconWidth - 3, 2);
                g.DrawImage(icon, new Point(r.X - 2, r.Y + 2));// fntTab = new System.Drawing.Font(e.Font, FontStyle.Bold);
            }
            else//
            {
                g.FillRectangle(biaocolor, r); //
                string title = this.TabPages[e.Index].Text + "   ";
                g.DrawString(title, this.Font, new SolidBrush(Color.Black), new PointF(r.X + 3, r.Y + 6));//PointF
                r.Offset(r.Width - iconWidth - 3, 2);
                g.DrawImage(icon, new Point(r.X - 2, r.Y + 2));//
            }
        }
이 중 if-else 는 현재 옵션 이 선택 되 었 는 지 여 부 를 판단 하 는 데 사 용 됩 니 다.선택 한 색상 이 선택 되 지 않 은 것 과 다 르 게 항목 에서 필요 하지 않 은 것 을 제거 할 수 있 습 니 다.
구체 적 으로 닫 기 기능 을 실현 하 는 원 리 는 proctected override void OnMouse Click(Mouse EventArgs e)방법 을 다시 쓰 는 것 입 니 다.왼쪽 단 추 를 누 르 면 해당 이벤트 가 발생 하고 누 른 영역 위치 가 닫 기 단추 의 영역 에 있 는 지 판단 하여 닫 기 기능 을 수행 합 니 다.또한 중간 키 와 오른쪽 키 에 대한 처리 가 있 습 니 다.항목 에 따라 해당 하 는 단추 이벤트 의 코드 를 수정 하면 됩 니 다.
4.567914.다 쓴 후에 어떻게 사용 합 니까?
창 에 TabControl 을 끌 고 해당 창 코드 파일 의.designer.cs 파일 에서 private void Initialize Component()방법 을 찾 은 다음 TabControl 의 정의 문 구 를 찾 습 니 다. this.TabControl =。。。。this.TabControl=new MyTabControl();인삼 을 전달 하려 면 앞에서 MyTabControl 을 다시 쓸 때 인삼 이 있 는 구조 함 수 를 추가 하 십시오.(제 것 은 인자 가 있 습 니 다.)
특히.designer.cs 파일 에서 private void InitializeComponent()방법 을 찾 으 면 프로그램 이 시각 화 된 인터페이스 디자인 에 따라 자동 으로 생 성 되 기 때문에 시각 화 된 디자인 환경 에서 다시 편집 할 때마다 여기 가 다시 생 성 되 므 로 수 동 으로 this.TabControl=new MyTabControl()을 다시 고 쳐 야 합 니 다.
나의 프로그램 효 과 는 다음 과 같다.

좋은 웹페이지 즐겨찾기