Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Controllo Text non supporta colori di sfondo trasparenti
Forum - C# / VB.NET - Controllo Text non supporta colori di sfondo trasparenti

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
alip1 (Normal User)
Pro


Messaggi: 145
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 13:17
Mercoledì, 12/06/2024
Buongiorno non so so se il problema sia stato già affrontato o meno, in caso mi passerete i link..
Ad ogni modo sto riscontrando questa problematica.
In una applicazione, in via di sviluppo con VB2012, ho la necessità di assegnare un certo colore alla proprietà backcolor di una textbox.  Il colore è memorizzato in decimale in un certo campo di una tabella del db in sql. Ad esempio posso trovare il valore 255 oppure 65535, etc...
Ora questi valori non so come fare per passarli alla proprietà backcolor di una text box....
Ho provato a trasformarli in esadecimale 255--> #FF e quindi a passarli così:
Codice sorgente - presumibilmente VB.NET

  1. Dim stEXColor As String
  2.  dim decolor as integer
  3.  decolor = 255      ' letto da db
  4.  stEXColor= "#" & Convert.ToString(DecColor, 16)     '---> #FF
  5.  txtInfo.backcolor=color.fromname(stEXColor)



ma ottengo sempre l'errore: 5 il controllo non supporta colori di sfondo trasparenti.

Come posso fare per far si che il controllo assumi il colore desiderato? Grazie per ogni suggerimento

Ultima modifica effettuata da alip1 il 12/06/2024 alle 13:24
PM Quote
Avatar
Carlo (Member)
Guru^2


Messaggi: 1417
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 20:01
Mercoledì, 12/06/2024
Il codice che hai proposto non può passare il nome di un colore e il valore arbitrario ricavato va ad impostare il canale alpha, non supportato dalla proprietà backColor di una textBox.

Se nel tuo DB hai dei colori in un range 0...65535, bisogna sapere come sono implementati, presupponendo che siano RGB565, è sufficiente scrivere una funzione che passato DBColor restituisca i rispettivi RGB a 8 bit come vuole VB .Net

Codice sorgente - presumibilmente VB.NET

  1. Dim DBColor As Integer = 255      ' letto da db
  2. TxtInfo.BackColor = ConvertDecColor(DBColor)
  3.  
  4.  
  5.  
  6. Public Function ConvertDecColor(decColor As Integer) As Color
  7.         ' Estrarre i bit per ogni componente
  8.         Dim r As Integer = (decColor >> 11) And &H1F ' 5 bit per il rosso
  9.         Dim g As Integer = (decColor >> 5) And &H3F  ' 6 bit per il verde
  10.         Dim b As Integer = decColor And &H1F         ' 5 bit per il blu
  11.  
  12.         ' Convertire da 5/6 bit a 8 bit (0-255)
  13.         r = CInt((r / 31.0) * 255)
  14.         g = CInt((g / 63.0) * 255)
  15.         b = CInt((b / 31.0) * 255)
  16.  
  17.         ' Restituire il colore come un oggetto Color
  18.         Return Color.FromArgb(r, g, b)
  19. End Function



Controlla se hai corrispondenza, altrimenti i bit sono usati in modo diverso, per esempio se i colori nel DB hanno un range 0...16777215, allora RGB è a 8 bit e tutto è più facile.

Per risalire alla codifica sarebbe facile se si sapesse quanto vale bianco, nero, rosso, verde e blu.

in allegato i 65536 colori rappresentabili in RGB565, ricavati con due cicli 256x256


Carlo ha allegato un file: 65mila colori.jpg (18065 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Carlo il 12/06/2024 alle 21:11


in programmazione tutto è permesso
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2335
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 23:30
Mercoledì, 12/06/2024
Non sapendo esattamente un valore, e difficile aiutarti.
hai detto che hai valori decimali ma nel tuo esempio hai scritto: 65535
in questo caso penso bisogna fare uno shift di 8  bit.
tenendo presente che ogni colore è formato da 24bit.

Per quanto riguarda al colore trasparente,  una normale TextBox non supporta di default il colore trasparente come backcolor.
nemmeno applicando lo stile al costruttore avendo ereditato la classe
esempio:

Codice sorgente - presumibilmente C# / VB.NET

  1. public MiaTextBox : TextBox
  2. {
  3.  
  4. public MiaTextBox()
  5. {
  6.    SetStyle(ControlStyles.SupportsTransparentBackColor, true);
  7.   BackColor = Color.Transparent; // Non funzionerà sulla TextBox
  8. }
  9.  
  10. }



Consiglio invece di accedere alla proprietà Parent  per ottenere il BackColor del controllo contenitore.
Si può costruire una TextBox con backColor Trasparente, ma è un operazione abbastanza lunga da scrivere e da fare.
Niente chiamate api ecc. ecc. ma si deve ricostruire completamente il controllo.

Ora non ricordo più nemmeno una virgola del vb.net (anche se iniziai proprio da quello :_doubt: )
Quindi non ho testato il metodo di carlo, Ma penso che carlo non spara baggianate e sà quel che fà.
Dovrebbe funzionare anche se usa un metodo diverso dal mio.


Edit:
Se serve, ho trovato questa pagina:

https://www.iditect.com/faq/csharp/mapping-an-integer-to-an ...

Ultima modifica effettuata da Thejuster il 12/06/2024 alle 23:31


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Carlo (Member)
Guru^2


Messaggi: 1417
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 1:47
Giovedì, 13/06/2024
Infatti avevo anticipato che se la conversione è per colori con un range 0...16777215, tutto è più facile.

Codice sorgente - presumibilmente VB.NET

  1. Public Function Convert24bitColor(decColor As Integer) As Color
  2.         ' Estrarre i bit per ogni componente
  3.         Dim r As Integer = (decColor >> 16) And &HFF ' 8 bit per il rosso
  4.         Dim g As Integer = (decColor >> 8) And &HFF ' 8 bit per il verde
  5.         Dim b As Integer = decColor And &HFF ' 8 bit per il blu
  6.  
  7.         ' Restituire il colore come un oggetto Color
  8.         Return Color.FromArgb(r, g, b)
  9. End Function



Per comprendere il codice è sufficiente sapere che i 16 milioni di colori sono rappresentati da 24 bit. RRRRRRRRGGGGGGGGBBBBBBBB
Per estrarre il colore rosso rappresentato dagli 8 bit a sinistra, si fa scorrere tutti i bit di 16 posizioni a destra in modo che gli 8 bit a sinistra vanno tutti a destra 0000000000000000RRRRRRRR a quel punto con And &HFF si catturano 8 bit a destra.
Per estrarre il colore verde rappresentato dagli 8 bit centrali, si fa scorrere tutti i bit di 8 posizioni a destra in modo che gli 8 bit centrali vanno tutti a destra 00000000RRRRRRRRGGGGGGGG a quel punto con And &HFF si catturano 8 bit a destra.
Per estrarre il colore blu rappresentato dagli 8 bit a destra,  RRRRRRRRGGGGGGGGBBBBBBBB con And &HFF si catturano 8 bit a destra.

La stessa tecnica è usata nel codice precedente ma per un valore in ingresso che rappresenta lo spazio colore a 16 bit (RGB565) RRRRRGGGGGGBBBBB, per quello prima scorro 11 bit poi 5 e maschero con &H1F (5Bit &B11111) e &H3F (6Bit &B111111)


Ultima modifica effettuata da Carlo il 13/06/2024 alle 1:56


in programmazione tutto è permesso
PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 145
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 12:03
Giovedì, 13/06/2024
Intanto Grazie Carlo e grazie a tutti.

Ho provato entrambe le routine sia quella convertdeccolor, sia convert24bitcolor....

Risultati: ovviamente l'errore non si verifica più, ma i colori ottenuti non sono quelli sperati.

Intanto preciso che bachcolor del form in cui sono le tre textbox è settato, a livello di progetto, a white... mentre il forecolor delle textbox è settato a blu...

I colori nella tabella config sono settati da una semplice app scritta in access per cui setta i colori con il valore delle costanti di colore in vba... e sono memorizzati in decimali.
Per ora nel db mi ritrovo con tre rec che hanno nel campo specifico questi colori:

    255    per vbRed      -> 0xFF0000 ' rosso
   33023                      -> 0xFF8000 ' una sfumatara di arancione
   65535 per vbYellow   -> 0xFFFF00  ' giallo
   65408                      ->  0x80FF00 ' una sfumatura di verde

Ora passando questi valori decimali ottengo (riporto i risultati per rosso e giallo in particolare, per gli altri due il colore visibile):

Dalla routine convert24bitcolor ottengo i seguenti valori:
    per 255     il colore ARGB: 255,0,0,255 (che è un blu scuro)  invece di: 255,255,0,0 (il valore del rosso color.red)
    per 65535                        ho:  255,0,255,255 invece di 255,255,255,0   (il valore del giallo color.yellow)
    per 33023 (sfumatura di arancione in access) mi restituisce una specie di celestino
    per 65408 (sfumatura di verde in access) mi restituisce un verde chiaro

Invece dalla routine convertdeccolor ottengo i seguenti valori:
    per 255     il colore ARGB: 255,0,28,255 (che è un blu scuro)  invece di: 255,255,0,0 (il valore del rosso color.red)
    per 65535                        ho:  255,255,255,255 invece di 255,255,255,0   (il valore del giallo color.yellow)
    per 33023 (sfumatura di arancione in access) mi restituisce una specie di lilla
    per 65408 (sfumatura di verde in access) mi restituisce una sfumatura di giallo.

Da quando osservato credo che probabilmente nelle routine c'è qualcosa che non va...forse il valore decimale sarebbe meglio convertirlo in esadecimale?
Cosa ne pensi Marco?? Grazie non riesco a venirne a capo..


Ultima modifica effettuata da alip1 il 13/06/2024 alle 12:09
PM Quote
Avatar
Carlo (Member)
Guru^2


Messaggi: 1417
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 13:49
Giovedì, 13/06/2024
Testo quotato

Postato originariamente da alip1:

I colori nella tabella config sono settati da una semplice app scritta in access per cui setta i colori con il valore delle costanti di colore in vba... e sono memorizzati in decimali.
Per ora nel db mi ritrovo con tre rec che hanno nel campo specifico questi colori:

    255    per vbRed      -> 0xFF0000 ' rosso
   33023                      -> 0xFF8000 ' una sfumatara di arancione
   65535 per vbYellow   -> 0xFFFF00  ' giallo
   65408                      ->  0x80FF00 ' una sfumatura di verde

Da quando osservato credo che probabilmente nelle routine c'è qualcosa che non va...forse il valore decimale sarebbe meglio convertirlo in esadecimale?
Cosa ne pensi Marco?? Grazie non riesco a venirne a capo..





I colori in VBA sono a 24 bit memorizzati: BBBBBBBBGGGGGGGGRRRRRRRR

La funzione diventa:

Codice sorgente - presumibilmente VB.NET

  1. Public Function Convert24bitColor(decColor As Integer) As Color
  2.         ' Estrarre i bit per ogni componente
  3.         Dim b As Integer = (decColor >> 16) And &HFF ' 8 bit per il blu
  4.         Dim g As Integer = (decColor >> 8) And &HFF ' 8 bit per il verde
  5.         Dim r As Integer = decColor And &HFF ' 8 bit per il rosso
  6.  
  7.         ' Restituire il colore come un oggetto Color
  8.         Return Color.FromArgb(r, g, b)
  9. End Function



I valori sono sempre e solo rappresentati in bit, come li visualizzi nel codice: esadecimale, decimale o quello che vuoi è ininfluente.
La funzione lavora sui bit senza passaggi intermedi, ma restituisce i valori decimali in RGB accettati dall'oggetto Color di VB .Net :k:

Chi è Marco??

Ultima modifica effettuata da Carlo il 13/06/2024 alle 14:49


in programmazione tutto è permesso
PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 145
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 17:48
Giovedì, 13/06/2024
Testo quotato

Postato originariamente da Carlo:

Testo quotato

Postato originariamente da alip1:

I colori nella tabella config sono settati da una semplice app scritta in access per cui setta i colori con il valore delle costanti di colore in vba... e sono memorizzati in decimali.
Per ora nel db mi ritrovo con tre rec che hanno nel campo specifico questi colori:

    255    per vbRed      -> 0xFF0000 ' rosso
   33023                      -> 0xFF8000 ' una sfumatara di arancione
   65535 per vbYellow   -> 0xFFFF00  ' giallo
   65408                      ->  0x80FF00 ' una sfumatura di verde

Da quando osservato credo che probabilmente nelle routine c'è qualcosa che non va...forse il valore decimale sarebbe meglio convertirlo in esadecimale?
Cosa ne pensi Marco?? Grazie non riesco a venirne a capo..





I colori in VBA sono a 24 bit memorizzati: BBBBBBBBGGGGGGGGRRRRRRRR

La funzione diventa:

Codice sorgente - presumibilmente VB.NET

  1. Public Function Convert24bitColor(decColor As Integer) As Color
  2.         ' Estrarre i bit per ogni componente
  3.         Dim b As Integer = (decColor >> 16) And &HFF ' 8 bit per il blu
  4.         Dim g As Integer = (decColor >> 8) And &HFF ' 8 bit per il verde
  5.         Dim r As Integer = decColor And &HFF ' 8 bit per il rosso
  6.  
  7.         ' Restituire il colore come un oggetto Color
  8.         Return Color.FromArgb(r, g, b)
  9. End Function



I valori sono sempre e solo rappresentati in bit, come li visualizzi nel codice: esadecimale, decimale o quello che vuoi è ininfluente.
La funzione lavora sui bit senza passaggi intermedi, ma restituisce i valori decimali in RGB accettati dall'oggetto Color di VB .Net :k:

Chi è Marco??



Grazie Carlo, come sempre notevole le tue competenze sono uniche, grazie ancora una volta funziona alla perfezione....:hail:
P:S: Scusa mio genero si chiama Marco, mi sono sbagliato...:pat:

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2335
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 21:41
Giovedì, 13/06/2024
l'avevo detto dall'inizio che bisognava fare lo shift di 8 bit :rotfl:
0 8 16
L'importante che carlo ti ha aiutato e funziona regolarmente :k:


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 145
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 7:05
Venerdì, 14/06/2024
Buongiorno Carlo.
Solo una domanda di curiosita': dove è possibile apprendere che il formato in bit dei colori in vba ha quello da te correttamente indicato 8b8g8r? Grazie

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo