2008-09-30 3 views
31

Dies war eine Interviewfrage. Wenn Visual Studio 2008 und ein Symbol als PNG-Datei gespeichert wurden, wurde das Bild als eingebettete Ressource benötigt und als Symbol in der Titelleiste eines Formulars verwendet.Got. PNG-Datei. Eingebettete Symbolressource wird als Symbol in der Formulartitelleiste angezeigt

Ich bin auf der Suche nach dem Modell Antwort auf diese Frage, sowohl (arbeiten!) Code und Visual Studio Tricks. (Modellantwort ist eine, die mir den Job bringen sollte, wenn ich es das nächste Mal treffe.)

Insbesondere weiß ich nicht, wie man das Bild lädt, sobald es eine eingebettete Ressource ist, noch wie man es als das Symbol für die Titelleiste.

Als Teillösung, die eingebettete Bit ignoriert, kopiert ich die Ressource der ouput Verzeichnis und versucht, die folgenden: -

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.Icon = new Icon("Resources\\IconImage.png"); 
    } 
} 

Das mit dem Fehler „Argument‚Bild‘ist fehlgeschlagen ein Bild sein muss, dass kann als Icon verwendet werden. "

Ich nehme an, dass die .PNG-Datei tatsächlich ein .ICO sein musste, aber ich konnte nicht sehen, wie man die Umwandlung macht. Ist diese Vermutung richtig oder gibt es ein anderes Problem?

Antwort

57

Starten Sie VS, starten Sie eine neue Windows-Anwendung. Öffnen Sie das Eigenschaftsfenster und fügen Sie die .png-Datei als Ressource hinzu (in diesem Beispiel: glider.png). Von nun können Sie die Ressource als Bitmap-Datei als

-Code WindowsFormsApplication10.Properties.Resources.glider Zugang für sie als Anwendungssymbol mit:

public Form1() 
     { 
      InitializeComponent(); 
      Bitmap bmp = WindowsFormsApplication10.Properties.Resources.glider; 
      this.Icon = Icon.FromHandle(bmp.GetHicon()); 
     } 
+1

Ich musste den vollen Namensraum System.Drawing.Icon.FromHandle (aber funktioniert super danke –

1

Eine gute Quelle zum Thema in C# 2.0 Convert Bitmap to Icon.

+0

Routine auf ein Symbol, ein Bild umzuwandeln. In meinem Fall hatte das Bild die richtigen Dimensionen für ein Icon, also ist vielleicht eine Vereinfachung möglich? Auch ich habe keine Möglichkeit, auf das eingebettete Bild zu bekommen. –

25

Das Modell Antwort auf diese Frage wäre:

System.Console.WriteLine("Are you serious?"); 
System.Console.WriteLine("I think I will try my chances with another employer."); 

das ist die Art der Sache ist, dass Sie vor Ihrem Computer in wenigen Minuten mit Ressourcen wie Google und Stack-Überlauf, die Lösung eine Aufgabe wie diese gibt wenig Einblick in, wenn Sie sind ein guter Entwickler oder nicht lösen können.

Icon.FromHandle wird Probleme mit einem PNG verursachen, da PNGs mehr als ein Bit Transparenz haben. Diese Art von Problem kann mit einer Bibliothek wie this one gelöst werden.

Die Chancen stehen sie wusste nicht, wie es geht, und sie versuchten, die Antwort aus potenziellen Mitarbeitern zu quetschen. Außerdem ist das Festlegen des Symbols des Formulars aus einem PNG ein unnötiger Leistungseinbruch, es hätte eigentlich ein ICO sein sollen.

+7

"Icon.FromHandle wird Probleme mit einem PNG, weil PNGs haben mehr als ein Bit Transparenz." - Demonstration dieses Wissens bieten würde Ein guter Einblick in einen Interviewer, dass der Entwickler wahrscheinlich mit realen Anwendungen und Versandproblemen umgegangen ist. –

+1

Gute Antwort. Ich werde mich an diese Antwort erinnern, falls mir dumme Fragen in Interviews gestellt werden. – Bitterblue

+0

@ Icon.FromHandle "wird Probleme verursachen mit einem PNG "- welche Art von Problemen? – user626528

16

Go hier:

http://www.getpaint.net/ (kostenlos)

Und hier:

Paint.NET ico Plugin (kostenlos)

Paint.NET installieren. Setzen Sie das ico-Plugin (zweiter Link) in den Paint.NET \ FileTypes-Ordner. Starten Sie Paint.NET. Öffne dein .png und speichere es als .ico.

Kostenlos und einfach.

+1

Zweiter Link ist tot = ( – IbrarMumtaz

+0

Secon d link: http://www.evanolds.com/pdn.html – IbrarMumtaz

+0

Obwohl dies nicht die Antwort des Modells ist, ist es sicherlich ein ** sehr ** hilfreicher Satz von Links! – ThunderGr

0

Dieser arbeitete für meine Zwecke, da alle meine Ressourcen PNG-Dateien waren:

[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = CharSet.Auto)] 
extern static bool DestroyIcon(IntPtr handle); 

// From http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.gethicon.aspx 
private Icon bitmapToIcon(Bitmap myBitmap) 
{ 
    // Get an Hicon for myBitmap. 
    IntPtr Hicon = myBitmap.GetHicon(); 

    // Create a new icon from the handle. 
    Icon newIcon = Icon.FromHandle(Hicon); 

    return newIcon; 
} 
Nizza
+0

Du hast deklariert, aber nicht "DestroyIcon (Hicon)" aufgerufen: "Es muss irgendwann aufgerufen werden. Der von Ihnen zitierte Code empfiehlt das Kopieren des Symbols und den Aufruf von 'DestroyHandle (newIcon.Handle);' –

+0

Guter Fang. Du hast Recht. Vielen Dank. –

Verwandte Themen