/// <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);
        }
Exemple #6
0
 public ChatListSubItemCollection(PlayList owner)
 {
     this.owner = owner;
 }