/// <param name="g">绘制图面.</param> /// <param name="item">要绘制的GroupSubItem</param> /// <param name="rect">绘制的区域.只提供起点(x,y),具体大小可以在重载时自行确定.</param> /// <returns>下一个GroupItem的起点区域.</returns> protected virtual Rectangle DrawSubItem(Graphics g, GroupSubItem item, Rectangle rect) { //绘制Item rect.Height = _SubItemHeight; SolidBrush sb; if (item.Equals(_MouseOnSubItem)) { sb = new SolidBrush(MouseOnSubItemColor); } else { sb = new SolidBrush(this.BackColor); } g.FillRectangle(sb, rect); rect = PaintText(g, item.Text, rect, sb, item.IsOpen); item.Bounds = rect; rect = GetNextBounds(rect); //绘制子Item if (item.IsOpen) { rect.X += 20; foreach (var sitem in item.SubItems) { rect = DrawCellItem(g, sitem, rect); } rect.X -= 20; } return(rect); }
/// <summary> /// 清理GroupSubItem区域. /// </summary> private void ClearSubItemBounds() { if (_MouseOnSubItem != null) { Rectangle rect = _MouseOnSubItem.Bounds; rect.Y -= VerticalScroll.Value; rect.X = 0; this.Invalidate(rect); _MouseOnSubItem = null; } }
/// <summary> /// 鼠标移动处理. /// </summary> /// <param name="e"></param> protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); _MounsePos = e.Location; int index = this.VerticalScroll.Value; _MounsePos.X += this.HorizontalScroll.Value; _MounsePos.Y += this.VerticalScroll.Value; Rectangle rect; foreach (var item in _Items) { if (item.Bounds.Contains(_MounsePos)) { if (item.Equals(_MouseOnItem))//子项与上一次是相等的. { Debug.WriteLine("Item 与上次一样 "); return; } else { ClearBounds(); _MouseOnItem = item; rect = item.Bounds; rect.Y -= index; this.Invalidate(rect); Debug.WriteLine("被选中的是Item {0}".FormatWith(item.Bounds)); return; } } else { if (item.IsOpen) { foreach (var sitem in item.SubItems) { if (sitem.Bounds.Contains(_MounsePos)) { if (sitem.Equals(_MouseOnSubItem)) { Debug.WriteLine("SubItem 与上次一样 "); return; } else { ClearBounds(); _MouseOnSubItem = sitem; rect = sitem.Bounds; rect.Y -= index; this.Invalidate(rect); Debug.WriteLine("被选中的是SubItem {0}".FormatWith(sitem.Bounds)); return; } } else { if (sitem.IsOpen) { foreach (var citem in sitem.SubItems) { if (citem.Bounds.Contains(_MounsePos)) { ClearBounds(); _MouseOnCellItem = citem; rect = citem.Bounds; rect.Y -= index; OnMouseOnCellItem(new DataEventArgs <GroupCellItem>(citem)); this.Invalidate(rect); Debug.WriteLine("被选中的是CellItem {0}".FormatWith(citem.Bounds)); return; } } } } } } } } ClearBounds(); Debug.WriteLine("没有找到任何项"); foreach (var item in Items) { Debug.WriteLine(item.Bounds); } }
public GroupCellItemCollection(GroupSubItem item) { _Father = item; _Owner = null; }