/// <summary> /// 绘制列表项 /// </summary> /// <param name="g">绘图表面</param> /// <param name="item">要绘制的列表项</param> /// <param name="rectItem">该列表项的区域</param> /// <param name="sb">画刷</param> protected virtual void DrawItem(Graphics g, ChatListItem item, Rectangle rectItem, SolidBrush sb) { StringFormat sf = new StringFormat(); sf.LineAlignment = StringAlignment.Center; sf.SetTabStops(0.0F, new float[] { 20.0F }); if (item.Equals(m_mouseOnItem)) //根据列表项现在的状态绘制相应的背景色 sb.Color = this.itemMouseOnColor; else sb.Color = this.itemColor; g.FillRectangle(sb, rectItem); if (item.IsOpen) { //如果展开的画绘制 展开的三角形 sb.Color = this.arrowColor; g.FillPolygon(sb, new Point[] { new Point(2, rectItem.Top + 11), new Point(12, rectItem.Top + 11), new Point(7, rectItem.Top + 16) }); } else { //如果没有展开判断该列表项下面的子项闪动的个数 if (item.TwinkleSubItemNumber > 0) { //如果列表项下面有子项闪动 那么判断闪动状态 是否绘制或者不绘制 if (item.IsTwinkleHide) //该布尔值 在线程中不停 取反赋值 return; } sb.Color = this.arrowColor; g.FillPolygon(sb, new Point[] { new Point(5, rectItem.Top + 8), new Point(5, rectItem.Top + 18), new Point(10, rectItem.Top + 13) }); } string strItem = "\t" + item.Text; sb.Color = this.ForeColor; sf.Alignment = StringAlignment.Near; g.DrawString(strItem, this.Font, sb, rectItem, sf); sf.Alignment = StringAlignment.Far; //g.DrawString("[" + item.SubItems.GetOnLineNumber() + "/" + item.SubItems.Count + "]", this.Font, sb, // new Rectangle(rectItem.X, rectItem.Y, rectItem.Width - 15, rectItem.Height), sf); }