/// <summary> /// 根据索引位置插入一个列表项 /// </summary> /// <param name="index">索引位置</param> /// <param name="item">要插入的列表项</param> public void Insert(int index, PlayList item) { if (index < 0 || index >= this.count) { throw new IndexOutOfRangeException("Index was outside the bounds of the array"); } if (item == null) { throw new ArgumentNullException("Item cannot be null"); } this.EnsureSpace(1); for (int i = this.count; i > index; i--) { m_arrItem[i] = m_arrItem[i - 1]; } item.OwnerPlayListBox = this.owner; m_arrItem[index] = item; this.count++; this.owner.Invalidate(); }
/// <summary> /// 判断一个列表项是否在集合内 /// </summary> /// <param name="item">要判断的列表项</param> /// <returns>是否在列表项</returns> public bool Contains(PlayList item) { return(this.IndexOf(item) != -1); }
/// <summary> /// 获取列表项所在的索引位置 /// </summary> /// <param name="item">要获取的列表项</param> /// <returns>索引位置</returns> public int IndexOf(PlayList item) { return(Array.IndexOf <PlayList>(m_arrItem, item)); }
/// <summary> /// 绘制列表项 /// </summary> /// <param name="g">绘图表面</param> /// <param name="list">要绘制的列表项</param> /// <param name="rectList">该列表项的区域</param> /// <param name="sb">画刷</param> protected virtual void DrawList(Graphics g, PlayList list, Rectangle rectList, SolidBrush sb) { if (list.Equals(MouseOnList)) //根据列表项现在的状态绘制相应的背景色 { sb.Color = this.itemMouseOnColor; } else { sb.Color = this.itemColor; } g.FillRectangle(sb, rectList); //如果展开的画绘制 展开的三角形 if (list.IsOpen) { sb.Color = this.arrowColor; g.FillPolygon(sb, new Point[] { new Point(2, rectList.Top + 11), new Point(12, rectList.Top + 11), new Point(7, rectList.Top + 16) }); } else { sb.Color = this.arrowColor; g.FillPolygon(sb, new Point[] { new Point(5, rectList.Top + 8), new Point(5, rectList.Top + 18), new Point(10, rectList.Top + 13) }); //如果没有展开则在列表项下部画分隔线 g.DrawLine(new Pen(Color.LightGray, 1), 0, rectList.Bottom, rectList.Right, rectList.Bottom); } StringFormat sf = new StringFormat(); sf.LineAlignment = StringAlignment.Center; sf.SetTabStops(0.0F, new float[] { 20.0F }); string strItem = "\t" + list.Text; sf.Alignment = StringAlignment.Near; Font listTitleFont = new Font("宋体", 10, FontStyle.Bold); g.DrawString(strItem, listTitleFont, Brushes.Black, rectList, sf); float length = g.MeasureString(strItem, listTitleFont).Width; sf.SetTabStops(0.0f, new float[] { length - 20 }); g.DrawString("\t[" + list.SubItems.Count + "]", new Font("宋体", 9), Brushes.Gray, rectList, sf); //绘制菜单按钮 if (VScroll.ShouldBeDraw) { list.MenuBounds = new Rectangle(rectList.Right - 25 - list.Menu.Width, rectList.Top + 5, list.Menu.Width, list.Menu.Height); g.DrawImage(list.Menu, list.MenuBounds); } else { list.MenuBounds = new Rectangle(rectList.Right - 25 - list.Menu.Width, rectList.Top + 5, list.Menu.Width, list.Menu.Height); g.DrawImage(list.Menu, list.MenuBounds); } }
protected override void OnMouseMove(MouseEventArgs e) { MousePos = e.Location; if (VScroll.IsMouseDown) { //如果滚动条的滑块处于被点击 那么移动 VScroll.MoveSliderFromLocation(e.Y); return; } if (VScroll.ShouldBeDraw) { //如果控件上有滚动条 判断鼠标是否在滚动条区域移动 if (VScroll.Bounds.Contains(MousePos)) { ClearItemMouseOn(); ClearSubItemMouseOn(); if (VScroll.SliderBounds.Contains(MousePos)) { VScroll.IsMouseOnSlider = true; } else { VScroll.IsMouseOnSlider = false; } if (VScroll.UpBounds.Contains(MousePos)) { VScroll.IsMouseOnUp = true; } else { VScroll.IsMouseOnUp = false; } if (VScroll.DownBounds.Contains(MousePos)) { VScroll.IsMouseOnDown = true; } else { VScroll.IsMouseOnDown = false; } return; } else { VScroll.ClearAllMouseOn(); } } MousePos.Y += VScroll.Value; //如果不在滚动条范围类 那么根据滚动条当前值计算虚拟的一个坐标 for (int i = 0, Len = items.Count; i < Len; i++) { //然后判断鼠标是否移动到某一列表项或者子项 if (items[i].Bounds.Contains(MousePos)) { if (items[i].IsOpen) { //如果展开 判断鼠标是否在某一子项上面 for (int j = 0, lenSubItem = items[i].SubItems.Count; j < lenSubItem; j++) { if (items[i].SubItems[j].Bounds.Contains(MousePos)) { if (MouseOnSongItem != null) { //如果当前鼠标下子项不为空 if (items[i].SubItems[j].HeadRect.Contains(MousePos)) { //判断鼠标是否在头像内 if (!OnMouseEnterHeaded) { //如果没有触发进入事件 那么触发用户绑定的事件 OnMouseEnterHead(new ChatListEventArgs(this.MouseOnSongItem, this.selectSubItem)); OnMouseEnterHeaded = true; } } else { if (OnMouseEnterHeaded) { //如果已经执行过进入事件 那触发用户绑定的离开事件 OnMouseLeaveHead(new ChatListEventArgs(this.MouseOnSongItem, this.selectSubItem)); OnMouseEnterHeaded = false; } } } if (items[i].SubItems[j].Equals(MouseOnSongItem)) { return; } ClearSubItemMouseOn(); ClearItemMouseOn(); MouseOnSongItem = items[i].SubItems[j]; this.Invalidate(new Rectangle( MouseOnSongItem.Bounds.X, MouseOnSongItem.Bounds.Y - VScroll.Value, MouseOnSongItem.Bounds.Width, MouseOnSongItem.Bounds.Height)); //this.Invalidate(); return; } } ClearSubItemMouseOn(); //循环做完没发现子项 那么判断是否在列表上面 if (new Rectangle(0, items[i].Bounds.Top - VScroll.Value, this.Width, 20).Contains(e.Location)) { if (items[i].Equals(MouseOnList)) { return; } ClearItemMouseOn(); MouseOnList = items[i]; this.Invalidate(new Rectangle( MouseOnList.Bounds.X, MouseOnList.Bounds.Y - VScroll.Value, MouseOnList.Bounds.Width, MouseOnList.Bounds.Height)); //this.Invalidate(); return; } } else { //如果列表项没有展开 重绘列表项 if (items[i].Equals(MouseOnList)) { return; } ClearItemMouseOn(); ClearSubItemMouseOn(); MouseOnList = items[i]; this.Invalidate(new Rectangle( MouseOnList.Bounds.X, MouseOnList.Bounds.Y - VScroll.Value, MouseOnList.Bounds.Width, MouseOnList.Bounds.Height)); //this.Invalidate(); return; } } }//若循环结束 既不在列表上也不再子项上 清空上面的颜色 ClearItemMouseOn(); ClearSubItemMouseOn(); base.OnMouseMove(e); }
public ChatListSubItemCollection(PlayList owner) { this.owner = owner; }