Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Gestione degli eventi
Forum - C# / VB.NET - Gestione degli eventi

Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:50
Mercoledì, 05/02/2014
Ho un problema con la gestione degli eventi in un programma; in un form, ho una picturebox, alla quale ho intenzione di assegnare un colore di sfondo specifico, alla partenza del programma.
A tale scopo ho implementato l' evento Load del form, dove agisco sul colore dello sfondo tramite un oggetto Graphics:
Codice sorgente - presumibilmente C# / VB.NET

  1. private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             Graphics foglio = pictureBoxTela.CreateGraphics();
  4.             foglio.Clear(Color.Blue);
  5.         }

Il problema è che, apparentemente, non ottengo nessun effetto.


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:16
Mercoledì, 05/02/2014
C'è un motivo specifico per non usare la proprietà BackColor ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:13
Mercoledì, 05/02/2014
Chiedo scusa se non ho esposto il problema in completo.
Il controllo della picturebox, non avviene direttamente da programma, ma tramite una classe creata apposta. In quest' ultima ho inserito un oggetto Graphics allo scopo di "disegnare" sul componente ad esso associato.


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
Snogar (Normal User)
Pro


Messaggi: 130
Iscritto: 09/01/2012

Segnala al moderatore
Postato alle 12:40
Giovedì, 06/02/2014
A prima vista non ci sono riferimenti tra l'oggetto Graphics da te creato e la picturebox.


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 13:38
Giovedì, 06/02/2014
Testo quotato

Postato originariamente da Snogar:

A prima vista non ci sono riferimenti tra l'oggetto Graphics da te creato e la picturebox.



Ho implementato la classe in questo modo
Codice sorgente - presumibilmente C++

  1. using System.Drawing;
  2.  
  3. namespace programma
  4. {
  5.     class Tavola
  6.     {
  7.         private Graphics dove=null;
  8.  
  9.         public Tavola(Graphics luogo)
  10.         {
  11.             dove = luogo;
  12.         }
  13.  
  14.         public void cancella(Color sfondo)
  15.         {
  16.             dove.Clear(sfondo);
  17.             // altre operazioni...
  18.         }
  19.  
  20.         // altri metodi
  21.     }
  22. }

Mentre , nell'evento load ho:
Codice sorgente - presumibilmente C++

  1. private Tavola foglio = null; // Dichiaro un' istanza di Tavola privata
  2. private void Form1_Load(object sender, EventArgs e)
  3. {
  4.         foglio = new Tavola(pictureBoxTela.CreateGraphics());
  5.         foglio.cancella(Color.Black);
  6. }



Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 2:11
Venerdì, 07/02/2014
Interessante come idea.
Non ho mai provato questo sistema.
Provo a sparare un pò a caso anche perché l'esempio postato al 90% non funzionerà.

Disegnare da una classe diversa da dove si sta attualmente lavorando credo che vada affrontata diversamente.

dal tuo esempio:
Non è sufficiente avere il graphics. Ma devi passare al graphics un hwnd sul quale disegnare.

E come creare un oggetto grafico che disegna sul nulla.

Ti scrivo il codice il C# perché in vb.net non saprei farlo.

Classe
Codice sorgente - presumibilmente C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Drawing;
  6.  
  7. namespace esempio
  8. {
  9.     class disegno
  10.     {
  11.  
  12.         /// <summary>
  13.         /// Handle al quale assegnare il disegno
  14.         /// </summary>
  15.         IntPtr _hwnd;
  16.  
  17.         /// <summary>
  18.         /// Assegna un Handle sul quale effettuare il disegno
  19.         /// </summary>
  20.         public IntPtr HWND
  21.         {
  22.             get { return _hwnd; }
  23.             set { _hwnd = value; }
  24.         }
  25.  
  26.         /// <summary>
  27.         /// Riempie il controllo con un colore a scelta
  28.         /// </summary>
  29.         /// <param name="color">Colore del Riempimento</param>
  30.         public void Riempi_Colore(Color color)
  31.         {
  32.             Graphics g = Graphics.FromHwnd(HWND);
  33.             g.Clear(color);
  34.         }
  35.     }
  36. }




Form1

Codice sorgente - presumibilmente C++

  1. private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             //Lavoro su PictureBox1
  4.             disegno d = new disegno();
  5.             d.HWND = pictureBox1.Handle;
  6.  
  7.             d.Riempi_Colore(Color.Red);
  8.  
  9.         }
  10.  
  11.  
  12.  private void button2_Click(object sender, EventArgs e)
  13.         {
  14.             //Lavoro su PictureBox2
  15.             disegno d = new disegno();
  16.             d.HWND = panel1.Handle;
  17.  
  18.             d.Riempi_Colore(Color.Blue);
  19.         }



L'operazione può essere fatta su qualsiasi controllo, basta inviare l'handle del controllo su quale vuoi
che il graphics faccia effetto.


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:56
Venerdì, 07/02/2014
Grazie per la risposta!

Purtroppo, la tua soluzione utilizza un oggetto Graphics, con tutte le limitazioni del caso.
Per l' evento load, per esempio, effettivamente si modifica il colore dello sfondo, ma quando il form viene visualizzato, la picturebox mostra ancora il proprio colore di sfondo.


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 15:17
Venerdì, 07/02/2014
Ci sono tanti modi per risolvere questo problema

1 puoi invalidare la grafica della picturebox o del panel.
2 anziché lavorare con un handle puoi lavorare direttamente su un immagine.

Alla classe puoi inviare anche l'oggetto su cui stai operando.
ottenere le relative informazioni e lavorare con esso direttamente del tipo



Codice sorgente - presumibilmente Plain Text

  1. //Form1
  2. Classe.DrawRectangle(pictureBox1);





Codice sorgente - presumibilmente C++

  1. //Classe
  2.  
  3.  
  4. public void DrawRectangle(object sender)
  5. {
  6.  
  7.  if (sender.GetType() == typeof(PictureBox))
  8.  {
  9.  
  10.     PictureBox pix = ((PictureBox)sender);
  11.      Bitmap b = new Bitmap(pix.Width,pix.Height);
  12.  
  13.     //immagine standard
  14.     Image img = b;
  15.    
  16.    Graphics g = graphics.FromImage(img);
  17.  
  18.     g.DrawRectangle(Pens.Black, new Rectangle(0, 0, 100, 100));
  19.  
  20.    ((PictureBox)sender).Image = img;
  21.  
  22.  }
  23.  
  24.  
  25. }



Così dovrebbe funzionarti senza darti problemi.
Chiedo scusa in anticipo se ci possano essere errori.


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:42
Venerdì, 07/02/2014
Grazie ancora per queste ultime delucidazioni.


Nulla va più veloce della luce, quindi rilassati.
PM Quote