279 lines
8.8 KiB
C#
279 lines
8.8 KiB
C#
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Windows.Forms;
|
|
|
|
namespace ryControls
|
|
{
|
|
public class TabList : ListView
|
|
{
|
|
private ColumnHeader columnHeader1;
|
|
|
|
public TabList() :
|
|
base()
|
|
{
|
|
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
|
|
this.OwnerDraw = true;//用于启用重绘
|
|
this.View = View.Tile;
|
|
this.TileSize = new Size(80,28);
|
|
this.Scrollable = false;
|
|
this.MultiSelect = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 图标
|
|
/// </summary>
|
|
public Image Icon { get; set; }
|
|
|
|
/// <summary>
|
|
/// 重绘图标
|
|
/// </summary>
|
|
public bool IsDrawIcon { get; set; }
|
|
|
|
/// <summary>
|
|
/// 重绘网格线
|
|
/// </summary>
|
|
public bool IsDrawGridLines { get; set; }
|
|
private int last_selectIndex = 0;
|
|
protected override void OnMouseUp(MouseEventArgs e)
|
|
{
|
|
var pt = this.PointToClient(e.Location);
|
|
var item = this.GetItemAt(pt.X, pt.Y);
|
|
if (item == null)
|
|
{
|
|
if (last_selectIndex < this.Items.Count)
|
|
{
|
|
this.Items[last_selectIndex].Selected = true;
|
|
}
|
|
}
|
|
}
|
|
protected override void OnItemSelectionChanged(ListViewItemSelectionChangedEventArgs e)
|
|
{
|
|
if(e.IsSelected)
|
|
{
|
|
last_selectIndex = e.ItemIndex;
|
|
base.OnItemSelectionChanged(e);
|
|
}
|
|
else
|
|
{
|
|
if ( last_selectIndex < this.Items.Count)
|
|
{
|
|
//this.Items[last_selectIndex].Selected = true;
|
|
}
|
|
}
|
|
}
|
|
protected override void OnSelectedIndexChanged(System.EventArgs e)
|
|
{
|
|
if(this.SelectedItems.Count>0)
|
|
{
|
|
base.OnSelectedIndexChanged(e);
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
protected override void OnDrawItem(DrawListViewItemEventArgs e)
|
|
{
|
|
Rectangle r = e.Bounds;
|
|
Graphics g = e.Graphics;
|
|
|
|
DrawSelectedBackground(e, g, r);
|
|
|
|
//if (IsDrawGridLines)
|
|
//{
|
|
// using (Pen pen = new Pen(Color.Gray))
|
|
// {
|
|
// g.DrawRectangle(pen, r.X, r.Y, r.Width, r.Height + 1);//高度加1使横向线条重叠
|
|
// }
|
|
//}
|
|
|
|
if (!string.IsNullOrEmpty(e.Item.Text))
|
|
{
|
|
this.DrawText(e, g, r);
|
|
}
|
|
}
|
|
private Color _SelectedStartBackColor = Color.LightSkyBlue;
|
|
/// <summary>
|
|
/// 选择项的背景开始颜色
|
|
/// </summary>
|
|
[Description("选择项的背景开始颜色")]
|
|
public Color SelectedStartBackColor
|
|
{
|
|
get
|
|
{
|
|
return _SelectedStartBackColor;
|
|
}
|
|
set
|
|
{
|
|
_SelectedStartBackColor = value;
|
|
this.Refresh();
|
|
}
|
|
}
|
|
private Color _SelectedEndBackColor = Color.FromArgb(255, 236, 181);
|
|
/// <summary>
|
|
/// 选择项的背景结束颜色
|
|
/// </summary>
|
|
[Description("选择项的背景结束颜色")]
|
|
public Color SelectedEndBackColor
|
|
{
|
|
get
|
|
{
|
|
return _SelectedEndBackColor;
|
|
}
|
|
set
|
|
{
|
|
_SelectedEndBackColor = value;
|
|
this.Refresh();
|
|
}
|
|
}
|
|
private Color _SelectedBorderColor = Color.FromArgb(229, 195, 101);
|
|
/// <summary>
|
|
/// 选择项的边框颜色
|
|
/// </summary>
|
|
[Description("选择项的边框颜色")]
|
|
public Color SelectedBorderColor
|
|
{
|
|
get
|
|
{
|
|
return _SelectedBorderColor;
|
|
}
|
|
set
|
|
{
|
|
_SelectedBorderColor = value;
|
|
this.Refresh();
|
|
}
|
|
}
|
|
private Color _SelectedForeColor = Color.Black;
|
|
/// <summary>
|
|
/// 选择项的字体颜色
|
|
/// </summary>
|
|
[Description("选择项的字体颜色")]
|
|
public Color SelectedForeColor
|
|
{
|
|
get
|
|
{
|
|
return _SelectedForeColor;
|
|
}
|
|
set
|
|
{
|
|
_SelectedForeColor = value;
|
|
this.Refresh();
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 重绘选中时背景
|
|
/// </summary>
|
|
private void DrawSelectedBackground(DrawListViewItemEventArgs e, Graphics g, Rectangle r)
|
|
{
|
|
if (e.Item.Selected)
|
|
{
|
|
//渐变画刷
|
|
LinearGradientBrush brush = new LinearGradientBrush(e.Bounds, _SelectedStartBackColor,
|
|
_SelectedEndBackColor, LinearGradientMode.Vertical);
|
|
//填充区域
|
|
//Rectangle borderRect = new Rectangle(r, e.Bounds.Y, e.Bounds.Width - 5, e.Bounds.Height - 2);
|
|
e.Graphics.FillRectangle(brush, r);
|
|
brush.Dispose();
|
|
////画边框
|
|
Pen pen = new Pen(_SelectedBorderColor);
|
|
Rectangle borderRect = r;
|
|
borderRect.Width--;
|
|
borderRect.Height--;
|
|
e.Graphics.DrawRectangle(pen, borderRect);
|
|
pen.Dispose();
|
|
//using (SolidBrush brush = new SolidBrush(_SelectedBackColor))
|
|
//{
|
|
// g.FillRectangle(brush, r);
|
|
//}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 重绘图标
|
|
/// </summary>
|
|
private Size DrawIcon(Graphics g, Rectangle r, Image image, Color backColor)
|
|
{
|
|
Rectangle imageBounds = new Rectangle(new Point(r.X+10, r.Y+3), new Size(64,64));
|
|
if (r.Width > r.Height-20)
|
|
{
|
|
imageBounds.Width = r.Height-20;
|
|
imageBounds.Height = r.Height - 20;
|
|
}
|
|
else
|
|
{
|
|
imageBounds.Width = r.Width - 20;
|
|
imageBounds.Height = r.Width - 20;
|
|
}
|
|
imageBounds.X = r.X + (r.Width - imageBounds.Width) / 2;
|
|
//使图标不会紧贴着每一列的左上角
|
|
//imageBounds.X += 1;
|
|
//imageBounds.Y += 1;
|
|
|
|
g.DrawImage(image, imageBounds);
|
|
return imageBounds.Size;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 重绘文本
|
|
/// </summary>
|
|
private void DrawText(DrawListViewItemEventArgs e, Graphics g, Rectangle r)
|
|
{
|
|
TextFormatFlags flags = GetFormatFlags(HorizontalAlignment.Center);
|
|
TextRenderer.DrawText(
|
|
g,
|
|
e.Item.Text,
|
|
e.Item.Font,
|
|
r,
|
|
e.Item.Selected?SelectedForeColor: e.Item.ForeColor,
|
|
flags);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取文本对齐
|
|
/// </summary>
|
|
private TextFormatFlags GetFormatFlags(
|
|
HorizontalAlignment align)
|
|
{
|
|
TextFormatFlags flags =
|
|
TextFormatFlags.EndEllipsis |
|
|
TextFormatFlags.VerticalCenter;
|
|
|
|
switch (align)
|
|
{
|
|
case HorizontalAlignment.Center:
|
|
flags |= TextFormatFlags.HorizontalCenter;
|
|
break;
|
|
case HorizontalAlignment.Right:
|
|
flags |= TextFormatFlags.Right;
|
|
break;
|
|
case HorizontalAlignment.Left:
|
|
flags |= TextFormatFlags.Left;
|
|
break;
|
|
}
|
|
|
|
return flags;
|
|
}
|
|
|
|
private void InitializeComponent()
|
|
{
|
|
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
|
this.SuspendLayout();
|
|
//
|
|
// columnHeader1
|
|
//
|
|
this.columnHeader1.Width = 10;
|
|
//
|
|
// IconViewEx
|
|
//
|
|
this.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
|
this.columnHeader1});
|
|
this.LabelWrap = false;
|
|
this.ShowItemToolTips = true;
|
|
this.TileSize = new System.Drawing.Size(60, 60);
|
|
this.View = System.Windows.Forms.View.Tile;
|
|
this.ResumeLayout(false);
|
|
|
|
}
|
|
}
|
|
} |