首页后端开发其他后端知识如何在.net桌面程序中自定义鼠标光标,有哪些方法

如何在.net桌面程序中自定义鼠标光标,有哪些方法

时间2024-03-24 04:06:03发布访客分类其他后端知识浏览1066
导读:今天这篇给大家分享的知识是“如何在.net桌面程序中自定义鼠标光标,有哪些方法”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,因此分享发大家做个参考,下文的讲解详细,步骤过程清晰,希望这篇“如何在.net桌面程序中自定义鼠标光标,有...
今天这篇给大家分享的知识是“如何在.net桌面程序中自定义鼠标光标,有哪些方法”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,因此分享发大家做个参考,下文的讲解详细,步骤过程清晰,希望这篇“如何在.net桌面程序中自定义鼠标光标,有哪些方法”文章能帮助大家解决问题。
  

有的时候,一个自定义的鼠标光标能给你的程序增色不少。本文这里介绍一下如何在.net桌面程序中自定义鼠标光标。由于.net的桌面程序分为WinForm和WPF两种,这里分别介绍一下。

WinForm程序

对于WinForm程序,可以通过修改Control.Cursor属性来实现光标的修改,如果我们有光标文件的话,可以直接通过如下代码实现自定义光标:

this.Cursor = new Cursor("myCursor.cur");

但这种方式不是本文介绍的重点,本文主要介绍如何自己绘制光标,这样则具有更多的可控性和灵活性。

创建一个自定义光标,首先需要定义需要一个光标结构ICONINFO,它的.net版本如下:

    public struct IconInfo
    {
    
        public bool fIcon;
    
        public int xHotspot;
    
        public int yHotspot;
    
        public IntPtr hbmMask;
    
        public IntPtr hbmColor;

    }

然后通过GetIconInfoandCreateIconIndirect两个函数来合成光标。完整代码如下:

    public class CursorHelper
    {

        static class NativeMethods
        {

            public struct IconInfo
            {
    
                public bool fIcon;
    
                public int xHotspot;
    
                public int yHotspot;
    
                public IntPtr hbmMask;
    
                public IntPtr hbmColor;

            }
    

            [DllImport("user32.dll")]
            public static extern IntPtr CreateIconIndirect(ref IconInfo icon);
    


            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);

        }


        public static Cursor CreateCursor(Bitmap bmp, int xHotSpot, int yHotSpot)
        {

            var icon = new NativeMethods.IconInfo
            {

                xHotspot = xHotSpot,
                yHotspot = yHotSpot,
                fIcon = false
            }
    ;
    

            NativeMethods.GetIconInfo(bmp.GetHicon(), ref icon);
    
            return new Cursor(NativeMethods.CreateIconIndirect(ref icon));

        }

    }

测试代码为:

    using (Bitmap bitmap = new Bitmap(21, 26))
    using (Graphics g = Graphics.FromImage(bitmap))
    {
    
        g.DrawRectangle(Pens.Red, 0, 0, 20, 25);
    
        this.Cursor = CursorHelper.CreateCursor(bitmap, 3, 3);

    }

WPF程序

至于WPF程序,和WinForm程序是非常类似的,一方面,它也可以通过光标文件来实现写入Cursor属性来自定义光标文件。

至于自己绘制光标,上面的代码基本上也是可以复用的,不过相对的要重新封装一下,完整代码如下:

    public class CursorHelper
    {

        static class NativeMethods
        {

            public struct IconInfo
            {
    
                public bool fIcon;
    
                public int xHotspot;
    
                public int yHotspot;
    
                public IntPtr hbmMask;
    
                public IntPtr hbmColor;

            }
    

            [DllImport("user32.dll")]
            public static extern SafeIconHandle CreateIconIndirect(ref IconInfo icon);
    

            [DllImport("user32.dll")]
            public static extern bool DestroyIcon(IntPtr hIcon);
    

            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);

        }


        [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
        class SafeIconHandle : SafeHandleZeroOrMinusOneIsInvalid
        {

            public SafeIconHandle()
                : base(true)
            {

            }


            protected override bool ReleaseHandle()
            {
    
                return NativeMethods.DestroyIcon(handle);

            }

        }


        static Cursor InternalCreateCursor(System.Drawing.Bitmap bitmap, int xHotSpot, int yHotSpot)
        {

            var iconInfo = new NativeMethods.IconInfo
            {

                xHotspot = xHotSpot,
                yHotspot = yHotSpot,
                fIcon = false
            }
    ;
    

            NativeMethods.GetIconInfo(bitmap.GetHicon(), ref iconInfo);
    

            var cursorHandle = NativeMethods.CreateIconIndirect(ref iconInfo);
    
            return CursorInteropHelper.Create(cursorHandle);

        }


        public static Cursor CreateCursor(UIElement element, int xHotSpot = 0, int yHotSpot = 0)
        {
    
            element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
    
            element.Arrange(new Rect(new Point(), element.DesiredSize));
    

            var renderTargetBitmap = new RenderTargetBitmap(
                (int)element.DesiredSize.Width, (int)element.DesiredSize.Height,
                96, 96, PixelFormats.Pbgra32);
    

            renderTargetBitmap.Render(element);
    

            var encoder = new PngBitmapEncoder();
    
            encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));


            using (var memoryStream = new MemoryStream())
            {
    
                encoder.Save(memoryStream);

                using (var bitmap = new System.Drawing.Bitmap(memoryStream))
                {
    
                    return InternalCreateCursor(bitmap, xHotSpot, yHotSpot);

                }

            }

        }

    }
    

需要注意的是,由于使用的System.Drawing.BitMap,是需要引用System.Drawing.dll的

封装之后,是可以直接传入UIElement作为自绘制的光标的,得益于WPF的强大绘图功能,是可以非常容易的绘制漂亮的光标的。测试代码如下:

this.Cursor= CursorHelper.CreateCursor(new UserControl1());
    



以上就是关于如何在.net桌面程序中自定义鼠标光标,有哪些方法的介绍啦,需要的朋友可以参考上述内容,希望对大家有帮助,想要了解更多,欢迎关注网络,小编将为大家输出更多高质量的实用文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 如何在.net桌面程序中自定义鼠标光标,有哪些方法
本文地址: https://pptw.com/jishu/651808.html
数组的定义有什么方法,php中有哪些方法 InnoDB的逻辑存储结构是什么,表空间组成包括哪些?

游客 回复需填写必要信息