Newsgroup: it.comp.dotnet
Titolo: C# (wpf), Sovrapposizione immagini

Ciao a tutti,
temo di essermi infilato in una trappola per la quale non conosco 
soluzione. La mia intenzione ï¿œ quella di realizzare un programmino che 
mi visualizzi, nell'area di notifica, un'icona che mi indichi lo stato 
dei tasti di modifica persistente della tastiera (CapsLock, NumLock e 
ScrollLock). L'icona, cosï¿œ come l'ho immaginata, consiste di un 
semaforino, disposto orizzontalmente, con tre lucine che descrivono lo 
stato dei suddetti tasti e l'idea ï¿œ quella di disegnare, dinamicamente, 
le lucine sull'immagine del semaforino spento. A tal proposito ho 
iniziato a scrivere la parte relativa alla grafica in un programmino di 
prova, nel quale mi accade un problema che non so spiegarmi: 
sostanzialmente, mi scompare l'immagine del semaforino in un punto in 
cui non me lo aspetto proprio. Di seguito riporto la funzione dove si 
verifica il problema, quindi tenterï¿œ di spiegare il risultato del debug.
La funzione dovrebbe, semplicemente, disegnare la luce sopra il semaforo:
      1	        NotifyIcon ico = new NotifyIcon();
      2	        private void Window_Loaded(object sender, RoutedEventArgs e)
      3	        {
      4	            ico.Icon = (Icon)Properties.Resources.Semaforo;
      5	            ico.Visible = true;
      6	
      7	            MemoryStream s0 = new MemoryStream();
      8	            Properties.Resources.Semaforo.Save(s0);
      9	            IconBitmapDecoder ibd = new IconBitmapDecoder(s0, 
BitmapCreateOptions.None, BitmapCacheOption.None);
     10	            Rect R = new Rect(0, 0, 64, 64);
     11	            ImageDrawing idN = new ImageDrawing(ibd.Frames[0], R);
     12	            image1.Source = ibd.Frames[0].Clone();
     13	            /*
     14	             * Bitmap b = ico.Icon.ToBitmap();
     15	             * image1.Source =
     16	             * 
System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(b.GetHbitmap(),
     17	             * 
             IntPtr.Zero, Int32Rect.Empty,
     18	             * 
             BitmapSizeOptions.FromWidthAndHeight(b.Width, b.Height));
     19	             */
     20	            MemoryStream s1 = new MemoryStream();
     21	            Properties.Resources.Luce.Save(s1);
     22	            IconBitmapDecoder ibd1 = new IconBitmapDecoder(s1, 
BitmapCreateOptions.None, BitmapCacheOption.None);
     23	            Rect R1 = new Rect(20, 20, 20, 20);
     24	            ImageDrawing idN1 = new ImageDrawing(ibd1.Frames[0], 
R1);
     25	
     26	            DrawingGroup dg = new DrawingGroup();
     27	            dg.Children.Clear();
     28	            dg.Children.Add(idN);
     29	            dg.Children.Add(idN1);
     30	            DrawingImage di = new DrawingImage(dg);
     31	            di = new DrawingImage(dg);
     32	            RenderTargetBitmap rtb = new RenderTargetBitmap(64, 
64, 96, 96, PixelFormats.Pbgra32);
     33	
     34	            DrawingVisual dv = new DrawingVisual();
     35	            using (DrawingContext ctx = dv.RenderOpen())
     36	            {
     37	                ctx.DrawImage(di, R);
     38	            }
     39	            rtb.Render(dv);
     40	            BitmapEncoder enc = new BmpBitmapEncoder();
     41	            enc.Frames.Add(BitmapFrame.Create(rtb.Clone()));
     42	            MemoryStream ss = new MemoryStream();
     43	            enc.Save(ss);
     44	            image1.Source = rtb;
     45	            Bitmap bitmap = new System.Drawing.Bitmap(ss);
     46	            ico.Icon = 
System.Drawing.Icon.FromHandle(bitmap.GetHicon());
     47	        }
Prima domanda: ho intrapreso la giusta direzione per realizzare ciï¿œ che 
desidero?
Ora il problema:
si verifica dopo l'esecuzione della linea 9. Dopo la linea 5 l'icona 
viene visualizzata nell'area di notifica e, comunque, viene visualizzata 
se vengono eseguite le linee ora commentate (13-19).
Il MemoryStream (s0 a linea 8) sembra essere inizializzato correttamente 
ma dopo l'esecuzione della linea 9 l'immagine in ibd.Frames[0] non 
compare. Da notare la similitudine tra le linee 7-11 e quelle tra 20-24, 
dopo le quali, se visualizzo l'immagine (image1.Source = 
ibd1.Frames[0].Clone()) questa compare. Non mi spiego perchï¿œ nel secondo 
caso funzioni mentre nel primo no. Eseguendo l'intera funzione, 
nell'area di notifica, il semaforino viene sostituito dalla lucina 
accesa posizionata, tra l'altro, dove mi aspetto sia.
Spero di esser stato sufficientemente chiaro e spero in un vostro 
supporto. Grazie anticipatamente per l'attenzione.

[Risolto]
L'esempio funziona. Il problema era nell'immagine; comunque non capisco 
perché, nonostante il problema, dopo la linea 4 l'icona venisse 
visualizzata correttamente.
 
Ciao a tutti.