VSoft/Source/VSoft_Dll/TabList.cs
zilinsoft c773aa54bc ## 📅2025-09-11 星期四更新
### DyLine    V2.0.2509.1101
- *.[改进]消息发送机制采用Unicode。
### VSoft    V2.0.2509.1101
- *.[新增]支持对启动软件设置是否开机启动。
- *.[改进]防止快速点击分类时激活拖放功能。
- *.[改进]主窗体软件版本号改为默认从VSoft.dll获取。
- *.[改进]针对调用流程软件的功能,直接通过主程序实现,提升打开速度。
- *.[修复]修复添加内置功能后不能直接打开,需要二次启动后才能打开的BUG。
- *.[修复]修复拖放文件到列表,图标可能无法正常显示的BUG。
- *.[修复]修复从桌面拖放到列表,图标无法马上显示的BUG。
- *.[修复]修改软件后缓存图标不会更新的BUG。
2025-09-11 10:19:51 +08:00

332 lines
11 KiB
C#

using Newtonsoft.Json.Bson;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.Serialization;
using System.Windows.Forms;
namespace ryControls
{
public class TabList : ListView
{
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;
this.SelectedIndexChanged += TabList_SelectedIndexChanged;
}
private void TabList_SelectedIndexChanged(object sender, System.EventArgs e)
{
//var selected_index = this.SelectedItems.Count == 0 ? -1 : this.SelectedItems[0].Index;
//if(selected_index>=0)
//{
// if (!this.Bounds.Contains(this.Items[selected_index].Bounds))
// {
// }
//}
}
/// <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;
}
}
}
//private List<TabItem> _Tabs { get; set; } = new List<TabItem>();
//public List<TabItem> Tabs {
// get
// {
// return _Tabs;
// }
// set
// {
// _Tabs = value;
// DrawTabs(false);
// }
//}
//private int TabStartIndex { get; set; } = 0;
//private void DrawTabs(bool clearList=true)
//{
// var selected_index = this.SelectedItems.Count == 0 ? -1 : this.SelectedItems[0].Index;
// if (clearList)
// {
// this.Items.Clear();
// for (int i = TabStartIndex; i < Tabs.Count; i++)
// {
// this.Items.Add(Tabs[i].Text).Tag = Tabs[i];
// }
// }
// else
// {
// for (int i = 0; i < this.Items.Count; i++)
// {
// var tab_index = TabStartIndex + i;
// if (tab_index < Tabs.Count)
// {
// this.Items[i].Text = Tabs[tab_index].Text;
// this.Items[i].Tag = Tabs[tab_index];
// }
// else
// {
// for (int m = this.Items.Count-1; m >=i; m--)
// {
// this.Items.RemoveAt(m);
// }
// break;
// }
// }
// }
// if(selected_index>=0 && this.Items.Count< selected_index)
// {
// this.Items[selected_index].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;
}
}
[Serializable]
public class TabItem
{
/// <summary>
/// 标题
/// </summary>
public string Text { get; set; } = "";
public int Id { get; set; } = -1;
public object Tag { get; set; } =null;
}
}