using AntdUI; using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace BallTest { public partial class BallLayeredForm : ILayeredFormOpacity { #region 属性 // 防误触阈值 private const int DRAG_THRESHOLD = 5; // 拖动相关变量 private Point? dragStartPoint = null; private bool isBeingDragged = false; private bool isClick = false; // 鼠标悬停状态 private bool isMouseOver = false; /// /// 菜单项列表 - 使用AntdUI控件 /// private AntdUI.IContextMenuStripItem[] menuItems; #region 颜色配置字段 - 封装颜色定义,便于自定义和修改 private Color _normalStartColor = Color.FromArgb(0, 128, 255); // 正常状态起始颜色 private Color _normalEndColor = Color.FromArgb(0, 75, 150); // 正常状态结束颜色 private Color _hoverStartColor = Color.FromArgb(0, 191, 255); // 悬停状态起始颜色 private Color _hoverEndColor = Color.FromArgb(0, 100, 200); // 悬停状态结束颜色 private Color _highlightColor1 = Color.White; // 主高光颜色 private int _highlightAlpha1 = 150; // 主高光透明度 private Color _highlightColor2 = Color.White; // 次高光颜色 private int _highlightAlpha2 = 100; // 次高光透明度 private Color _borderColor = Color.FromArgb(0, 50, 100); // 边框颜色 private int _borderAlpha = 120; // 边框透明度 private int _borderWidth = 2; // 边框宽度 // 颜色配置公共属性,便于外部自定义 // 添加DesignerSerializationVisibility特性以解决WFO1000警告 [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public Color NormalStartColor { get => _normalStartColor; set { _normalStartColor = value; Print(); } } [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public Color NormalEndColor { get => _normalEndColor; set { _normalEndColor = value; Print(); } } [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public Color HoverStartColor { get => _hoverStartColor; set { _hoverStartColor = value; Print(); } } [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public Color HoverEndColor { get => _hoverEndColor; set { _hoverEndColor = value; Print(); } } [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public Color HighlightColor1 { get => _highlightColor1; set { _highlightColor1 = value; Print(); } } [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public int HighlightAlpha1 { get => _highlightAlpha1; set { _highlightAlpha1 = value; Print(); } } [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public Color HighlightColor2 { get => _highlightColor2; set { _highlightColor2 = value; Print(); } } [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public int HighlightAlpha2 { get => _highlightAlpha2; set { _highlightAlpha2 = value; Print(); } } [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public Color BorderColor { get => _borderColor; set { _borderColor = value; Print(); } } [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public int BorderAlpha { get => _borderAlpha; set { _borderAlpha = value; Print(); } } [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] public int BorderWidth { get => _borderWidth; set { _borderWidth = value; Print(); } } #endregion #endregion #region 构造相关的方法 public BallLayeredForm() : base(255) { // 设置默认大小和位置 int size = 200; int x = Screen.PrimaryScreen.Bounds.Width / 2 - size / 2; int y = Screen.PrimaryScreen.Bounds.Height / 2 - size / 2; SetSize(size, size); SetLocation(x, y); // 同时设置Size和Location属性,确保窗体正确显示 Size = new Size(size, size); Location = new Point(x, y); // 设置为最顶层窗口,确保能看到 TopMost = true; // 初始化菜单项 InitializeMenuItems(); } public override bool UFocus => false; public override string name => nameof(BallLayeredForm); // 初始化菜单项 private void InitializeMenuItems() { string svg_back = "", svg_refresh = "", svg_save = "", svg_print = "", svg_laptop = "", svg_qr = "", svg_a = "", svg_fy = "", svg_add = "", svg_share = "", svg_about = ""; menuItems = new AntdUI.IContextMenuStripItem[] { new AntdUI.ContextMenuStripItem("返回", "Alt+向左键").SetIcon(svg_back), new AntdUI.ContextMenuStripItem("刷新", "Ctrl+R").SetIcon(svg_refresh), new AntdUI.ContextMenuStripItemDivider(), new AntdUI.ContextMenuStripItem("另存为", "Ctrl+S").SetIcon(svg_save), new AntdUI.ContextMenuStripItem("打印", "Ctrl+P").SetIcon(svg_print), new AntdUI.ContextMenuStripItemDivider(), new AntdUI.ContextMenuStripItem("发送标签页到你的设备").SetIcon(svg_laptop), new AntdUI.ContextMenuStripItem("为此页面创建QR代码").SetIcon(svg_qr), new AntdUI.ContextMenuStripItem("大声朗读", "Ctrl+Shift+U").SetIcon(svg_a), new AntdUI.ContextMenuStripItem("翻译为 中文(简体)").SetIcon(svg_fy), new AntdUI.ContextMenuStripItem("将页面添加到集锦").SetIcon(svg_add).SetSub( new AntdUI.ContextMenuStripItem("返回", "Alt+向左键").SetIcon(svg_back).SetSub( new AntdUI.ContextMenuStripItem("返回", "Alt+向左键").SetIcon(svg_back), new AntdUI.ContextMenuStripItem("刷新", "Ctrl+R").SetIcon(svg_refresh), new AntdUI.ContextMenuStripItemDivider(), new AntdUI.ContextMenuStripItem("另存为", "Ctrl+S").SetIcon(svg_save), new AntdUI.ContextMenuStripItem("打印", "Ctrl+P").SetIcon(svg_print) ), new AntdUI.ContextMenuStripItem("刷新", "Ctrl+R").SetIcon(svg_refresh), new AntdUI.ContextMenuStripItemDivider(), new AntdUI.ContextMenuStripItem("另存为", "Ctrl+S").SetIcon(svg_save), new AntdUI.ContextMenuStripItem("打印", "Ctrl+P").SetIcon(svg_print) ), new AntdUI.ContextMenuStripItemDivider(), new AntdUI.ContextMenuStripItem("共享").SetIcon(svg_share), new AntdUI.ContextMenuStripItem("关于").SetIcon(svg_about) }; } #endregion #region 鼠标相关事件 protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); // 窗口句柄创建后立即渲染 Print(); } public override Bitmap? PrintBit() { // 获取目标区域大小 var rect = TargetRect; var rectXY = TargetRectXY; // 创建一个与目标区域大小相同的位图,使用32位ARGB格式 var bitmap = new Bitmap(rect.Width, rect.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); using (var g = Graphics.FromImage(bitmap)) { // 设置高质量绘图选项 g.SmoothingMode = SmoothingMode.AntiAlias; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.PixelOffsetMode = PixelOffsetMode.HighQuality; // 清除背景(透明) g.Clear(Color.Transparent); // 绘制渐变圆球 int centerX = rect.Width / 2; int centerY = rect.Height / 2; int radius = Math.Min(centerX, centerY) - 10; // 根据鼠标状态选择渐变颜色 Color startColor = isMouseOver ? _hoverStartColor : _normalStartColor; Color endColor = isMouseOver ? _hoverEndColor : _normalEndColor; // 使用线性渐变,从左上角到右下角 using (var gradientBrush = new LinearGradientBrush( new Point(centerX - radius, centerY - radius), new Point(centerX + radius, centerY + radius), startColor, endColor)) { // 绘制圆形主体 g.FillEllipse(gradientBrush, centerX - radius, centerY - radius, radius * 2, radius * 2); // 添加多层次高光,增强立体感 // 主高光:左上角明亮的白色椭圆形高光(参考图片2) using (var highlightBrush1 = new SolidBrush(Color.FromArgb(_highlightAlpha1, _highlightColor1))) { int highlightWidth = radius * 3 / 2; int highlightHeight = radius * 3 / 4; g.FillEllipse(highlightBrush1, centerX - highlightWidth / 2, centerY - highlightHeight / 2 - radius / 6, highlightWidth, highlightHeight); } // 次高光:中心位置的白色高亮区 using (var highlightBrush2 = new SolidBrush(Color.FromArgb(_highlightAlpha2, _highlightColor2))) { int centerHighlightSize = radius * 2 / 3; g.FillEllipse(highlightBrush2, centerX - centerHighlightSize / 2, centerY - centerHighlightSize / 2, centerHighlightSize, centerHighlightSize); } // 调整边框:使用深蓝色边框,更精致 using (var pen = new Pen(Color.FromArgb(_borderAlpha, _borderColor), _borderWidth)) { g.DrawEllipse(pen, centerX - radius, centerY - radius, radius * 2, radius * 2); } } } return bitmap; } protected override void OnMouseEnter(EventArgs e) { isMouseOver = true; Print(); base.OnMouseEnter(e); } protected override void OnMouseLeave(EventArgs e) { isMouseOver = false; Print(); base.OnMouseLeave(e); } // 鼠标按下事件,开始拖动或显示右键菜单 protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.Button == MouseButtons.Left) { isClick = true; dragStartPoint = e.Location; // 更改光标样式 Cursor = Cursors.SizeAll; } else if (e.Button == MouseButtons.Right) { // 获取鼠标在屏幕上的位置 Point screenPos = PointToScreen(e.Location); // 显示AntdUI右键菜单 var config = new AntdUI.ContextMenuStrip.Config(new AntdUI.Target(this), item => { // 处理菜单项点击事件 //switch (item.Text) //{ // case "返回": // // 移动功能已通过拖动实现 // break; // case "刷新": // // IClose(true); // break; // case "关于": // break; //} AntdUI.Notification.open(this, item.Text, "AntdUI 作者人不错", TAlignFrom.Top); }, menuItems) { Location = screenPos, // 设置菜单位置为当前鼠标位置 TopMost = true }; AntdUI.ContextMenuStrip.open(config); } } // 鼠标移动事件,处理拖动 protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); // 处理拖动逻辑 if (dragStartPoint.HasValue) { int deltaX = e.X - dragStartPoint.Value.X; int deltaY = e.Y - dragStartPoint.Value.Y; // 检查是否超过防误触阈值 if (!isBeingDragged && (Math.Abs(deltaX) > DRAG_THRESHOLD || Math.Abs(deltaY) > DRAG_THRESHOLD)) { isBeingDragged = true; isClick = false; } if (isBeingDragged) { // 更新位置 var rect = TargetRect; int newX = rect.X + deltaX; int newY = rect.Y + deltaY; // 设置新位置 SetLocation(newX, newY); Location = new Point(newX, newY); // 使用PrintCache优化拖动性能 PrintCache(); } } } // 鼠标释放事件,结束拖动 protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); // 恢复默认光标 Cursor = DefaultCursor; // 处理点击事件 if (isClick && !isBeingDragged) { // 左键点击关闭窗口 if (e.Button == MouseButtons.Left) { //IClose(true); } } // 重置拖动状态 dragStartPoint = null; isBeingDragged = false; isClick = false; } protected override void OnMouseClick(MouseEventArgs e) { base.OnMouseClick(e); // 右键点击事件已由ContextMenuStrip处理 } #endregion } }