/******************************************************************************
* SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。
* CopyRight (C) 2012-2023 ShenYongHua(沈永华).
* QQ群:56829229 QQ:17612584 EMail:SunnyUI@QQ.Com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 如果您使用此代码,请保留此说明。
******************************************************************************
* 文件名称: UIContextMenuStrip.cs
* 文件说明: 上下文菜单
* 当前版本: V3.1
* 创建日期: 2020-01-01
*
* 2020-01-01: V2.2.0 增加文件说明
* 2020-04-25: V2.2.4 更新主题配置类
* 2022-03-19: V3.1.1 重构主题配色
* 2023-10-17: V3.5.1 修正文字显示垂直居中
* 2023-10-17: V3.5.1 当右键菜单未绑定ImageList,并且ImageIndex>0时,将ImageIndex绑定为Symbol绘制
******************************************************************************/
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace Sunny.UI
{
public sealed class UIContextMenuStrip : ContextMenuStrip, IStyleInterface, IZoomScale
{
private ContextMenuColorTable ColorTable = new ContextMenuColorTable();
public UIContextMenuStrip()
{
Font = UIStyles.Font();
RenderMode = ToolStripRenderMode.Professional;
Renderer = new UIToolStripRenderer(ColorTable);
Version = UIGlobal.Version;
ColorTable.SetStyleColor(UIStyles.Blue);
BackColor = UIStyles.Blue.ContextMenuColor;
}
///
/// 禁止控件跟随窗体缩放
///
[DefaultValue(false), Category("SunnyUI"), Description("禁止控件跟随窗体缩放")]
public bool ZoomScaleDisabled { get; set; }
///
/// 控件缩放前在其容器里的位置
///
[Browsable(false), DefaultValue(typeof(Rectangle), "0, 0, 0, 0")]
public Rectangle ZoomScaleRect { get; set; }
///
/// 设置控件缩放比例
///
/// 缩放比例
public void SetZoomScale(float scale)
{
}
private float DefaultFontSize = -1;
public void SetDPIScale()
{
if (!UIDPIScale.NeedSetDPIFont()) return;
if (DefaultFontSize < 0) DefaultFontSize = this.Font.Size;
this.SetDPIScaleFont(DefaultFontSize);
}
protected override void OnOpening(CancelEventArgs e)
{
base.OnOpening(e);
SetDPIScale();
}
///
/// 自定义主题风格
///
[DefaultValue(false), Browsable(false)]
[Description("获取或设置可以自定义主题风格"), Category("SunnyUI")]
public bool StyleCustomMode { get; set; }
///
/// Tag字符串
///
[DefaultValue(null)]
[Description("获取或设置包含有关控件的数据的对象字符串"), Category("SunnyUI")]
public string TagString { get; set; }
///
/// 设置主题样式
///
/// 主题样式
private void SetStyle(UIStyle style)
{
if (!style.IsCustom())
{
SetStyleColor(style.Colors());
Invalidate();
}
_style = style == UIStyle.Inherited ? UIStyle.Inherited : UIStyle.Custom;
}
public void SetInheritedStyle(UIStyle style)
{
SetStyle(style);
_style = UIStyle.Inherited;
}
public void SetStyleColor(UIBaseStyle uiColor)
{
ColorTable.SetStyleColor(uiColor);
BackColor = uiColor.ContextMenuColor;
ForeColor = uiColor.ContextMenuForeColor;
}
public string Version { get; }
private UIStyle _style = UIStyle.Blue;
///
/// 主题样式
///
[DefaultValue(UIStyle.Blue), Description("主题样式"), Category("SunnyUI")]
public UIStyle Style
{
get => _style;
set => SetStyle(value);
}
public void CalcHeight()
{
if (Items.Count > 0 && !AutoSize)
{
int height = 0;
foreach (ToolStripItem item in Items)
{
height += item.Height;
}
Height = height + 4;
}
}
}
internal class UIToolStripRenderer : ToolStripProfessionalRenderer
{
public UIToolStripRenderer() { }
public UIToolStripRenderer(ProfessionalColorTable professionalColorTable) : base(professionalColorTable) { }
protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
{
//调整文本区域的位置和大小以实现垂直居中
Rectangle textRect = new Rectangle(e.TextRectangle.Left, e.Item.ContentRectangle.Top, e.TextRectangle.Width, e.Item.ContentRectangle.Height);
//设置文本绘制格式
TextFormatFlags flags = TextFormatFlags.VerticalCenter | TextFormatFlags.SingleLine;
//绘制文本
TextRenderer.DrawText(e.Graphics, e.Text, e.TextFont, textRect, e.TextColor, flags);
//当右键菜单未绑定ImageList,并且ImageIndex>0时,将ImageIndex绑定为Symbol绘制
ToolStripItem item = e.Item;
while (!(item.Owner is ContextMenuStrip))
{
if (item.Owner is ToolStripDropDownMenu)
item = item.OwnerItem;
}
ContextMenuStrip ownerContextMenu = item.Owner as ContextMenuStrip;
if (ownerContextMenu.ImageList != null) return;
if (e.Item.ImageIndex <= 0) return;
if (e.Item.Image != null) return;
Rectangle imageRect = new Rectangle(0, e.Item.ContentRectangle.Top, e.TextRectangle.Left, e.Item.ContentRectangle.Height);
e.Graphics.DrawFontImage(e.Item.ImageIndex, 24, e.TextColor, imageRect);
}
}
internal class ContextMenuColorTable : ProfessionalColorTable
{
private UIBaseStyle StyleColor = UIStyles.GetStyleColor(UIStyle.Blue);
public void SetStyleColor(UIBaseStyle color)
{
StyleColor = color;
}
public override Color MenuItemSelected => StyleColor.ContextMenuSelectedColor;
public override Color MenuItemPressedGradientBegin => StyleColor.ButtonFillPressColor;
public override Color MenuItemPressedGradientMiddle => StyleColor.ButtonFillPressColor;
public override Color MenuItemPressedGradientEnd => StyleColor.ButtonFillPressColor;
public override Color MenuBorder => StyleColor.ButtonRectColor;
public override Color MenuItemBorder => StyleColor.PrimaryColor;
public override Color ImageMarginGradientBegin => StyleColor.ContextMenuColor;
public override Color ImageMarginGradientEnd => StyleColor.ContextMenuColor;
public override Color ImageMarginGradientMiddle => StyleColor.ContextMenuColor;
}
}