【问题标题】:C# Embed Custom CursorC# 嵌入自定义光标
【发布时间】:2020-11-10 05:42:13
【问题描述】:

我在这方面花了很长时间,而且我几乎做到了。然而,我遇到了最后一个问题,它真的开始深入我的皮肤。我无法将自定义光标嵌入到我的应用程序中...

我目前正在使用以下方法将光标更改为我在解决方案资源管理器中拥有的自定义光标。它是“MyCursor.cur”,它是一个嵌入式资源,我已将“复制到输出目录”设置为“如果更新则复制”。这是我用来设置光标的代码:

public static Cursor ActuallyLoadCursor(String path)
{
    return new Cursor(LoadCursorFromFile(path));
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr LoadCursorFromFile(string fileName);

在我的表单构造函数中:

Cursor = ActuallyLoadCursor("MyCursor.cur");

这是我加载光标并在我的应用程序中使用它的唯一方法。但是,这会将光标复制到与程序相同的文件夹中。我在网上搜索了几个小时没有运气。有什么方法可以做到这一点而不被复制并且没有一千行不必要的代码?

这是我尝试过的其他解决方案,但对我来说都失败了:

using (MemoryStream ms = new MemoryStream(Properties.Resources.MyCursor))
{
    Cursor = new Cursor(ms);
}

Cursor = new Cursor(Assembly.GetExecutingAssembly().GetManifestResourceStream("My_Namespace.MyCursor.cur"));

这些结果:

图像格式无效。图像文件可能已损坏。 参数名称:流

【问题讨论】:

    标签: c# resources cursor


    【解决方案1】:

    您确定您的光标格式正确吗?它是普通的 32x32、1 位非动画光标(例如,使用 Visual Studio 中的光标编辑器创建)?根据documentationCursor 类只支持最基本的光标格式——动画/彩色光标只能使用 Windows API 加载。

    我问是因为我刚刚在 VS 2012 中创建了一个新的 Windows 窗体项目,添加了一个新光标,将光标添加到资源中,然后使用了以下代码:

    Cursor oC;
    
    using ( MemoryStream oMS = new MemoryStream ( Properties.Resources.Cursor1 ) )
    {
        oC = new Cursor ( oMS );
    
        this.Cursor = oC;
    }
    

    这很好用 - 没有错误。 (this是上面代码中的形式。)

    如果您的光标是彩色的,您仍然可以将其作为资源嵌入,但您必须先将其保存到磁盘,然后才能使用LoadCursorFromFile 加载它。不要将光标保存在您的可执行文件旁边 - 如果它不是从用户的配置文件文件夹运行,您可能没有在该文件夹中创建新文件所需的权限。在用户的临时文件夹中生成一个临时文件名(使用Path.GetTempFileName)并将光标数据保存在那里 - 一旦加载了光标,您就可以删除该文件。

    【讨论】:

    • 这会引发与上面相同的错误。尽管它不是 1 位光标,也不是使用 Visual Studio 中的光标编辑器创建的。我该怎么做?
    • @Dragonphase 我刚刚编辑了我的答案 - 如果你有一个彩色光标,你不能使用 Cursor 类 - 你必须使用 API。
    • 不管怎样,我不知道如何使用光标编辑器。我唯一能用的就是放大镜。 - NVM,控件被隐藏
    • @Dragonphase 哦,光标上方有一个工具栏。这相当令人困惑 - 寻找一个粗铅笔图标来开始绘图。您只能在图标绘图左侧的窗口中选择颜色。工具栏仅在您打开光标时显示
    【解决方案2】:

    我的解决方案没有使用任何库...

    这部分需要添加到课程的开头:

    public static System.Windows.Forms.Cursor ActuallyLoadCursor(System.String path) {
            return new System.Windows.Forms.Cursor(LoadCursorFromFile(path));
    }
    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    private static extern System.IntPtr LoadCursorFromFile(string path);
    

    在绘图部分调用它:

    this.Cursor = ActuallyLoadCursor(System.AppDomain.CurrentDomain.BaseDirectory+@"..\..\Resources\cursor.cur");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多