public TabButton(TabButton button) { Text = button.Text; ImageIndex = button.ImageIndex; ActiveForeColor = button.ActiveForeColor; ActiveBackColor = button.ActiveBackColor; ActiveFontFamily = button.ActiveFontFamily; ActiveFontStyle = button.ActiveFontStyle; InactiveForeColor = button.InactiveForeColor; InactiveBackColor = button.InactiveBackColor; InactiveFontFamily = button.InactiveFontFamily; InactiveFontStyle = button.InactiveFontStyle; }
/// <summary> /// コレクションから index 番目のボタンを削除します。 /// </summary> /// <param name="index">削除するボタンのインデックス。</param> public void RemoveAt(int index) { if (index < 0 || index >= Count) { throw new ArgumentOutOfRangeException("index"); } TabButton button = this[index]; button.parent = null; button.imageList = null; innerList.RemoveAt(index); parent.UpdateButtons(); }
protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (e.Button == MouseButtons.Left) { TabButton button = GetButtonAt(new Point(e.X, e.Y)); if (button != null && focused != null && focused != button) { buttons.InsertBefore(focused, button); } } focused = null; }
protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.Button == MouseButtons.Left) { TabButton button = GetButtonAt(new Point(e.X, e.Y)); if (button != null) { focused = button; SetSelected(focused); } } }
/// <summary> /// コレクション内の index 番目に button を挿入します。 /// </summary> /// <param name="index">0 から始まるコレクション内インデックス。</param> /// <param name="button">index 番目に挿入されるボタン。</param> public void Insert(int index, TabButton button) { if (index < 0 || index > Count) { throw new ArgumentOutOfRangeException("index"); } if (button.parent != null) { throw new ArgumentException("このボタンは既に他のタブコントロールに登録されています。"); } innerList.Insert(index, button); button.parent = parent; button.imageList = parent.ImageList; parent.UpdateButtons(); }
/// <summary> /// コレクションの末尾に button を追加します。 /// </summary> /// <param name="button"></param> /// <returns></returns> public int Add(TabButton button) { if (button == null) { throw new ArgumentNullException("button"); } if (button.parent != null) { throw new ArgumentException("このボタンは既に他のタブコントロールに登録されています。"); } int index = innerList.Add(button); button.parent = parent; button.imageList = parent.ImageList; parent.UpdateButtons(); return(index); }
private void SetSelected(TabButton button) { if (selected != null) { Region region = new Region(selected.Bounds); region.Union(button.Bounds); selected = button; Invalidate(region); } else { selected = button; Invalidate(selected.Bounds); } Update(); OnSelectedChanged(selected); }
/// <summary> /// button の位置を target の前に移動します。 /// </summary> /// <param name="target"></param> /// <param name="button"></param> public void InsertBefore(TabButton target, TabButton button) { if (target == button) { return; } if (target.parent == null) { throw new ArgumentException("target に親が存在しません。"); } if (button.parent == null) { throw new ArgumentException("button に親が存在しません"); } if (target.parent != button.parent) { throw new ArgumentException("target と button の親が違います。"); } int newIndex; if (target.Index < button.Index) { newIndex = target.Index; } else { newIndex = target.Index - 1; } innerList.Remove(button); innerList.Insert(newIndex, button); parent.UpdateButtons(); }
/// <summary> /// 指定したボタンのサイズを返します。 /// </summary> /// <param name="g"></param> /// <param name="button"></param> /// <returns></returns> private Size GetButtonSize(Graphics g, TabButton button) { Font tempFont = new Font( button.IsSelected ? button.ActiveFontFamily : button.InactiveFontFamily, Font.Size, button.IsSelected ? button.ActiveFontStyle : button.InactiveFontStyle); Size itemSize = g.MeasureString(button.Text, tempFont).ToSize(); tempFont.Dispose(); // ちょっとずれるので適当に調整 itemSize.Width += 8; itemSize.Height += 5; // アイコンが存在すればアイコンサイズを足す if (button.ImageIndex != -1 && imageList != null) { Size imageSize = imageList.ImageSize; itemSize.Width += imageSize.Width; itemSize.Height = Math.Max(itemSize.Height, imageSize.Height); } return(itemSize); }
public int IndexOf(TabButton button) { return(innerList.IndexOf(button)); }
public bool Contains(TabButton button) { return(innerList.Contains(button)); }
private void DrawButton(Graphics g, TabButton button) { StringFormat format = StringFormat.GenericDefault; format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; format.FormatFlags = StringFormatFlags.NoWrap; Rectangle bounds = button.Bounds; Size imgSize = (imageList != null) ? imageList.ImageSize : new Size(0, 0); int margin = (button.ImageIndex != -1) ? 5 : 0; Rectangle imageRect = new Rectangle(bounds.X + margin, bounds.Y + bounds.Height / 2 - imgSize.Height / 2, imgSize.Width, imgSize.Height); Rectangle textRect = new Rectangle(imageRect.Right, bounds.Y, bounds.Width - imageRect.Width - margin, bounds.Height); // 境界線を描画 DrawButtonBorder(g, button); // ホットな背景色を描画 if (hotTrack && button.Equals(hot)) { Rectangle rc = button.Bounds; Size size = SystemInformation.Border3DSize; rc.Width -= 2; rc.Height -= 2; using (Brush b = new SolidBrush(Color.FromArgb(50, HotTrackColor))) g.FillRectangle(b, rc); using (Pen pen = new Pen(HotTrackColor)) g.DrawRectangle(pen, rc); } else { // 通常の背景色を描画 using (Brush brush = new SolidBrush(button.IsSelected ? button.ActiveBackColor : button.InactiveBackColor)) { Rectangle rc = button.Bounds; Size border = SystemInformation.Border3DSize; rc.Inflate(-border.Width, -border.Height); g.FillRectangle(brush, rc); } } // アイコンを描画 if (imageList != null && button.ImageIndex >= 0 && button.ImageIndex < imageList.Images.Count) { g.DrawImage(imageList.Images[button.ImageIndex], imageRect); } // テキストを描画 Brush foreBrush = new SolidBrush(button.IsSelected ? button.ActiveForeColor : button.InactiveForeColor); Font textFont = button.IsSelected ? new Font(button.ActiveFontFamily, Font.Size, button.ActiveFontStyle) : new Font(button.InactiveFontFamily, Font.Size, button.InactiveFontStyle); g.DrawString(button.Text, textFont, foreBrush, textRect, format); textFont.Dispose(); foreBrush.Dispose(); }