2015-12-29 57 views
8

TabPagesの閉じるボタンをTabControlに追加したいとします。私はこのコードを試してみて、それが右から左へのTabControlで正常に動作します:TabPagesの右ボタンを閉じるTabControl c#

private Point _imageLocation = new Point(13, 5); 
private Point _imgHitArea = new Point(13, 2); 

this.tabControl2.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; 

tabControl2.DrawItem += TabControl2_DrawItem; 

private void TabControl2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) 
{ 
    try 
    { 
     Image img = new Bitmap(GestionP.Properties.Resources.Close); 
     Rectangle r = e.Bounds; 
     r = this.tabControl2.GetTabRect(e.Index); 
     r.Offset(2, 2); 
     Brush TitleBrush = new SolidBrush(Color.Black); 
     Font f = this.Font; 
     string title = this.tabControl2.TabPages[e.Index].Text; 
     e.Graphics.DrawString(title, f, TitleBrush, new PointF(r.X, r.Y)); 

     if (tabControl2.SelectedIndex >= 1) 
     { 
      e.Graphics.DrawImage(img, new Point(r.X + (this.tabControl2.GetTabRect(e.Index).Width - _imageLocation.X), _imageLocation.Y)); 
     } 

    } 
     catch (Exception) { } 
} 

    private void tabControl2_MouseClick(object sender, MouseEventArgs e) 
    { 
     TabControl tc = (TabControl)sender; 
     Point p = e.Location; 
     int _tabWidth = 0; 
     _tabWidth = this.tabControl2.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X); 
     Rectangle r = this.tabControl2.GetTabRect(tc.SelectedIndex); 
     r.Offset(_tabWidth, _imgHitArea.Y); 
     r.Width = 16; 
     r.Height = 16; 
     if (tabControl2.SelectedIndex >= 1) 
     { 
      if (r.Contains(p)) 
      { 
       TabPage TabP = (TabPage)tc.TabPages[tc.SelectedIndex]; 
       tc.TabPages.Remove(TabP); 

      } 
     } 
    } 

をしかし、私はRightToLeftLayout = trueRightToLeft = trueが、それは動作しませんプロパティを設定すると、TabPageタイトルも閉じるボタンを表示されません。

RightToLeftプロパティを受け入れる方法でコードを修正するにはどうすればよいですか?あなたはRTLへの四角形の座標を変換する関数を作成することができます

+0

は、それはあなたが自分で 'RightToLeft'プロパティを処理する必要があることを意味し、編集するWher' TabControl2_DrawItem' – J3soon

+0

でコードを編集してみては?私はr.offsetを変更しようとしましたが、この作業は 'TabControl2_DrawItem'ブロックの最初のタブページ – user4340666

+0

の' if(RightToLeft) '条件を追加しました – J3soon

答えて

4

は、コンテナ内の位置座標:

public static Rectangle GetRTLCoordinates(Rectangle container, Rectangle drawRectangle) 
{ 
    return new Rectangle(
     container.Width - drawRectangle.Width - drawRectangle.X, 
     drawRectangle.Y, 
     drawRectangle.Width, 
     drawRectangle.Height); 
} 

そして、RTLモードでペイントを、座標をこのように計算する:

tabRect = GetRTLCoordinates(this.tabControl2.ClientRectangle, tabRect); 

また、あなたは、あなたの文字列をStringFormatで描画し、RTLモードではStringFormatFlags.DirectionRightToLeftを使用し、文字列形式を使用して変換された矩形で文字列を描画するように設定する必要があります。

e.Graphics.DrawString(this.tabControl2.TabPages[e.Index].Text, 
         this.Font, Brushes.Black, tabRect, sf); 

すべてのコードをCustomTabControlに継承して、TabControlを継承することができます。

スクリーンショット

enter image description here enter image description here

全体のコードは次のようになります。

私はあなたがどこかにProperties.Default.Closeのように近いイメージを持っており、this.CloseImageに割り当てたとします。私が使用した画像は以下の通りです:enter image description here

また、this.tabControl2.Padding = new Point(10, 3);に画像を描画するための余分な空き領域があるように設定しました。

また、最初のタブを閉じないという条件を追加することもできます。 TabControlの上で描画することにより

Image CloseImage; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.tabControl2.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; 
    tabControl2.DrawItem += TabControl2_DrawItem; 
    tabControl2.MouseClick += tabControl2_MouseClick; 
    CloseImage = Properties.Resources.Close; 
    this.tabControl2.Padding = new Point(10, 3); 
} 


private void TabControl2_DrawItem(object sender, 
            System.Windows.Forms.DrawItemEventArgs e) 
{ 
    try 
    { 
     var tabRect = this.tabControl2.GetTabRect(e.Index); 
     tabRect.Inflate(-2, -2); 
     var imageRect = new Rectangle(tabRect.Right - CloseImage.Width, 
           tabRect.Top + (tabRect.Height - CloseImage.Height)/2, 
           CloseImage.Width, 
           CloseImage.Height); 

     var sf = new StringFormat(StringFormat.GenericDefault); 
     if (this.tabControl2.RightToLeft == System.Windows.Forms.RightToLeft.Yes && 
      this.tabControl2.RightToLeftLayout == true) 
     { 
      tabRect = GetRTLCoordinates(this.tabControl2.ClientRectangle, tabRect); 
      imageRect = GetRTLCoordinates(this.tabControl2.ClientRectangle, imageRect); 
      sf.FormatFlags |= StringFormatFlags.DirectionRightToLeft; 
     } 

     e.Graphics.DrawString(this.tabControl2.TabPages[e.Index].Text, 
           this.Font, Brushes.Black, tabRect, sf); 
     e.Graphics.DrawImage(CloseImage, imageRect.Location); 

    } 
    catch (Exception) { } 
} 

private void tabControl2_MouseClick(object sender, MouseEventArgs e) 
{ 

    for (var i = 0; i < this.tabControl2.TabPages.Count; i++) 
    { 
     var tabRect = this.tabControl2.GetTabRect(i); 
     tabRect.Inflate(-2, -2); 
     var imageRect = new Rectangle(tabRect.Right - CloseImage.Width, 
           tabRect.Top + (tabRect.Height - CloseImage.Height)/2, 
           CloseImage.Width, 
           CloseImage.Height); 
     if (imageRect.Contains(e.Location)) 
     { 
      this.tabControl2.TabPages.RemoveAt(i); 
      break; 
     } 
    } 
} 

public static Rectangle GetRTLCoordinates(Rectangle container, Rectangle drawRectangle) 
{ 
    return new Rectangle(
     container.Width - drawRectangle.Width - drawRectangle.X, 
     drawRectangle.Y, 
     drawRectangle.Width, 
     drawRectangle.Height); 
} 
+0

ありがとうございます。これは非常にうまくいきます。 – user4340666

+0

あなたは歓迎です:) –

+0

@Dotnetここは[画像]ですhttps://i.stack.imgur.com/8kuxe.png)。 'this.tabControl2.Padding = new Point(10、3);'でプレイすることができます。 –

関連する問題