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()을 다시 고 쳐 야 합 니 다.
나의 프로그램 효 과 는 다음 과 같다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.