如何自定义光标文件并将其添加到项目中?

Kha*_*laf 5 c# wpf mouse mouseover

快速提问:

我在一个Wpf应用程序上,我使用这个例程让鼠标悬停在我的Image上的光标形状改变:

private void mainGrid_MouseEnter(object sender, MouseEventArgs e)
{
    mainImage.Cursor = Cursors.Hand;
}

private void mainGrid_MouseLeave(object sender, MouseEventArgs e)
{
    mainImage.Cursor = Cursors.Arrow;
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

我怎样才能获得以下形状?

在此输入图像描述

我希望这可以简单地工作:

foreach (var finger in fingers.Skip(2)) { finger.Extend(); }
Run Code Online (Sandbox Code Playgroud)

但是没有..编程不起作用..

游标中没有我想要的形状:Cursors Class

Vis*_*ent 13

为了获得这样的游标,您需要获取(或创建)自定义游标.Windows中没有这样的游标.可以使用Visual Studio的图标内置图像编辑器来创建自己的光标.

创建自己的游标

  1. 首先打开Add New Item对话框.

    添加新项目


  1. 然后向下滚动并选择Cursor File,给它一个你选择的名称.

    在对话框中选择


  1. 它现在将在所谓的图像图像编辑器中打开您的新光标文件.现在你可以使用铅笔或任何其他不同的绘图工具开始绘图(图像也可以粘贴,但是你看到光标最初有1位颜色格式 - 这意味着只有两种颜色:黑色和白色.这可以通过添加新图像类型进行更改).

    你在读这些描述吗? :)


  1. 现在我们必须为光标指定一个热点.热点是图标中用于跟踪指针实际位置的位置(为简单起见,您可以将其称为光标的点击点).正常的Windows 7 Aero Arrow的热点位于(0,0) - 左上角.

    要指定光标的hots pot,我们必须使用Set Hot Spot Tool.然后单击要用作光标图标中热点的特定像素.对于这个光标,我选择了(9,8).

    设置热点工具

    将热点设置为(9,8):

    设置实际热点


  1. 保存所有内容,然后转到Solution Explorer,右键单击您的项目,然后按Properties.然后转到Resources选项卡并单击Add ResourceAdd Existing File....

    现在找到项目的文件夹,然后选择并打开光标文件.

    添加新资源

    选择光标文件


  1. 最后的非代码步骤是选择光标Solution Explorer,转到Properties窗格并设置Build ActionNone.这是为了防止它被编译的可执行文件添加两次,因为它已经作为资源添加.

    重要提示:不要对位于光标文件做这个Resources文件夹!

    为您的光标设置Build Action为None.


在应用程序中使用自定义光标

现在进入代码,实际上相当简单.由于您的光标现在被添加为字节数组资源,您只需将其加载到a中MemoryStream,然后将该内存流传递到Cursor类的构造函数中.为了简单和可读性,我将此代码放在另一个类中.

public static class CursorHelper
{
    public static Cursor FromByteArray(byte[] array)
    {
        using (MemoryStream memoryStream = new MemoryStream(array))
        {
            return new Cursor(memoryStream);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以继续在表单/控件/等级中将您的光标声明为类级别.你会准备好使用它!

private Cursor OpenHand = CursorHelper.FromByteArray(Properties.Resources.CursorOpenHand);

public MainWindow()
{
    InitializeComponent();
    this.Cursor = OpenHand;
}
Run Code Online (Sandbox Code Playgroud)

用法示例

我根据你的规格做了一个例子; 一只普通的张开手,当你按住鼠标时它会变成抓手:

private Cursor OpenHand = CursorHelper.FromByteArray(Properties.Resources.CursorOpenHand);
private Cursor GrabbingHand = CursorHelper.FromByteArray(Properties.Resources.CursorGrabbingHand);

public MainWindow()
{
    InitializeComponent();
    this.Cursor = OpenHand;
    this.MouseDown += this.MainWindow_MouseDown;
    this.MouseUp += this.MainWindow_MouseUp;
}

private void MainWindow_MouseDown(object sender, MouseEventArgs e)
{
    ((Control)sender).Cursor = GrabbingHand;
}

private void MainWindow_MouseUp(object sender, MouseEventArgs e)
{
    ((Control)sender).Cursor = OpenHand;
}
Run Code Online (Sandbox Code Playgroud)

利润!

自定义光标的动画


以下是我使用的游标: