给listbox 添加 DrawItem 事件
private void listBox1_DrawItem(object sender, DrawItemEventArgs e){int index = e.Index;//获取当前要进行绘制的行的序号,从0开始。Graphics g = e.Graphics;//获取Graphics对象。Rectangle bound = e.Bounds;//获取当前要绘制的行的一个矩形范围。string text = listBox1.Items[index].ToString();//获取当前要绘制的行的显示文本。g.FillRectangle(new SolidBrush(Color.FromArgb(255, 255, 255)), e.Bounds);//绘制背景色。Font fn = new Font("宋体", 14);Image image = Properties.Resources.pengyou; // 从资源管理器中读取图片int erea = 8;Rectangle imgRec = new Rectangle(bound.X + erea*2, bound.Y + erea, bound.Height - erea * 2, bound.Height - erea * 2); // 图片区域Rectangle textRec = new Rectangle(imgRec.Right + 10, bound.Y, bound.Width - imgRec.Right,bound.Height); // 文字区域 if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) //如果当前行为选中行。{//绘制选中时要显示的蓝色边框。g.DrawRectangle(Pens.DodgerBlue, bound.Left, bound.Top, bound.Width - 1, bound.Height - 1);Rectangle rect = new Rectangle(bound.Left + 2, bound.Top + 2, bound.Width - 4, bound.Height - 4);//绘制选中时要显示的蓝色背景。g.FillRectangle(Brushes.DodgerBlue, rect);if (image != null){e.Graphics.DrawImage(image, imgRec, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);}//绘制显示文本。TextRenderer.DrawText(g, text, fn, textRec, Color.White, TextFormatFlags.VerticalCenter | TextFormatFlags.Left);}else{g.DrawRectangle(new Pen(Color.FromArgb(190, 190, 190)), bound.Left - 1, bound.Top, bound.Width + 1, bound.Height);if (image != null){e.Graphics.DrawImage(image, imgRec, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);}TextRenderer.DrawText(g, text, fn, textRec, Color.Black, TextFormatFlags.VerticalCenter | TextFormatFlags.Left);}}
运行效果