WPF和自定义游标

时间:2015-01-01 19:39:06

标签: c# wpf cursor

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

我使用Visual Studio 2013(New Item - > Cursor File)创建了这样的.cur文件。光标是彩色的24位图像,其构建类型为“资源”。

我用这个来获取资源流:

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

此代码可以检索流,因此myCur NOT null aferwards。

尝试使用

创建光标时
var cursor = new System.Windows.Input.Cursor(myCur);

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

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

编辑:刚刚尝试使用VS2013(8bpp)的全新.cur文件,以防添加新的调色板搞砸了图像格式。结果相同。 System.Windows.Input.Cursor的.ctor甚至无法从'新'光标文件创建正确的光标。

2 个答案:

答案 0 :(得分:3)

注意: Custom cursor in 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);
    }
}

答案 1 :(得分:2)

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

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

样本光标(适用于我):http://www.rw-designer.com/cursor-detail/67894