Shaped Form

martedì 11 dicembre 2007 - 11.36

aiedail92 Profilo | Expert

Ciao a tutti!

Ho un problema con il mio shaped form. Per ottenerlo ho usato un'immagine a sfondo rosso e poi nel form ho settato la proprietà TransparencyKey su Red, in modo da "vedere attraverso" il colore rosso.
Finché lavoro in risoluzione a 16 bit non ci sono problemi, ma se passo ai colori a 32-bit, mi ritrovo con l'immagine normale a sfondo rosso.
Esiste un modo per eliminare questo problema?
Oppure mi potreste dire come cambiare in runtime la risoluzione dello schermo?

Grazie anticipatamente per l'aiuto

Luca

the_follet Profilo | Newbie

Ciao omonimo
In verità non credo proprio che la profondità del colore c'entri qualcosa.
Secondo me devi semplicemente assicurarti che il codice colore che usi come maschera di trasparenza corrisponda effettivamente a quello con cui hai colorato l'immagine che usi come sfondo.
Potrebbe darsi che con una profondità bassa il colore viene "arrotondato" a quello più prossimo e quando passi ad una profondità maggiore (anche se in effetti è strano) i codici colore non corrispondono più.
Per cui, se usi un codice colore univoco (supportato anche dalla risoluzione a 16 bit) il problema non dovrebbe riproporsi.
Prova a fare dei test in runtime ricavandoti i vari valori di Red Green e Blu e vedi se corrispondono (magari utilizzando lo strumento "color picker" di Photoshop).
Con gli shaped forms e le trasparenze non ho mai incontrato questo problema...

Saluti,
Luca

aiedail92 Profilo | Expert

>Potrebbe darsi che con una profondità bassa il colore viene "arrotondato"
>a quello più prossimo e quando passi ad una profondità maggiore
>(anche se in effetti è strano) i codici colore non corrispondono
>più.

É quello che ho pensato anch'io all'inizio. Ho fatto una prova aggiungendo una label al form che mi indica in ogni momento la composizione del colore sul quale punta il mouse. Ho quindi "analizzato" tutta la superficie dell'immagine, e nei punti dello sfondo mi dà come colore Alpha 255, R 255, G 0, B 0, quindi un rosso puro. Ho settato la proprietà TransparencyKey su Red, e per sicurezza ho aggiunto all'evento Load la seguente istruzione

Me.TransparencyKey = Color.FromArgb(255, 255, 0, 0)

Ma ancora non funziona!!!!!
Se a te non capita magari è un problema della mia macchina. Se vuoi posso provare a mandarti il mio compilato e vedere se sul tuo computer va?

Grazie per il tempo che mi hai dedicato

the_follet Profilo | Newbie

Ok, manda pure
Magari più che il compilato sarebbe utile la parte del progetto relativa alla shaped form.

the_follet Profilo | Newbie

Ok, forse ho trovato come risolvere.

Innanzitutto ti dico che sul mio pc il problema che hai riscontrato NON si ripropone.
Ho provato sia a lanciare direttamente l'eseguibile che a ricompilare il progetto, cambiando la profondità di colore svariate volte.

Il che, per quanto strano, può significare che il problema è effettivamente legato al tuo pc.

Ad ogni modo, ecco un tentativo che puoi fare.

Come immagine usa un .PNG (che supporta la trasparenza) ed anzichè il colore rosso usa direttamente la trasparenza nell'immagine.

Poi imposta form.backgroundcolor sullo stesso valore della trasparency key.
In questo modo hai anche un altro vantaggio: il form lo trascini solo quando fai click sull'immagine e non anche quando fai click su un'area vuota (cioè trasparente).
Il form, in pratica, si comporterà proprio come se fosse "vuoto" e non semplicemente trasparente.
Immagino che non ti interessi il trascinamento quando clicki su un area vuota del form...

Io con i miei shaped form ho sempre fatto così e non ho mai avuto problemi.
Se poi dovessi continuare a vedere lo sfondo rosso magari potresti pensare di fare una prova cambiando la scheda grafica...

Fammi sapere se sei riuscito a risolvere
Bye,
Luca

aiedail92 Profilo | Expert


>Come immagine usa un .PNG (che supporta la trasparenza) ed anzichè
>il colore rosso usa direttamente la trasparenza nell'immagine.

Che programma devo usare per impostare la trasparenza di un file .PNG?

>Poi imposta form.backgroundcolor sullo stesso valore della trasparency
>key.
>In questo modo hai anche un altro vantaggio: il form lo trascini
>solo quando fai click sull'immagine e non anche quando fai click
>su un'area vuota (cioè trasparente).
>Il form, in pratica, si comporterà proprio come se fosse "vuoto"
>e non semplicemente trasparente.
>Immagino che non ti interessi il trascinamento quando clicki
>su un area vuota del form...

Lavorando in profondità 16 bit ottenevo lo stesso risultato, cioè il form era effettivamente vuoto, non solo trasparente.
Ho notato invece che impostando come mi hai detto la proprietà BackColor sullo stesso valore di TransparencyKey, i controlli presenti sul Form la ereditano, e attraverso di questi riesco a vedere, mentre il form mi rimane sempre a sfondo rosso!

>Se poi dovessi continuare a vedere lo sfondo rosso magari potresti
>pensare di fare una prova cambiando la scheda grafica...

L'unico problema è che uso un portatile, e non so se sia molto facile un cambio di scheda video...

Grazie per il suggerimento

the_follet Profilo | Newbie

>Che programma devo usare per impostare la trasparenza di un file
>.PNG?

Photoshop ad esempio. Io uso solo quello, quindi non saprei suggerirti altri programmi di fotoritocco...


>Ho notato invece che impostando come mi hai detto la proprietà
>BackColor sullo stesso valore di TransparencyKey, i controlli
>presenti sul Form la ereditano...

Non proprio. Le labels di default sono settate con sfondo trasparente. Quindi non è che ereditano il colore, ma semplicemente ci "vedi attraverso". Ovviamente per i controlli la proprietà backcolor la puoi sempre cambiare, non è vincolata al form.


> ...e attraverso di questi riesco
>a vedere, mentre il form mi rimane sempre a sfondo rosso!

Si perchè finchè non setti l'immagine di sfondo con colore trasparente continui a vedere il rosso che sta sull'immagine (e non il rosso che hai settato come sfondo del form).


>L'unico problema è che uso un portatile, e non so se sia molto
>facile un cambio di scheda video...

Ops... credevo usassi un pc desktop...

Cmq secondo me se riesci ad editare l'immagine di sfondo e ci setti la trasparenza risolvi tutto.

Te ne puoi rendere conto con un test molto semplice:
NON usare alcuna immagine di sfondo;
metti sul form un controllo qualsiasi, ad esempio un pulsante;
setta la proprietà backcolor del form allo stesso valore della transparency key.

Se lanciando il programma la trasparenza ti funziona (a prescindere dalla profondità di colore) e vedi solo il pulsante sul form, allora è fatta, aggiungi lo sfondo .PNG con le aree trasparenti e ti funzionerà sicuramente.

Attendo di conoscere l'esito
Ciao,
Luca

aiedail92 Profilo | Expert

Niente...

Ho fatto una prova con altri computer, sembra che il problema sia proprio nel mio.

Grazie comunque per l'aiuto.

Ciao,

Luca

matpez Profilo | Newbie

Ciao anche io ho lo stesso tuo problema..... quindi potrebbe dipendere da alcune schede grafiche... nelle immagini a 32bit di profondità di colore non prende la trasparenza!

Utilizzando però il consiglio di the_follet con le png si ovvia al problema!


Ottimo lavoro!

aiedail92 Profilo | Expert

Ciao,

Non essendo riuscito a usare il .png, e non avendo Photoshop, io mi sono arrangiato in un modo diverso.
In pratica ho creato una classe che contiene un'immagine, ho aggiunto una proprietà DefaultColor che quando cambia modifica tutti i pixel dell'immagine corrispondenti al colore su trasparente e ho aggiunto tutte le proprietà e i metodi della classe image. Ho dovuto fare così perchè non sono riuscito ad ereditare la classe Image. Quando faccio così:

class InheritsFromImage : System.Drawing.Image { }

Mi viene fuori l'errore "Per il tipo System.Drawing.Image non sono definiti costruttori." Questo accade sia che io inserisca sia che non lo faccia un costruttore nella classe. Credo che significhi che la classe Image non ha dei costruttori, ma allora come mai se non inserisco un costruttore l'errore arriva lo stesso?

É meglio che apro un altro thread?

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5