代码之家  ›  专栏  ›  技术社区  ›  smack0007

更改winforms/.net中的光标热点

  •  8
  • smack0007  · 技术社区  · 15 年前

    我正在运行时从图像资源创建光标。新光标的热点始终设置为16x16(32x32图像)。是否可以在运行时更改热点,或者需要创建.cur文件?

    3 回复  |  直到 9 年前
        1
  •  24
  •   Nick    15 年前

    你当然可以。以下是我的实用程序功能,请根据需要进行编辑:)

        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);
        }
    
        2
  •  1
  •   Mark T    9 年前

    由于这是一个.NET问题,而不是一个C问题,下面是对Nick部分代码的vb.net转换(以节省其他人的麻烦)。

    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
    
        3
  •  0
  •   lc.    15 年前

    看一看 this post on MSDN . 似乎有两种可能的解决方案(使用p/invoke),您应该能够复制粘贴并使用它们。