protected override void OnPaint(PaintEventArgs e) { Graphics g = Graphics.FromImage(m_Canvas); g.Clear(BackColor); int bound_left = 0; int bound_width = Width; if (m_Scrollbar.Visible) { bound_left = m_Scrollbar.Width; bound_width = Width - m_Scrollbar.Width; } for (int i = 0; i < m_VisibleItems.Count; ++i) { DrawItemArgs args = new DrawItemArgs(); args.Canvas = g; args.Item = m_VisibleItems[i]; args.Bounds = new Rectangle(bound_left, i * m_ItemHeight, bound_width - 1, m_ItemHeight); if (args.Item == m_SelectedItem) { args.IsSelected = true; args.BackColor = Color.FromArgb(255, 0, 0, 128); args.ForeColor = Color.FromArgb(255, 255, 255, 255); } else { args.ForeColor = ForeColor; args.BackColor = BackColor; } OnDrawItem(args); } e.Graphics.DrawImage(m_Canvas, 0, 0); }
//绘制项目 protected void OnDrawItem(DrawItemArgs args) { if (args.IsSelected) { LinearGradientBrush lbrush1 = new LinearGradientBrush(args.Bounds, Color.Transparent, Color.FromArgb(255, 100, 100, 255), 120.0f, true); LinearGradientBrush lbrush2 = new LinearGradientBrush(args.Bounds, Color.FromArgb(128, 255, 255, 255), Color.FromArgb(0, 100, 100, 255), -30.0f, true); args.Canvas.FillRectangle(lbrush1, args.Bounds); args.Canvas.FillRectangle(lbrush2, args.Bounds); } else { LinearGradientBrush lbrush1 = new LinearGradientBrush(args.Bounds, ForeColor, Color.Transparent, 120.0f, true); LinearGradientBrush lbrush2 = new LinearGradientBrush(args.Bounds, Color.FromArgb(128, 255, 255, 255), BackColor, -45.0f, true); args.Canvas.FillRectangle(lbrush1, args.Bounds); args.Canvas.FillRectangle(lbrush2, args.Bounds); } //输出文字 SolidBrush brush = new SolidBrush(args.ForeColor); SolidBrush shadowBrush = new SolidBrush(m_ShadowColor); Rectangle fontLayout = new Rectangle(args.Bounds.Left + 4, args.Bounds.Top, args.Bounds.Width - 4, args.Bounds.Height);; Rectangle shadowRect = new Rectangle(fontLayout.Left + 1, fontLayout.Top + 1, fontLayout.Width, fontLayout.Height); string name = args.Item.Streams.GetStreamName(args.Item.StreamIndex); args.Canvas.DrawString(name, Font, shadowBrush, shadowRect, m_FontFormat); args.Canvas.DrawString(name, Font, brush, fontLayout, m_FontFormat); Pen pen = new Pen(args.ForeColor); //绘制色彩标记块 Rectangle rect = new Rectangle(args.Bounds.Right - 20, args.Bounds.Top + (m_ItemHeight - 10) / 2, 10, 10); if (args.Item.Streams.GetStreamEnable(args.Item.StreamIndex)) { SolidBrush colorBrush = new SolidBrush(args.Item.Streams.GetStreamColor(args.Item.StreamIndex)); args.Canvas.FillRectangle(colorBrush, rect); } else { SolidBrush colorBrush = new SolidBrush(Color.Transparent); args.Canvas.FillRectangle(colorBrush, rect); } args.Canvas.DrawRectangle(pen, rect); args.Canvas.DrawRectangle(pen, args.Bounds); }