2011-08-01 21 views
6

Kaynak dosyaları Source.resx içine "x.ani" bir dosya aldım. Şimdi (kesinlikle) ..C#: İmleç Kaynak dosyasından nasıl yüklenir?

Cursor.Current = (Cursor)ResourcesX.GetObject("aero_busy.ani"); 

("aero_busy.ani") ResourceManager.GetObject kullanarak bu dosyayı yüklemeye çalışırken ama işe yaramadı :)

ben kaynağı kullanarak akım İmleç değiştirebilir nasıl nesne?

+1

İmleç sınıf animasyonlu imleçler desteklemez. Benim cevabımdaki gibi. – Jethro

+0

@Jethro thanks understood :) –

cevap

6

Geçici bir dosyaya dökülmekten daha iyi bir yol bulamadım ve Win32 yükleme imlecini dosya yönteminden kullanmıyorum. Kesmek böyle bir şey yapar (net bir açıklama için büyük bir yığın kod dosyasını çıkardım, burada bir akış dosyası akıştan gelen verilerle yazılmıştır). Ayrıca, tüm istisna işleme vb. Kaldırılmıştır.

[DllImport("User32.dll", CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] 
private static extern IntPtr LoadCursorFromFile(String str); 

public static Cursor LoadCursorFromResource(string resourceName) 
{   
    Stream cursorStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);   

    // Write a temp file here with the data in cursorStream 

    Cursor result = new Cursor(LoadCursorFromFile(tempFile)); 
    File.Delete(tempFile); 

    return result. 
} 

Bunu, (gömülü kaynakları yüklerken ad alanlarını hatırla) olarak kullanırsınız.

Cursors.Current = LoadCursorFromResource("My.Namespace.Filename"); 
+1

Jethro'dan gelen yorum ve yanıtla ilgili olarak, bu yöntemle sadece .cur (non-animated) imleçler kullandık. Bu yöntem renkli imleçlere izin vermelidir. –

+0

Değerli cevabınız için teşekkür ederim :) Programımın sadece taşınabilir bir program olmasını istedim (bir saplama programı çağır). Sadece bir Exe dosyasının kopyalanması gerekiyor. Ancak önerileriniz uygulamaya değerdir :) tekrar teşekkürler. –

3

Sorunun İmleç olarak kullanılmak üzere imleç sırayla KKO uzantısı olmalıdır gerçeği ile ilgisi olduğunu düşünüyorum.

// Aşağıdakiler yerleşik bir kaynaktan bir imleç oluşturur.

// özel bir imleç eklemek oluşturmak veya projenize yeni bir imleç dosya ekleme Varolan 16x16 bit eşlem // 1. kullanmak için: // Dosya-> Yeni Ekle Item-> Yerel Projesi Öğeler-> İmleç Türleri-> 16x16

yukarıdaki MSDN alındı ​​ // Resim-> Geçerli Simge görüntüsü: // 2. 16x16 resim türü Dosya.

Güncelleme: Cevabı neden bulundu.

"Not Not

siyah ve beyaz dışındaki renkleri ile animasyonlu imleçler (Ani dosyaları) veya imleçler desteklemez İmleç sınıfı."

Bulunan Here

+0

Değerli zaman ve Yanıt için teşekkürler :) +1 önemli ipuçları için :) –

17

I (Visual Studio kullanıyorum) projesi Kaynakları parçası haline imleç KKO dosyası ekleyerek bunu. Geliştirme programı yükleyebildiği sürece .cur olması gerekip gerekmediğinden emin değilim.

Ben imleç dosyasından bir MemoryStream oluşturmak benim kod değişkenler beyanı kısmında Bunu yaptıktan sonra:

private static System.IO.MemoryStream cursorMemoryStream = new System.IO.MemoryStream(myCurrentProject.Properties.Resources.myCursorFile); 

... ve sonra MemoryStream imleci oluşturabilirsiniz:

private Cursor newCursor = new Cursor(cursorMemoryStream); 

İmleci program içinde istediğiniz gibi atayabilirsiniz, örn.

pictureBox1.Cursor = newCursor; 
ve yeni imleç programın bir parçası olarak derlenmiştir.konuya birkaç döner sonra

+4

Bence bu şekilde diğerlerinden daha iyi! – moorara

+1

ancak 32bit derinlikli imleçlerle çalışmıyor – GorillaApe

4

, ben zarif çözüm bulmak:

internal static Cursor GetCursor(string cursorName) 
    { 
     var buffer = Properties.Resources.ResourceManager.GetObject(cursorName) as byte[]; 

     using (var m = new MemoryStream(buffer)) 
     { 
      return new Cursor(m); 
     } 
    } 
İlgili konular