PDA

View Full Version : [VB.NET] Problema label trasparente in CF2.0 e picturebox


jackk87
04-04-2009, 14:02
Buongiorno,
ho settato la propietà backcolor della label con colore trasparente sia da codice che dalle proprità ma niente lo sfondo resta bianco non trasparente...la label è situata su una picturbox quindi ho pensato di utilizzare come container la picturebox perchè la label sicuramente fa parte della form quindi mi da sfondo bianco perchè la form è bianca.
ho utilizzato label1.parent=picturbox1 ma mi da errore
ho provato label1.parent.control.containe(picturbox1) ma non funziona
dimenticavo stiamo parlando di compactframework 2.0 per windows mobile 6

qualcuno può aiutarmi?grazie in anticipo :help:

MarcoGG
04-04-2009, 17:44
Beh, ma la PictureBox non è un container, perciò ovvio che da errore. Magari spiega cosa cerchi di ottenere e perchè ti serve una Label trasparente...

jackk87
04-04-2009, 20:02
Beh, ma la PictureBox non è un container, perciò ovvio che da errore. Magari spiega cosa cerchi di ottenere e perchè ti serve una Label trasparente...

Ciao Marco allora io ho uno sfondo gradiente fatto in photoshop quindi un'immagine e la inserisco nella picturebox e sopra ci devo mettere una label quindi deve avere lo sfondo della picturebox.
Da quanto programmo in vb la picturebox insieme ai frame è stata sempre un container infatti ho provato a farlo in framework(non in compact) ed è come dico io cioè se metto la label con sfondo trasparente è grigio perchè il form e grigio...poi nell'evento load della form vado a inserire label1.parent=picturebox1 e la label assume lo sfondo trasparente. Spero che sono stato chiaro e che riuscirai a risolvermi il problema che sei molto ma molto più in gamba di me ;-)

Ken1986
05-04-2009, 11:18
label.backcolor = transperent
Così dovresti ottenre l'effetto che devideri

MarcoGG
05-04-2009, 14:52
Ciao Marco allora io ho uno sfondo gradiente fatto in photoshop quindi un'immagine e la inserisco nella picturebox e sopra ci devo mettere una label quindi deve avere lo sfondo della picturebox.
Da quanto programmo in vb la picturebox insieme ai frame è stata sempre un container infatti ho provato a farlo in framework(non in compact) ed è come dico io cioè se metto la label con sfondo trasparente è grigio perchè il form e grigio...poi nell'evento load della form vado a inserire label1.parent=picturebox1 e la label assume lo sfondo trasparente. Spero che sono stato chiaro e che riuscirai a risolvermi il problema che sei molto ma molto più in gamba di me ;-)

Evidentemente hai ragione tu.
Non avendo mai usato una PictureBox come contenitore per altri controlli ( in .Net uso sempre Panel, TabControl ecc... ), non sospettavo proprio si potesse fare controllo.Parent = PictureBox ( eh, non si finisce mai di imparare ! :D ).
Ad ogni modo, dopo breve test su applicazione tipo Smart Device, se provo a farlo, mi va in errore...

In ogni caso escluderei l'uso di una Label, che, soprattutto in CF2, è un controllo un po' limitato ( non ha nemmeno l'evento Click() di base, e se vuoi usarlo come un Button, poi ? ).

In soldoni l'ho risolta così :

1. Uso una PictureBox di sfondo ( PictureBoxSfondo ), con un'immagine e che deve avere la proprietà SizeMode = Normal.

2. Anzichè Labels, uso delle altre PictureBox, che hanno maggiorni possibilità e posso usarle come pulsanti ( nell'esempio, una sola, la "PictureBoxButton" ). Vedremo che far assomigliare una PictureBox ad una Label è questione di poco...

3. Ovviamente la PictureBoxButton deve stare sopra ( contenuta completamente ) alla PictureBoxSfondo, e come questa, avere la proprietà SizeMode = Normal.

4. NON imposto PictureBoxButton.Parent = PictureBoxSfondo - Da evitare.

5. Gestisco tutto nell'evento Paint della PictureBoxButton :

Private Sub PictureBoxButton_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBoxButton.Paint

'Porzione Immagine sottostante :
Dim rX As Integer = PictureBoxButton.Left - PictureBoxSfondo.Left
Dim rY As Integer = PictureBoxButton.Top - PictureBoxSfondo.Top
Dim R As New Rectangle(rX, rY, PictureBoxButton.Width, PictureBoxButton.Height)
Dim bmp As New Bitmap(R.Width, R.Height)
e.Graphics.DrawImage(PictureBoxSfondo.Image, 0, 0, R, GraphicsUnit.Pixel)

'Text del pulsante :
Dim leftTesto As Single = 5
Dim topTesto As Single = 5
Dim F As New Font("Tahoma", 12, FontStyle.Bold)
Dim SB As New SolidBrush(Color.White)
e.Graphics.DrawString("Pulsante", F, SB, leftTesto, topTesto)

'Cornice pulsante :
Dim P As New Pen(Color.White, 1)
e.Graphics.DrawRectangle(P, 0, 0, PictureBoxButton.Width - 1, PictureBoxButton.Height - 1)

End Sub

6. Posso usarla come fosse un Button :
Private Sub PictureBoxButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBoxButton.Click
MsgBox("Click")
End Sub

E direi che il gioco è fatto. ;)

jackk87
05-04-2009, 15:52
Ciao Marco come dici tu non si finisce mai di imparare e io aggiungo anche che tu non finisci mai di stupirmi :D

grazie mille veramente :cool:

MarcoGG
06-04-2009, 12:56
:cool:

Piccola correzione : quel Dim bmp As New Bitmap(R.Width, R.Height) è superfluo ( la fretta... ), perciò :

Private Sub PictureBoxButton_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBoxButton.Paint

'Porzione Immagine sottostante :
Dim rX As Integer = PictureBoxButton.Left - PictureBoxSfondo.Left
Dim rY As Integer = PictureBoxButton.Top - PictureBoxSfondo.Top
Dim R As New Rectangle(rX, rY, PictureBoxButton.Width, PictureBoxButton.Height)
e.Graphics.DrawImage(PictureBoxSfondo.Image, 0, 0, R, GraphicsUnit.Pixel)

'Text del pulsante :
Dim leftTesto As Single = 5
Dim topTesto As Single = 5
Dim F As New Font("Tahoma", 12, FontStyle.Bold)
Dim SB As New SolidBrush(Color.White)
e.Graphics.DrawString("Pulsante", F, SB, leftTesto, topTesto)

'Cornice pulsante :
Dim P As New Pen(Color.White, 1)
e.Graphics.DrawRectangle(P, 0, 0, PictureBoxButton.Width - 1, PictureBoxButton.Height - 1)

End Sub

;)

jackk87
06-04-2009, 12:58
ok grazie mille oggi inserisco :asd:

Arsenico_IV
21-04-2009, 16:41
Mi riaggancio a questa discussione per rilanciare un mio problema analogo: io avrei la necessità di avere un button trasparente o una picturebox trasparente o comunque qualsiasi cosa che mi generi un evento al click.

Il mio problema è che questi oggetti (button, picturebox o altro) sarebbero più piccoli e sparsi un po' ovunque nel form.

In pratica dovrei avere una Picturebox nel form con un'immagine. Sopra a questa Picture box dovrebbero esserci dei button piccoli qua e là che non si devono vedere ma che se vengono cliccati generano un evento.

Si può fare? Non c'è una semplice proprietà di trasparenza?

MarcoGG
21-04-2009, 17:56
In pratica dovrei avere una Picturebox nel form con un'immagine. Sopra a questa Picture box dovrebbero esserci dei button piccoli qua e là che non si devono vedere ma che se vengono cliccati generano un evento.

Si può fare? Non c'è una semplice proprietà di trasparenza?


Sì, in pratica vuoi rendere sensibili al Click alcune porzioni dell'immagine sottostante senza che si vedano i pulsanti...
Puoi usare la mia soluzione anche in questo caso. Basta che ti limiti al disegno della porzione di Bmp nell'evento .Paint, escludendo invece il disegno della stringa di testo e della cornice, ottenendo pulsanti perfettamente trasparenti.
La proprietà di trasparenza c'è, ma spesso non funziona come molti sperano, bensì ripropone il colore o l'immagine di sfondo del container, e come abbiamo già visto, in CF2 usare una PictureBox come "container" da problemi. ;)

Arsenico_IV
22-04-2009, 10:03
Sì, in pratica vuoi rendere sensibili al Click alcune porzioni dell'immagine sottostante senza che si vedano i pulsanti...
Puoi usare la mia soluzione anche in questo caso. Basta che ti limiti al disegno della porzione di Bmp nell'evento .Paint, escludendo invece il disegno della stringa di testo e della cornice, ottenendo pulsanti perfettamente trasparenti.
La proprietà di trasparenza c'è, ma spesso non funziona come molti sperano, bensì ripropone il colore o l'immagine di sfondo del container, e come abbiamo già visto, in CF2 usare una PictureBox come "container" da problemi. ;)

Però se faccio così, non viene bene perchè la porzione di immagine nel button o nel PictureBox adibito a button viene più ingrandita rispetto all'originale e quindi non si sovrappongono, anche se il SizeMode è Normal

MarcoGG
22-04-2009, 11:22
Però se faccio così, non viene bene perchè la porzione di immagine nel button o nel PictureBox adibito a button viene più ingrandita rispetto all'originale e quindi non si sovrappongono, anche se il SizeMode è Normal

Non mi risulta. SizeMode deve essere Normal in tutte le PictureBox utilizzate, sia quella di sfondo, sia quelle usate come pulsanti, inoltre devono avere BorderStyle = None.
Inoltre il problema a cui ti riferisci spesso è dovuto ad una cattiva interpretazione in fase di lettura dei file compressi, come il Jpg. E' successo anche a me con una jpg di sfondo presa così com'era dal Web.
Sicuramente se usi .bmp le porzioni non presentano distorsioni, e così anche usando .jpg prodotti da programmi seri, come ad esempio il metodo "Salva per Web" di Photoshop...

Arsenico_IV
23-04-2009, 08:40
Non mi risulta. SizeMode deve essere Normal in tutte le PictureBox utilizzate, sia quella di sfondo, sia quelle usate come pulsanti, inoltre devono avere BorderStyle = None.
Inoltre il problema a cui ti riferisci spesso è dovuto ad una cattiva interpretazione in fase di lettura dei file compressi, come il Jpg. E' successo anche a me con una jpg di sfondo presa così com'era dal Web.
Sicuramente se usi .bmp le porzioni non presentano distorsioni, e così anche usando .jpg prodotti da programmi seri, come ad esempio il metodo "Salva per Web" di Photoshop...

Hai ragione! Infatti cambiando immagine funziona perfettamente.
Grazie, ciao!