2011-08-17 34 views
3

我試圖將一個自定義光標作爲嵌入式資源添加到C#Winforms應用程序。看起來嵌入部分並不像文檔暗示的那樣工作。如何在C#Winforms中創建嵌入的資源遊標?

如果我在運行時從文件加載光標它鐵鍋就好了:

myMagCursor = new Cursor("../Resources/magnify.cur"); 

如此看來光標文件是好的。我也跟着上 MSDN 此信息嵌入光標(從C#示例中的註釋):

//In Visual Studio: 
//  1. Select the cursor file in the Solution Explorer 
//  2. Choose View->Properties. 
//  3. In the properties window switch "Build Action" to "Embedded" 

然後試圖用這樣的:

myMagCursor = new Cursor(GetType(), "magnify.cur"); 

這給空引用例外,我假定因爲找不到資源。我也試過這種方法(在網絡上其他地方找到):

namespace Piccolo.Forms 
{ 
    public partial class Hanger 
    { 
    ... 
     Assembly asm = Assembly.GetExecutingAssembly(); 
     using(Stream resStream = asm.GetManifestResourceStream("Piccolo.magnify.cur")) 
     { 
      myMagCursor = new Cursor(resStream); 
     } 

我已經試過 「Piccolo.magnify.cur」, 「Piccolo.Forms.magnify.cur」,「Piccolo.Forms.Hanger.magnify .cur「,」Hanger.magnify.cur「等。我推斷遊標並未嵌入。

光標文件位於Resources文件夾中,其中包含一系列.ico,.png和.jpg文件,這些文件都可以正常工作,並顯示在項目的'Resources.resx'文件(?)中。他們都沒有「嵌入式資源」屬性。我的光標文件確實有「嵌入式資源」,但沒有出現在「Resources.resx」中。

我錯過了光標文件以正確嵌入它?

+0

可能的重複[C#:如何從資源文件加載光標?](http://stackoverflow.com/questions/6897274/c-how-to-load-cursor-from-resource-file) –

回答

7

我已經獲得了第二種方法在WPF應用程序中工作。無論如何,這部分應該都是一樣的,因爲它們都使用相同類型的資源流。這是我成功使用的線。

canvas1.Cursor = new Cursor(Assembly.GetExecutingAssembly().GetManifestResourceStream("WpfApplication2.mallet.cur")); 

最有可能的,你把你的光標某種類型的文件夾中,因此「Piccolo.magnify.cur」部分是錯誤的。你所能做的就是將所有的資源流名稱打印到一個文本框或其他東西上,以確切地看到你應該放在那裏。使用以下內容來完成此操作:

String[] resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames(); 

並打印出您選擇的那些。這應該指向你正確的方向。

+1

+1 ;您也可以使用.Net Reflector或ILSpy之類的工具來查看資源如何打包到您的程序集中。如果沒有這些,打印到文本框診斷將運行良好。 –

+0

使用您的建議查看我發現的資源名稱是「Piccolo.Resources.magnify」。謝謝 –

5

遊標,你可以做:

using (MemoryStream ms = new MemoryStream(Properties.Resources.magnify)) 
{ 
    myMagCursor = New Cursor(ms); 
} 

希望你不希望看到它的顏色,雖然。

4

獲取您用於工作的重載是很麻煩的。它有永無止境的命名空間問題。到目前爲止,最好的方法是通過Project + Properties,Resources選項卡將遊標添加爲資源。點擊添加資源按鈕的箭頭,添加現有文件並選擇.cur文件。

在運行時,您可以使用Properties.Resources。 cursorname財產。返回一個byte [],你捶那與代碼光標這樣的:

this.Cursor = new Cursor(new System.IO.MemoryStream(Properties.Resources.arrow_i)); 

注意使用的MemoryStream的打開的byte []到流使光標(流)過載的作品。

+1

這會導致內存泄漏,因爲'MemoryStream'沒有被丟棄? –

+1

@Uwe - 一些程序員堅持要處理由byte []保存的非託管資源。我不是其中之一。隨意按照你的方式做。 –