Entwickler-Ecke
WinForms - NotifyIcon in einer laufenden Anwendung ändern
highlander78 - So 23.09.07 16:56
Titel: NotifyIcon in einer laufenden Anwendung ändern
Hallo,
wie kann ich in einer laufenden Anwendung einen andern NotifyIcon anzeigen wenn zB. ein bestimmter String erreicht wird.
So erzeuge ich mein Icon bei start meiner Anwendung:
C#-Quelltext
1: 2: 3:
| NotifyIcon = new Notifyicon(); NotifyIcon.Icon = new System.Drawing.Icon("meinicon.ico"); NotifyIcon.Visible = true; |
jetzt möchte ich wenn z.B mein bestimmter String (s4) eine bestimmte Zahl erreicht , sagen wir "9" dann soll ein anderer Icon angezeigt werden.
habe es so versucht , aber ohne Erfolg.
C#-Quelltext
1:
| if (s4 == "9") new System.Drawing.Icon("anderericon.ico"); |
Vielleicht hat jemand einen Tip wie ich es anstellen kann ?
Mfg
[cs]
Leuchtturm - So 23.09.07 17:11
Vielleicht so(nicht probiert):
C#-Quelltext
1:
| if (s4 == "9") NotifyIcon = new System.Drawing.Icon("anderericon.ico"); |
Kha - So 23.09.07 17:24
@highlander: Eieieiei. Bevor du dich mit überhaupt irgendetwas in Richtung Winforms beschäftigst, solltest du dir erst einmal die absoluten Grundlagen aneignen (Links sollten so langsam in diesem Forum zur Genüge zu finden sein); ein mutterseelenallein stehender Konstruktoraufruf macht in den wenigsten Fällen Sinn. Nach Erwerb dieser Grundlagen sollte ein kurzer Blick auf deinen ersten Codeblock genügen (gleich Tipp an Leuchtturm ;) ), um die Lösung davon ableiten zu können.
highlander78 - So 23.09.07 18:04
jetzt habe ich wieder was dazu gelernt :-)
C#-Quelltext
1:
| if (s4 == "9") NotifyIcon.Icon = new System.Drawing.Icon("anderericon.ico"); |
Gruss
highlander78 - So 14.10.07 03:46
Hallo,
stehe jetzt an einem Punkt wo ich nicht weiterkomme.
Bis jetzt hatte ich die einzelnen Icons in einem externen Ordner.
Hat alles ohne Probleme funktioniert.Wollte das ganze jetzt so testen , dass die Icons in der Anwendung eingebetet sind.
Habe auch zugriff auf die einzelnen Resourcen , bloss beim ändern des Icons durch den String "s3" bringt die Anwendung einen Fehler.
Der String wechselt oft den Wert und das Icon sollte sich dann auch dann mitändern.Das wechseln funktioniert nur komischerweise ab und zu dann wieder nicht, verstehe das ganze nicht.Viellicht ligt es an dem Stream de erzwugt wird...
Wollte das ganze jetzt testen , wenn die Icons in der Anwendung kompiliert sind, aber irgendwo habe ich einen Wurm drin...
C#-Quelltext
1: 2: 3: 4: 5:
| Assembly _assembly; Stream _imageStream1; Stream _imageStream2; Stream _imageStream3; Stream _imageStream4 |
C#-Quelltext
1: 2: 3: 4: 5:
| _assembly = Assembly.GetExecutingAssembly(); _imageStream1 = _assembly.GetManifestResourceStream("MyNamespace.1.ico"); _imageStream2 = _assembly.GetManifestResourceStream("MyNamespace.2.ico"); _imageStream3 = _assembly.GetManifestResourceStream("MyNamespace.3.ico"); _imageStream4 = _assembly.GetManifestResourceStream("MyNamespace.4.ico"); |
C#-Quelltext
1: 2: 3: 4:
| if (s3 == "1") notifyIcon1.Icon = new System.Drawing.Icon(_imageStream1); if (s3 == "2") notifyIcon1.Icon = new System.Drawing.Icon(_imageStream2); if (s3 == "3") notifyIcon1.Icon = new System.Drawing.Icon(_imageStream2); if (s3 == "4") notifyIcon1.Icon = new System.Drawing.Icon(_imageStream4); |
Fehlermeldung:
| Zitat: |
| Das Argument picture muss ein Bild sein, das als Icon verwendet werden kann. |
Verwende die gleichen Icons , die ich davor im dem externen Ordner hatte , verstehe deswegen die Fehlermeldung nicht..?
| Zitat: |
System.Reflection.TargetInvocationException was unhandled
Message="Ein Aufrufziel hat einen Ausnahmefehler verursacht."
Source="mscorlib"
StackTrace:
bei System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
bei System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
bei System.Delegate.DynamicInvokeImpl(Object[] args)
bei System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
bei System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
bei System.Threading.ExecutionContext.runTryCode(Object userData)
bei System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
bei System.Windows.Forms.Control.InvokeMarshaledCallbacks()
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei Test.Program.Main() in C:\Users\Eigene\Documents\Visual Studio 2005\Projects\WindowsApplication3_\WindowsApplication3\Program.cs:Zeile 22.
bei System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart() |
Kha - So 14.10.07 10:32
Verwende den "Ressourcen"-Tab in den Projekteigenschaften, dann musst du dich mit Stream gar nicht erst herumschlagen, sondern bekommst per Properties.Resources.DeinIcon direkt eine Icon-Instanz.
JüTho - So 14.10.07 13:50
... und Deine Fehlermeldung:
highlander78 hat folgendes geschrieben: |
Fehlermeldung:
| Zitat: | | Das Argument picture muss ein Bild sein, das als Icon verwendet werden kann. |
|
ist doch auch eindeutig: Zur Darstellung benötigt man ein
Icon:
| Zitat: |
Icon-Klasse
Stellt ein Windows-Symbol dar, bei dem es sich um ein Bitmap-Bild zur Darstellung eines Objekts handelt. |
Du lieferst aber nur einen Stream, aus dem Du noch ein Icon/Bitmap machen müsstest. Deshalb ist Khabarakhs Vorschlag entschieden besser. Jürgen
highlander78 - So 14.10.07 14:17
Danke , genau genau so wie ich es wollte.Voll einfach deine Lösung.......
Mfg
highlander78 - Fr 23.11.07 17:34
Hallo,
habe noch eine Frage.
Und zwar ändere ich jetzt mein NotifyIcon in meiner Anwendung bei einem bestimmten String.
Das ganze funktioniert zwar ohne Probleme , aber ich habe im Moment 40 Zeilen in dem Format in meinem Code.
Gibt es vielleicht eine einfache / intelligente Lösung ?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| if (s3 == "1") notifyIcon1.Icon = Properties.Resources._1; if (s3 == "2") notifyIcon1.Icon = Properties.Resources._2; if (s3 == "3") notifyIcon1.Icon = Properties.Resources._3; if (s3 == "4") notifyIcon1.Icon = Properties.Resources._4; if (s3 == "5") notifyIcon1.Icon = Properties.Resources._5; usw. usw. |
Gruss
Kha - Fr 23.11.07 18:04
highlander78 hat folgendes geschrieben: |
| Gibt es vielleicht eine einfache / intelligente Lösung ? |
Ja.
Und, welch Wunder, es funktioniert ebenfalls über die "Resources"-Klasse. Das waren jetzt aber genügend Tipps :zwinker: .
highlander78 - Fr 23.11.07 18:53
Ja , danke nochmal für den Tip , es funktioniert so :D
Abe gibt es eine Lösung damit ich keine 40 Zeilen Code schreiben muss :?:
Tips sind immer gut :wink:
Christian S. - Fr 23.11.07 19:18
Noch ein Tipp: Resources.ResourceManager ;)
highlander78 - Fr 23.11.07 19:45
ok , muss dann das ganze nochmal durchgehen :D
highlander78 - Fr 23.11.07 20:15
Komme einfach nicht drauf :cry:
Christian S. - Fr 23.11.07 20:22
*seufz*
Der ResourcesManager stellt Methoden zur Verfügung, die alle mit "Get" anfangen und denen man den Namen einer Resource übergeben kann. Eine Icon-Resource kannst Du als Objekt erhalten und dann in Icon casten.
Es ist übrigens oft sehr lehrreich, wenn sich man die Dateien ansieht, die Visual Studio so erzeugt, in diesem Fall die Resources.Designer.cs
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!