Oppure

Loading
05/02/14 13:50
Poggi Marco
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:
private void Form1_Load(object sender, EventArgs e)
        {
            Graphics foglio = pictureBoxTela.CreateGraphics();
            foglio.Clear(Color.Blue);
        }
Il problema è che, apparentemente, non ottengo nessun effetto.
aaa
05/02/14 15:16
nessuno
C'è un motivo specifico per non usare la proprietà BackColor ?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
05/02/14 18:13
Poggi Marco
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.
aaa
06/02/14 11:40
Snogar
A prima vista non ci sono riferimenti tra l'oggetto Graphics da te creato e la picturebox.
aaa
06/02/14 12:38
Poggi Marco
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
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:
 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);
}
aaa
07/02/14 1:11
Thejuster
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
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


    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.
mire.forumfree.it/ - Mire Engine
C# UI Designer
07/02/14 13:56
Poggi Marco
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.
aaa
07/02/14 14:17
Thejuster
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




//Form1
Classe.DrawRectangle(pictureBox1);






//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.
mire.forumfree.it/ - Mire Engine
C# UI Designer