
Poggi Marco (Member)
Guru
    
Messaggi: 969
Iscritto: 05/01/2010
|
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 |
private void Form1_Load(object sender, EventArgs e)
{
Graphics foglio = pictureBoxTela.CreateGraphics();
foglio.Clear(Color.Blue);
}
|
Il problema è che, apparentemente, non ottengo nessun effetto.
|
|

()
Newbie
    
Messaggi:
Iscritto:
|
C'è un motivo specifico per non usare la proprietà BackColor ?
|
|

Poggi Marco (Member)
Guru
    
Messaggi: 969
Iscritto: 05/01/2010
|
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.
|
|

Snogar (Normal User)
Pro
    
Messaggi: 148
Iscritto: 09/01/2012
|
A prima vista non ci sono riferimenti tra l'oggetto Graphics da te creato e la picturebox.
|
|

Poggi Marco (Member)
Guru
    
Messaggi: 969
Iscritto: 05/01/2010
|
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++ |
using System.Drawing; namespace programma { class Tavola { private Graphics dove=null; public Tavola(Graphics luogo) { dove = luogo; } public void cancella(Color sfondo) { dove.Clear(sfondo); // altre operazioni... } // altri metodi } }
|
Mentre , nell'evento load ho:
Codice sorgente - presumibilmente C++ |
private Tavola foglio = null; // Dichiaro un' istanza di Tavola privata private void Form1_Load(object sender, EventArgs e) { foglio = new Tavola(pictureBoxTela.CreateGraphics()); foglio.cancella(Color.Black); }
|
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2339
Iscritto: 04/05/2008
|
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++ |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; namespace esempio { class disegno { /// <summary> /// Handle al quale assegnare il disegno /// </summary> IntPtr _hwnd; /// <summary> /// Assegna un Handle sul quale effettuare il disegno /// </summary> public IntPtr HWND { get { return _hwnd; } set { _hwnd = value; } } /// <summary> /// Riempie il controllo con un colore a scelta /// </summary> /// <param name="color">Colore del Riempimento</param> public void Riempi_Colore(Color color) { Graphics g = Graphics.FromHwnd(HWND); g.Clear(color); } } }
|
Form1
Codice sorgente - presumibilmente C++ |
private void button1_Click(object sender, EventArgs e) { //Lavoro su PictureBox1 disegno d = new disegno(); d.HWND = pictureBox1.Handle; d.Riempi_Colore(Color.Red); } private void button2_Click(object sender, EventArgs e) { //Lavoro su PictureBox2 disegno d = new disegno(); d.HWND = panel1.Handle; d.Riempi_Colore(Color.Blue); }
|
L'operazione può essere fatta su qualsiasi controllo, basta inviare l'handle del controllo su quale vuoi
che il graphics faccia effetto.
|
|

Poggi Marco (Member)
Guru
    
Messaggi: 969
Iscritto: 05/01/2010
|
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.
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2339
Iscritto: 04/05/2008
|
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 |
//Form1
Classe.DrawRectangle(pictureBox1);
|
Codice sorgente - presumibilmente C++ |
//Classe public void DrawRectangle(object sender) { if (sender.GetType() == typeof(PictureBox)) { PictureBox pix = ((PictureBox)sender); Bitmap b = new Bitmap(pix.Width,pix.Height); //immagine standard Image img = b; Graphics g = graphics.FromImage(img); g.DrawRectangle(Pens.Black, new Rectangle(0, 0, 100, 100)); ((PictureBox)sender).Image = img; } }
|
Così dovrebbe funzionarti senza darti problemi.
Chiedo scusa in anticipo se ci possano essere errori.
|
|

Poggi Marco (Member)
Guru
    
Messaggi: 969
Iscritto: 05/01/2010
|
Grazie ancora per queste ultime delucidazioni.
|
|