MonoGame自定义实时光标

时间:2014-06-01 10:47:40

标签: c# xna cursor mouse monogame

所以我想在鼠标进入游戏窗口时使用.cur文件中的自定义光标。我用SpriteBatch上的Draw做了这个,但是在Windows鼠标和绘图之间有一个延迟让它感到不安。

所以我做了我的研究(当然),我发现了这个:Adding a custom cursor in XNA/C#?

我接着第二个回答,因为我尝试过第一个回答。我遵循了本教程:http://allenwp.com/blog/2011/04/04/changing-the-windows-mouse-cursor-in-xna/

但是每次我尝试加载游标时都会遇到Win32Exception:找不到文件。我检了好几次。文件名和目录是正确的。但仍然IntPtr返回0.这是我用来调用文件:

Cursor myCursor = RealtimeCursor.LoadCustomCursor("Content\\Cursors\\cursor.cur");

这是我的RealtimeCursor课程:

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;

namespace Project_4
{
    static class RealtimeCursor
    {

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern IntPtr LoadCursorFromFile(string path);

        public static Cursor LoadCustomCursor(string path)
        {
            IntPtr hCurs = LoadCursorFromFile(path);
            if (hCurs == IntPtr.Zero) throw new Win32Exception();
                var curs = new Cursor(hCurs);
            // Note: force the cursor to own the handle so it gets released properly
            var fi = typeof(Cursor).GetField("ownHandle", BindingFlags.NonPublic | BindingFlags.Instance);
            fi.SetValue(curs, true);
            return curs;
        }
    }
}

我很乐意,如果有人能够在他的计算机上测试代码,并且可能会发现为什么User32.dll不会加载我的光标文件。如果您需要任何文件,请随时在评论中询问我。 :)再次感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

让我建议一种更简单的跨平台方法,而不是使用将您绑定到Windows的DllImport:

  1. 在WindowsDX上运行时,使用System.Windows.Forms.Cursor.Current设置自定义光标。

  2. 在WindowsGL,Linux或Mac上运行时,请使用OpenTK.NativeWindow.MouseCursor设置自定义光标。

  3. 您必须在项目中引用相关的程序集System.Windows.FormsOpenTK

    考虑在https://github.com/mono/MonoGame/issues处发出功能请求。 XNA中不存在此功能,但它可能足以直接添加到MonoGame。

答案 1 :(得分:0)

有一种更简单的方法可以执行以下操作。首先添加对System.Windows.Forms的引用,然后在Initialize方法中添加以下代码

Form form = (Form)Form.FromHandle(this.Window.Handle);
form.Cursor = Cursors.Hand;