【WPF】自定义鼠标样式

复制代码
 /// <summary>
    /// This class allow you create a Cursor form a Bitmap
    /// </summary>
    internal class BitmapCursor : SafeHandle
    {
        public override bool IsInvalid
        {
            get
            {
                return handle == (IntPtr)(-1);
            }
        }

        public static Cursor CreateBmpCursor(Bitmap cursorBitmap)
        {
            var c = new BitmapCursor(cursorBitmap);
            return CursorInteropHelper.Create(c);
        }

        public static Bitmap BitmapSourceToBitmap(BitmapSource source)
        {
            using (var stream = new MemoryStream())
            {
                var e = new BmpBitmapEncoder();
                e.Frames.Add(BitmapFrame.Create(source));
                e.Save(stream);
                var bmp = new Bitmap(stream);
                return bmp;
            }
        }

        protected BitmapCursor(Bitmap cursorBitmap)
            : base((IntPtr)(-1), true)
        {
            handle = cursorBitmap.GetHicon();
        }

        protected override bool ReleaseHandle()
        {
            bool result = DestroyIcon(handle);

            handle = (IntPtr)(-1);

            return result;
        }

        private static Cursor CreateMyCursor()
        {
            const int w = 25;
            const int h = 25;
            const int f = 4;

            var bmp = new Bitmap(w, h);

            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;

            var pen = new Pen(Brushes.Black, 2.0F);

            g.DrawEllipse(pen, new Rectangle(f, f, w - 2 * f, w - 2 * f));

            g.Flush();
            g.Dispose();
            pen.Dispose();

            return BitmapCursor.CreateBmpCursor(bmp);
        }

        [DllImport("user32")]
        private static extern bool DestroyIcon(IntPtr hIcon);
    }
复制代码

 

WPF 中每个光标通过一个System.Windows.Input.Cursor表示,获取Cursor对象的最简单方法是使用Cursor类(位于System.Windows.Input名称空间)的静态属性。

如:

this.Cursor=Cursors.wait;  或<Button Cursor="wait">help</Button>

但是有一个例外,通过使用ForceCursor属性,父元素会覆盖子元素的光标位置,当把该属性设置为true时,会忽略子元素的Cursor属性,并且父元素的光标会被应用到内部的所有内容。

为了移除应用程序范围的光标覆盖设置,需要将Mouse.OverrideCursor属性设置为null

 

posted on   梦琪小生  阅读(2174)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示