| Autor |
Beitrag |
highlander78
      
Beiträge: 62
|
Verfasst: So 23.09.07 16:56
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
      
Beiträge: 1087
Win Vista, Knoppix, Ubuntu
Delphi 7 Pe, Turbo Delphi, C#(VS 2005 Express), (X)HTML + CSS, bald Assembler
|
Verfasst: So 23.09.07 17:11
Vielleicht so(nicht probiert):
C#-Quelltext 1:
| if (s4 == "9") NotifyIcon = new System.Drawing.Icon("anderericon.ico"); |
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 62
|
Verfasst: 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 
      
Beiträge: 62
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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 
      
Beiträge: 62
|
Verfasst: So 14.10.07 14:17
Danke , genau genau so wie ich es wollte.Voll einfach deine Lösung.......
Mfg
|
|
highlander78 
      
Beiträge: 62
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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  .
|
|
highlander78 
      
Beiträge: 62
|
Verfasst: Fr 23.11.07 18:53
Ja , danke nochmal für den Tip , es funktioniert so
Abe gibt es eine Lösung damit ich keine 40 Zeilen Code schreiben muss
Tips sind immer gut 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 23.11.07 19:18
Noch ein Tipp: Resources.ResourceManager 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
highlander78 
      
Beiträge: 62
|
Verfasst: Fr 23.11.07 19:45
ok , muss dann das ganze nochmal durchgehen 
|
|
highlander78 
      
Beiträge: 62
|
Verfasst: Fr 23.11.07 20:15
Komme einfach nicht drauf 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|