带图标和多行显示的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 编辑窗口 设置固定选项卡 使窗口选项卡多行显示
工具>选项> 确定后 如图就可以多行显示了.
随机推荐
- ES6中的解构
数组中的解构: 输出 : 白板 幺鸡 二条 对象的解构: 输出: 老王 12 数组的结构用[];对象的解构用{}:一定要区分它是数组还是解构. 区分方法:看 它是在赋值还是在拿值,等号左边,都为解构, ...
- 组件--button详解
一.wxss尺寸单位rpx rpx(responsive pixel): 可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx. 严格按照XML语法. 二.icon 图标组件 <!--index ...
- MyBatis select标签的用法
From<MyBatis从入门到精通> 第一步,在接口中添加方法: public interface UserMapper { SysUser selectById(Long id); } ...
- MLlib特征变换方法
Spark1.6.2.2.3 PCA 算法介绍: 主成分分析是一种统计学方法,它使用正交转换从一系列可能相关的变量中提取线性无关变量集,提取出的变量集中的元素称为主成分.使用PCA方法可以对变量集合进 ...
- 小白之入口即化——十分钟看懂while循环,字符串格式化,运算符
while循环 while循环-死循环 while空格+条件+冒号 缩进+循环体 3.打断死循环 break--终止当前循环 while True: print(123) print(234) bre ...
- MySql的数据库优化到底优啥了都??(2)
嘟嘟在写此篇文章之前心里先默念(简单,通俗,工整)*10 吟唱完了,进入正题 3.Memory存储引擎 除了存放一个表结构相关信息的.frm文件在磁盘上,其他数据都存储在内存中.说白点哪天你数据库死机 ...
- C#3.0新增功能07 查询表达式
连载目录 [已更新最新开发文章,点击查看详细] 查询是什么及其作用是什么 查询是一组指令,描述要从给定数据源(或源)检索的数据以及返回的数据应具有的形状和组织. 查询与它生成的结果不同. 通常情 ...
- C#3.0新增功能10 表达式树 02 说明
连载目录 [已更新最新开发文章,点击查看详细] 表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构.表达式树和 Roslyn API 中用于生成分析器和 Cod ...
- 使用 Spring Framework 时常犯的十大错误
Spring 可以说是最流行的 Java 框架之一,也是一只需要驯服的强大野兽.虽然它的基本概念相当容易掌握,但成为一名强大的 Spring 开发者仍需要很多时间和努力. 在本文中,我们将介绍 Spr ...
- 2019杭电多校第二场hdu6601 Keen On Everything But Triangle
Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...