如何创建从位图对象Cursor对象? [重复](How do I create a Cursor

2019-10-18 06:39发布

这个问题已经在这里有一个答案:

  • 我怎么能与位图中的winform代替光标 2个回答

假设我有一个现有的System.Drawing.Bitmap对象,我该如何创建一个System.Windows.Forms.Cursor具有相同的像素数据作为我的目标Bitmap对象吗?

Answer 1:

这个答案是取自这个问题 。 它允许你创建都从位图对象光标并设置其热点。

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);
}

编辑 :正如评论,当指出Cursor是从创建IntPtr句柄,处置除非你释放自己使用手动光标将不会释放手柄本身,这将创建一个内存泄漏DestroyIcon功能:

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

然后你可以这样调用该函数:

DestroyIcon(myCursor.Handle);


文章来源: How do I create a Cursor object from a Bitmap object? [duplicate]