Change Cursor HotSpot in WinForms / .NET

后端 未结 3 2034
予麋鹿
予麋鹿 2020-12-03 15:24

I\'m creating a cursor at runtime from a image resource. The HotSpot of the new Cursor is always set to 16x16 (32x32 image). Is it possible to change the HotSpot at runtime

相关标签:
3条回答
  • 2020-12-03 16:00

    Take a look at this post on MSDN. There seem to be a couple possible solutions (using P/Invoke) which you should be able to copy-paste and use.

    0 讨论(0)
  • 2020-12-03 16:04

    Since this is a .NET question and not specifically a C# question, here is a VB.NET conversion of part of Nick's code (to save others the trouble).

    Module IconUtility
    Structure IconInfo
        Public fIcon As Boolean
        Public xHotspot As Integer
        Public yHotspot As Integer
        Public hbmMask As IntPtr
        Public hbmColor As IntPtr
    End Structure
    
    Private Declare Function GetIconInfo Lib "user32.dll" (hIcon As IntPtr, ByRef pIconInfo As IconInfo) As Boolean
    Private Declare Function CreateIconIndirect Lib "user32.dll" (ByRef icon As IconInfo) As IntPtr
    
    ' Create a cursor from a bitmap without resizing and with the specified hot spot
    Public Function CreateCursorNoResize(bmp As System.Drawing.Bitmap, xHotSpot As Integer, yHotSpot As Integer) As Cursor
        Dim ptr As IntPtr = bmp.GetHicon
        Dim tmp As IconInfo = New IconInfo()
        GetIconInfo(ptr, tmp)
        tmp.xHotspot = xHotSpot
        tmp.yHotspot = yHotSpot
        tmp.fIcon = False
        ptr = CreateIconIndirect(tmp)
        Return New Cursor(ptr)
    End Function
    End Module
    
    0 讨论(0)
  • 2020-12-03 16:11

    You sure can. Here are my utility functions, edit as you see fit :)

        public struct IconInfo
        {
            public bool fIcon;
            public int xHotspot;
            public int yHotspot;
            public IntPtr hbmMask;
            public IntPtr hbmColor;
        }
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
        [DllImport("user32.dll")]
        public static extern IntPtr CreateIconIndirect(ref IconInfo icon);
    
        /// <summary>
        /// Create a cursor from a bitmap without resizing and with the specified
        /// hot spot
        /// </summary>
        public static Cursor CreateCursorNoResize(Bitmap bmp, int xHotSpot, int yHotSpot)
        {
            IntPtr ptr = bmp.GetHicon();
            IconInfo tmp = new IconInfo();
            GetIconInfo(ptr, ref tmp);
            tmp.xHotspot = xHotSpot;
            tmp.yHotspot = yHotSpot;
            tmp.fIcon = false;
            ptr = CreateIconIndirect(ref tmp);
            return new Cursor(ptr);
        }
    
    
        /// <summary>
        /// Create a 32x32 cursor from a bitmap, with the hot spot in the middle
        /// </summary>
        public static Cursor CreateCursor(Bitmap bmp)
        {
            int xHotSpot = 16;
            int yHotSpot = 16;
    
            IntPtr ptr = ((Bitmap)ResizeImage(bmp, 32, 32)).GetHicon();
            IconInfo tmp = new IconInfo();
            GetIconInfo(ptr, ref tmp);
            tmp.xHotspot = xHotSpot;
            tmp.yHotspot = yHotSpot;
            tmp.fIcon = false;
            ptr = CreateIconIndirect(ref tmp);
            return new Cursor(ptr);
        }
    
    0 讨论(0)
提交回复
热议问题