protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; e.Graphics.CompositingQuality = CompositingQuality.HighQuality; e.Graphics.DrawLine(new Pen(TabHeader.BottomLineColor), new Point(0, this.Bottom - 1), new Point(this.Width, this.Bottom - 1)); // 判断重绘区域大小,解决由最小化还原后,无法绘制Tab的问题 if (currPaintTh == null || e.ClipRectangle.Size.Width > TabHeader.Left_Offset) { // 被选中的Tab 需要处于顶层,因此最后绘制 TabHeader thSelected = null; foreach (TabHeader th in lstTabHeader) { if (th.Selected) { thSelected = th; } else { th.DrawAll(e.Graphics, th.Rect); } } // 最后绘制 if (thSelected != null) { thSelected.DrawAll(e.Graphics, thSelected.Rect); } } else { // 绘制完整的TabHeader,如果仅绘制指定区域,可能会出现白色背景 currPaintTh.DrawAll(e.Graphics, currPaintTh.Rect); currPaintTh = null; } }
protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (e.Button == System.Windows.Forms.MouseButtons.Left && thMouseDown != null) { if (!slided) { if (Math.Abs(e.X - pMouseDown.X) > 15) { slided = true; } } else { btnAddNew.Visible = false; Point newPos = thMouseDown.Rect.Location; newPos.X += e.Location.X - pMouseDown.X; // 是否在父窗体范围内移动 if (newPos.X < 0) { newPos.X = 0; } if (newPos.X > this.Width - thMouseDown.Rect.Width) { newPos.X = this.Width - thMouseDown.Rect.Width; } // 判断移动方向,向左或向右 if (e.Location.X - pMouseDown.X > 0) { // 判断是否已经是最后一个Tab if (thMouseDown.TabIndex != lstTabHeader.Count - 1) { TabHeader thRight = lstTabHeader[thMouseDown.TabIndex + 1]; // 向右移动时,判断是否与后一Tab 交换位置:当前Tab的 Right ,超过后一Tab 位置的一半 if (newPos.X + tabWidth > thRight.Rect.X + tabWidth / 2) { thRight.TabIndex--; thMouseDown.TabIndex++; lstTabHeader.Sort(); } } } else { // 判断是否已经是第0个Tab if (thMouseDown.TabIndex != 0) { TabHeader thLeft = lstTabHeader[thMouseDown.TabIndex - 1]; // 向右移动时,判断是否与后一Tab 交换位置:当前Tab的 Right ,超过后一Tab 位置的一半 if (newPos.X < thLeft.Rect.X + tabWidth / 2) { thLeft.TabIndex++; thMouseDown.TabIndex--; lstTabHeader.Sort(); } } } thMouseDown.Rect.X = newPos.X; pMouseDown = e.Location; this.Invalidate(); } } else { this.Invalidate(); } }
public int CompareTo(object o) { TabHeader th = o as TabHeader; return(this.tabIndex.CompareTo(th.TabIndex)); }