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甚至无法从"新鲜"光标文件创建正确的光标。
本质上你必须使用 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