源码https://www.codeproject.com/Articles/15464/Extending-the-ListBox-to-show-more-complex-items

定义控件

using System.Drawing;
using System.Windows.Forms; namespace testexListBox
{
internal class exListBoxItem
{
public exListBoxItem(int id, string title, string details, Image image)
{
Id = id;
Title = title;
Details = details;
ItemImage = image;
} public int Id { get; set; } public string Title { get; set; } public string Details { get; set; } public Image ItemImage { get; set; } public void drawItem(DrawItemEventArgs e, Padding margin,
Font titleFont, Font detailsFont, StringFormat aligment,
Size imageSize)
{
// if selected, mark the background differently
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
e.Graphics.FillRectangle(Brushes.CornflowerBlue, e.Bounds);
}
else
{
e.Graphics.FillRectangle(Brushes.Beige, e.Bounds);
} // draw some item separator
e.Graphics.DrawLine(Pens.DarkGray, e.Bounds.X, e.Bounds.Y, e.Bounds.X + e.Bounds.Width, e.Bounds.Y); // draw item image
e.Graphics.DrawImage(ItemImage, e.Bounds.X + margin.Left, e.Bounds.Y + margin.Top, imageSize.Width,
imageSize.Height); // calculate bounds for title text drawing
var titleBounds = new Rectangle(e.Bounds.X + margin.Horizontal + imageSize.Width,
e.Bounds.Y + margin.Top,
e.Bounds.Width - margin.Right - imageSize.Width - margin.Horizontal,
(int) titleFont.GetHeight() + ); // calculate bounds for details text drawing
var detailBounds = new Rectangle(e.Bounds.X + margin.Horizontal + imageSize.Width,
e.Bounds.Y + (int) titleFont.GetHeight() + + margin.Vertical + margin.Top,
e.Bounds.Width - margin.Right - imageSize.Width - margin.Horizontal,
e.Bounds.Height - margin.Bottom - (int) titleFont.GetHeight() - -
margin.Vertical - margin.Top); // draw the text within the bounds
e.Graphics.DrawString(Title, titleFont, Brushes.Black, titleBounds, aligment);
e.Graphics.DrawString(Details, detailsFont, Brushes.DarkGray, detailBounds, aligment); // put some focus rectangle
e.DrawFocusRectangle();
}
} public partial class exListBox : ListBox
{
private readonly Font _detailsFont;
private readonly StringFormat _fmt;
private readonly Size _imageSize;
private readonly Font _titleFont; public exListBox(Font titleFont, Font detailsFont, Size imageSize,
StringAlignment aligment, StringAlignment lineAligment)
{
_titleFont = titleFont;
_detailsFont = detailsFont;
_imageSize = imageSize;
ItemHeight = _imageSize.Height + Margin.Vertical;
_fmt = new StringFormat();
_fmt.Alignment = aligment;
_fmt.LineAlignment = lineAligment;
_titleFont = titleFont;
_detailsFont = detailsFont;
} public exListBox()
{
InitializeComponent();
_imageSize = new Size(, );
ItemHeight = _imageSize.Height + Margin.Vertical;
_fmt = new StringFormat();
_fmt.Alignment = StringAlignment.Near;
_fmt.LineAlignment = StringAlignment.Near;
_titleFont = new Font(Font, FontStyle.Bold);
_detailsFont = new Font(Font, FontStyle.Regular);
} protected override void OnDrawItem(DrawItemEventArgs e)
{
// prevent from error Visual Designer
if (Items.Count > )
{
var item = (exListBoxItem) Items[e.Index];
item.drawItem(e, Margin, _titleFont, _detailsFont, _fmt, _imageSize);
}
} protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
}

DEMO

using System;
using System.Drawing;
using System.Windows.Forms; namespace testexListBox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
Image image1 = Image.FromFile(@"image1.jpg");
Image image2 = Image.FromFile(@"image2.jpg");
Image image3 = Image.FromFile(@"image3.jpg");
// exListBoxItem = int id, string title, string details, Image image
exListBox1.Items.Add(new exListBoxItem(, "John", "ICQ 56465464",image1));
exListBox1.Items.Add(new exListBoxItem(, "Bill","ICQ 56465464", image2));
exListBox1.Items.Add(new exListBoxItem(, "Peter", "ICQ 56465464",image3));
} private void exListBox1_DrawItem(object sender, DrawItemEventArgs e)
{
} private void exListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
Text = ((exListBoxItem) exListBox1.SelectedItem).Id.ToString();
}
}
}

带图标和多行显示的ListBox的更多相关文章

  1. C# ListBox 每行显示颜色设置

    使用ListBox时,每行显示不同的颜色 1.把AllowHtmlDraw属性设置为True 2.直接在Add或者AddRange里写标签 代码里用的是DEV插件里的ListBox,使用原生的也是一样 ...

  2. 【WPF】ListBox GridViewColumn Header 文字换行、文字多行显示

    ListBox GridViewColumn Header 文字换行.文字多行显示,在Header中需要换行的地方写 <GridViewColumn Header="空间另存 为总量& ...

  3. 【传】玩转Android---UI篇---ImageButton(带图标的按钮)

    原文网址:http://hualang.iteye.com/blog/964049 除了Android系统自带的Button按钮一万,还提供了带图标的按钮ImageButton 要制作带图标的按钮,首 ...

  4. CIconListBox带图标的列表框类

    有时候,我们需要在列表框ListBox中插入带图标的文字项,这就需要自己派生一个类出来了,网上的一个CIconListBox类还不错,网站http://www.codeguru.com/Cpp/con ...

  5. Android实现“是否退出”对话框和“带图标的列表”对话框

    今天我们学习的内容是实现两种对话框(Dialog),第一种是询问是否退出对话框,另外一种是带图标的列表对话框,程序的执行效果是,我们点击button1的时候,弹出第一种对话框,我们点击button2的 ...

  6. Android开源项目——带图标文字的底部导航栏IconTabPageIndicator

    接下来的博客计划是,在<Android官方技术文档翻译>之间会发一些Android开源项目的介绍,直接剩下的几篇Android技术文档发完,然后就是Android开源项目和Gradle翻译 ...

  7. POI 导出excel带小数点的数字格式显示不对解决方法

    最近看到了一个问题就是java导出excel中带小数点的数字显示不对, 比如我想在excel中第一行显示:  3,000.0 但是在excle中导出的格式总是不带小数点 3000(非文本格式),而且也 ...

  8. 【win】【qt5打包】【qt程序打包成一个可执行文件(带图标任何win都可以运行哦)】

    [前言] 业务需求将qt程序打包成win可执行文件.咱是做linux的,奈何用的麒麟系统,程序运行在win,好嘛,重新在win qtcreator编译后打包呗. [目标] 1.给qt程序添加一个图标. ...

  9. visual studio 编辑窗口 设置固定选项卡 使窗口选项卡多行显示

    工具>选项> 确定后 如图就可以多行显示了.

随机推荐

  1. 【题解】【P3383 【模板】线性筛素数】

    看完这篇博客你就懂了 原题链接 代码: #include<bits/stdc++.h> using namespace std; bool isPrime(int num) { if(nu ...

  2. Contos7 常用命令

    ```pythoncentos常用命令: 查看所有运行的单元:systemctl list-units 查看所有单元:systemctl list-units --all 查看所有启动的服务:syst ...

  3. Lucene03--字段属性

    Lucene03--字段属性 1.Field 1.1  Field相当于Javabean的属性. 1.2  不同的Field的构造方法参数不一样: 大多数Field的构造函数有三个参数: a)第一个参 ...

  4. Oracle将两张表的数据插入第三张表且第三张表中不存在

    1.由于是先查再插所以不能使用insert into table1() values(), 要使用insert into table1() select * table2,不能使用values. 2. ...

  5. NOIP2018初赛题解 提高组

  6. Samba与nfs与ftp

    Samba服务 samba是一个网络服务器,用于Linux和Windows之间共享文件. samba端口号 samba (启动时会预设多个端口) 数据传输的TCP端口 139.445 进行NetBIO ...

  7. python执行unittest界面设置

    执行单元测试时,系统会自动添加unittest in...的执行服务器. 执行时unittest in...的执行服务器在界面右上方可以看到,且执行结果为左侧框和右侧统计结果. 如果没有,会导致测试结 ...

  8. 把Asp.net Core程序代码部署到Ubuntu(不含数据库)

    今天记录一下第一次把.net core 程序发布到linux系统.linux用的是ubuntu Server 18.04版本.运行的IDE是vs 2019,发布出来是.net core 2.2版本. ...

  9. SQL数据同步到ElasticSearch(三)- 使用Logstash+LastModifyTime同步数据

    在系列开篇,我提到了四种将SQL SERVER数据同步到ES中的方案,本文将采用最简单的一种方案,即使用LastModifyTime来追踪DB中在最近一段时间发生了变更的数据. 安装Java 安装部分 ...

  10. Gordon家族(一)

    引子 Go语言的吉祥物是一只囊地鼠(gopher),由插画师Renee French设计,名叫Gordon,长得这个样子: 在Go官网上(https://golang.google.cn/)的Gord ...