首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 設置鼠標為自定義圖片光標:.cur 文件與資源流加載

     編輯:關於C#

一、最簡單用法:文件路徑構造

private void btnSetCursor_Click(object sender, EventArgs e) {
    // 相對路徑(相對輸出目錄)或絕對路徑
    this.Cursor = new Cursor("custom_cursor.cur");
}

要求:.cur 文件設置「複製到輸出目錄」→「始終複製」或「較新時複製」。

二、從嵌入資源加載(無外部文件依賴)

  1. 將 .cur 文件添加到項目,屬性「生成操作」設置為「嵌入資源」。
  2. 代碼加載:
private void SetCursorFromResource() {
    string resourceName = "MyNamespace.Cursors.custom_cursor.cur"; // 默認命名空間+路徑
    using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
        if (stream != null) {
            this.Cursor = new Cursor(stream);
        } else {
            MessageBox.Show($"資源未找到: {resourceName}\n可用資源: {string.Join(", ", Assembly.GetExecutingAssembly().GetManifestResourceNames())}");
        }
    }
}

三、從字節數組/內存流加載

private void SetCursorFromBytes(byte[] cursorData) {
    using (MemoryStream ms = new MemoryStream(cursorData)) {
        this.Cursor = new Cursor(ms);
    }
}

四、關鍵限制與注意事項

  • 僅支持 .cur 格式:不支持 .ani(動畫)、.ico、.png 等。需動畫光標請用 API 方案。
  • 熱點:.cur 文件內嵌熱點坐標(點擊生效點),不可代碼指定。制作光標時務必正確設置熱點(通常為尖端/中心)。
  • 尺寸限制:Windows 建議 32×32 像素,支持 16×16、48×48、64×64,過大可能不顯示。
  • 顏色深度:單色、16 色、256 色、真彩色(32bit 帶 Alpha)均支持,推薦 32bit Alpha 通道。
  • 生命週期:new Cursor(stream) 內部複製數據,流可立即關閉/釋放。
  • 作用域:設置 Control.Cursor 僅影響該控件及其子控件;設置 Form.Cursor 影響整個窗體客戶區。

五、完整示例:按鈕懸停切換自定義光標

public partial class DemoForm : Form {
    private Cursor _customCursor;
    private Cursor _defaultCursor;
    
    public DemoForm() {
        InitializeComponent();
        _defaultCursor = this.Cursor;
        // 假設 custom.cur 為嵌入資源
        _customCursor = LoadCursorFromResource("MyApp.Cursors.custom.cur");
    }
    
    private Cursor LoadCursorFromResource(string name) {
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name)) {
            return stream != null ? new Cursor(stream) : Cursors.Arrow;
        }
    }
    
    private void btnSpecial_MouseEnter(object sender, EventArgs e) {
        btnSpecial.Cursor = _customCursor;
    }
    
    private void btnSpecial_MouseLeave(object sender, EventArgs e) {
        btnSpecial.Cursor = _defaultCursor;
    }
    
    protected override void OnFormClosing(FormClosingEventArgs e) {
        _customCursor?.Dispose(); // 釋放非托管資源
        base.OnFormClosing(e);
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved