所以我想在鼠标进入游戏窗口时使用.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不会加载我的光标文件。如果您需要任何文件,请随时在评论中询问我。 :)再次感谢您的帮助。
答案 0 :(得分:3)
让我建议一种更简单的跨平台方法,而不是使用将您绑定到Windows的DllImport:
在WindowsDX上运行时,使用System.Windows.Forms.Cursor.Current设置自定义光标。
在WindowsGL,Linux或Mac上运行时,请使用OpenTK.NativeWindow.MouseCursor设置自定义光标。
您必须在项目中引用相关的程序集System.Windows.Forms
或OpenTK
。
考虑在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;