### DyLine V2.0.2509.1101 - *.[改进]消息发送机制采用Unicode。 ### VSoft V2.0.2509.1101 - *.[新增]支持对启动软件设置是否开机启动。 - *.[改进]防止快速点击分类时激活拖放功能。 - *.[改进]主窗体软件版本号改为默认从VSoft.dll获取。 - *.[改进]针对调用流程软件的功能,直接通过主程序实现,提升打开速度。 - *.[修复]修复添加内置功能后不能直接打开,需要二次启动后才能打开的BUG。 - *.[修复]修复拖放文件到列表,图标可能无法正常显示的BUG。 - *.[修复]修复从桌面拖放到列表,图标无法马上显示的BUG。 - *.[修复]修改软件后缓存图标不会更新的BUG。
332 lines
11 KiB
C#
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;
|
|
}
|
|
} |