WPF 和自定义游标

本文关键字:游标 自定义 WPF | 更新日期: 2023-09-27 18:35:47

我想在我的 WPF 应用程序中设置自定义游标。最初我有一个.png文件,我将其转换为.ico,但由于我没有找到任何方法将.ico文件设置为 WPF 中的光标,因此我尝试使用适当的.cur文件执行此操作。

我使用Visual Studio 2013(新项->光标文件)创建了这样一个.cur文件。光标是彩色 24 位图像,其生成类型为"资源"。

我通过以下方式获取资源流:

var myCur = Application.GetResourceStream(new Uri("pack://application:,,,/mycur.cur")).Stream;

此代码能够检索流,因此myCur不是 NULL

尝试使用 创建游标时

var cursor = new System.Windows.Input.Cursor(myCur);

返回默认游标Cursors.None,而不是我的自定义游标。所以这似乎有问题。

谁能告诉我为什么 .ctor 我的光标流有问题?该文件是使用 VS2013 本身创建的,因此我假设.cur文件的格式正确。或者:如果有人知道如何在 WPF 中加载.ico文件作为光标,我会非常高兴和感激。

编辑:刚刚尝试使用VS2013(8bpp)中的全新.cur文件进行相同的操作,以防添加新调色板已破坏图像格式。相同的结果。System.Windows.Input.Cursor的.ctor甚至无法从"新鲜"光标文件创建正确的光标。

WPF 和自定义游标

本质上你必须使用 win32 方法CreateIconIndirect

// FROM THE ABOVE LINK
public class CursorHelper
{
    private struct IconInfo
    {
        public bool fIcon;
        public int xHotspot;
        public int yHotspot;
        public IntPtr hbmMask;
        public IntPtr hbmColor;
    }
    [DllImport("user32.dll")]
    private static extern IntPtr CreateIconIndirect(ref IconInfo icon);
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);

    public static Cursor CreateCursor(System.Drawing.Bitmap bmp, int xHotSpot, int yHotSpot)
    {
        IconInfo tmp = new IconInfo();
        GetIconInfo(bmp.GetHicon(), ref tmp);
        tmp.xHotspot = xHotSpot;
        tmp.yHotspot = yHotSpot;
        tmp.fIcon = false;
        IntPtr ptr = CreateIconIndirect(ref tmp);
        SafeFileHandle handle = new SafeFileHandle(ptr, true);
        return CursorInteropHelper.Create(handle);
    }
}

这正是我所做的,它似乎工作正常。我刚刚将其添加到Visual Studio 2013中我的项目下的"图像"文件夹中。也许它无法解析您的 URI?

    Cursor paintBrush = new Cursor(
        Application.GetResourceStream(new Uri("Images/paintbrush.cur", UriKind.Relative)).Stream
        );

示例光标(对我有用):http://www.rw-designer.com/cursor-detail/67894