带图标和多行显示的ListBox
源码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的更多相关文章
- C# ListBox 每行显示颜色设置
使用ListBox时,每行显示不同的颜色 1.把AllowHtmlDraw属性设置为True 2.直接在Add或者AddRange里写标签 代码里用的是DEV插件里的ListBox,使用原生的也是一样 ...
- 【WPF】ListBox GridViewColumn Header 文字换行、文字多行显示
ListBox GridViewColumn Header 文字换行.文字多行显示,在Header中需要换行的地方写 <GridViewColumn Header="空间另存 为总量& ...
- 【传】玩转Android---UI篇---ImageButton(带图标的按钮)
原文网址:http://hualang.iteye.com/blog/964049 除了Android系统自带的Button按钮一万,还提供了带图标的按钮ImageButton 要制作带图标的按钮,首 ...
- CIconListBox带图标的列表框类
有时候,我们需要在列表框ListBox中插入带图标的文字项,这就需要自己派生一个类出来了,网上的一个CIconListBox类还不错,网站http://www.codeguru.com/Cpp/con ...
- Android实现“是否退出”对话框和“带图标的列表”对话框
今天我们学习的内容是实现两种对话框(Dialog),第一种是询问是否退出对话框,另外一种是带图标的列表对话框,程序的执行效果是,我们点击button1的时候,弹出第一种对话框,我们点击button2的 ...
- Android开源项目——带图标文字的底部导航栏IconTabPageIndicator
接下来的博客计划是,在<Android官方技术文档翻译>之间会发一些Android开源项目的介绍,直接剩下的几篇Android技术文档发完,然后就是Android开源项目和Gradle翻译 ...
- POI 导出excel带小数点的数字格式显示不对解决方法
最近看到了一个问题就是java导出excel中带小数点的数字显示不对, 比如我想在excel中第一行显示: 3,000.0 但是在excle中导出的格式总是不带小数点 3000(非文本格式),而且也 ...
- 【win】【qt5打包】【qt程序打包成一个可执行文件(带图标任何win都可以运行哦)】
[前言] 业务需求将qt程序打包成win可执行文件.咱是做linux的,奈何用的麒麟系统,程序运行在win,好嘛,重新在win qtcreator编译后打包呗. [目标] 1.给qt程序添加一个图标. ...
- visual studio 编辑窗口 设置固定选项卡 使窗口选项卡多行显示
工具>选项> 确定后 如图就可以多行显示了.
随机推荐
- HTML认识二
<!doctype html> <html lang="en"><head> <meta charset="UTF-8" ...
- 使用Optional摆脱NPE的折磨
在目前的工作中,我对Java中的Stream和Lambda表达式都使用得很多,之前也写了两篇文章来总结对应的知识. 024:Java流实现Shell:cat 1.log | grep a | sort ...
- Jenkins+SVN+Maven+shell 自动化部署实践
JAVA环境中利用Jenkins+svn+maven进行自动化部署实践 一. 前言2 1.介绍jenkins2 1.本地项目打包2 2.通过secureCRT工具,手动传输到服务器2 3.然后 ...
- 聊聊Java String.intern 背后你不知道的知识
Java的 String类有个有意思的public方法: public String intern() 返回标准表示的字符串对象.String类维护私有字符串池. 调用此方法时,如果字符串池已经包含等 ...
- 详细记录登录过程的用户、IP地址、shell命令以及详细操作时间
将下面的代码添加到/etc/profile #history USER_IP=`>/dev/null|awk '{print $NF}'|sed -e 's/[()]//g'` HISTDIR= ...
- jekyll搭建个人博客1
目录 配置环境 使用模板 配置环境 简介 jekyll是一个简单的免费的,生成静态网页的工具,不需要数据库支持.但是可以配合第三方服务,例如Disqus.最关键的是jekyll可以免费部署在Githu ...
- py+selenium+IE10【IE已停止工作】【已解决】
问题:跑自动化时,到某个用例IE就崩,提示已停止工作. 手工跑的时候,IE挂,提示“Internet Explorer 已经为了帮助保护您的计算机而关闭此网页”. 且每次都在需要调用flash插件 ...
- asp core 配置用户密码验证
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; usi ...
- vs2010编译zapline-zapline.systemoptimization 注释工程中的//#define abs(value) (value >= 0 ? value : -(value))即可
vs2010编译zapline-zapline.systemoptimization-8428e72c88e0.zip出错 1>d:\program files (x86)\microsoft ...
- LiteDB源码解析系列(3)索引原理详解
在这一章,我们将了解LiteDB里面几个基本数据结构包括索引结构和数据块结构,我也会试着说明前辈数据之巅在博客中遇到的问题,最后对比mysql进一步深入了解LiteDB的索引原理. 1.LiteDB的 ...