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; } /// /// 图标 /// public Image Icon { get; set; } /// /// 重绘图标 /// public bool IsDrawIcon { get; set; } /// /// 重绘网格线 /// 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; /// /// 选择项的背景开始颜色 /// [Description("选择项的背景开始颜色")] public Color SelectedStartBackColor { get { return _SelectedStartBackColor; } set { _SelectedStartBackColor = value; this.Refresh(); } } private Color _SelectedEndBackColor = Color.FromArgb(255, 236, 181); /// /// 选择项的背景结束颜色 /// [Description("选择项的背景结束颜色")] public Color SelectedEndBackColor { get { return _SelectedEndBackColor; } set { _SelectedEndBackColor = value; this.Refresh(); } } private Color _SelectedBorderColor = Color.FromArgb(229, 195, 101); /// /// 选择项的边框颜色 /// [Description("选择项的边框颜色")] public Color SelectedBorderColor { get { return _SelectedBorderColor; } set { _SelectedBorderColor = value; this.Refresh(); } } private Color _SelectedForeColor = Color.Black; /// /// 选择项的字体颜色 /// [Description("选择项的字体颜色")] public Color SelectedForeColor { get { return _SelectedForeColor; } set { _SelectedForeColor = value; this.Refresh(); } } /// /// 重绘选中时背景 /// 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); //} } } /// /// 重绘图标 /// 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; } /// /// 重绘文本 /// 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); } /// /// 获取文本对齐 /// 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); } } }