Newsgroup: it.comp.lang.visual-basic
Titolo: [!] Scomporre un colore nelle componenti RGB

E' una scemenza, ma visto che ci ho picchiato un po' la testa prima di
capire il problema, lo posto a tutti.
Per scomporre un colore nelle sue componenti RGB usavo questa funzione:
Private Type TipoRGB
   R As Integer
   G As Integer
   B As Integer
End Type
Private Function RgbColore(ByVal dColore As Double) As TipoRGB
   RgbColore.R = dColore Mod 256
   RgbColore.G = ((dColore \ 256) Mod 256)
   RgbColore.B = (dColore \ 65536)
End Function
Si perņ si utilizza ad esempio il colore di sfondo preso direttamente dalle
proprietą di un controllo, č possibile che faccia riferimento ad uno dei
colori di sistema. In questo caso il valore assunto č compreso tra
&H80000000 e &H8000000F, e se passato alla suddetta funzione produce
risultati assurdi.
Per avere il valore di colore corretto, bisogna chiamare l'API GetSysColor,
Ecco la suddetta funzione debitamente corretta
Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As
Long
Private Function RgbColore(ByVal dColore As Double) As TipoRGB
   If dColore < 0 Then
      dColore = GetSysColor((dColore - &H80000000))
   End If
   RgbColore.R = dColore Mod 256
   RgbColore.G = ((dColore \ 256) Mod 256)
   RgbColore.B = (dColore \ 65536)
End Function
Ecco qui. Magari ho reinventato l'acqua calda, ma tant'č.
Ciao a tutti
*Roby*

 ha scritto nel messaggio
news:9kbfpa$3okfc$1...@ID-94194.news.dfncis.de...
| E' una scemenza, ma visto che ci ho picchiato un po' la testa prima di
| capire il problema, lo posto a tutti.
|
| Per scomporre un colore nelle sue componenti RGB usavo questa funzione:
|
| Private Type TipoRGB
|    R As Integer
|    G As Integer
|    B As Integer
| End Type
|
| Private Function RgbColore(ByVal dColore As Double) As TipoRGB
|    RgbColore.R = dColore Mod 256
|    RgbColore.G = ((dColore \ 256) Mod 256)
|    RgbColore.B = (dColore \ 65536)
| End Function
|
| Si però si utilizza ad esempio il colore di sfondo preso direttamente
dalle
| proprietà di un controllo, è possibile che faccia riferimento ad uno dei
| colori di sistema. In questo caso il valore assunto è compreso tra
| &H80000000 e &H8000000F, e se passato alla suddetta funzione produce
| risultati assurdi.
| Per avere il valore di colore corretto, bisogna chiamare l'API
GetSysColor,
|
| Ecco la suddetta funzione debitamente corretta
|
| Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long)
As
| Long
|
| Private Function RgbColore(ByVal dColore As Double) As TipoRGB
|    If dColore < 0 Then
|       dColore = GetSysColor((dColore - &H80000000))
|    End If
|    RgbColore.R = dColore Mod 256
|    RgbColore.G = ((dColore \ 256) Mod 256)
|    RgbColore.B = (dColore \ 65536)
| End Function
|
| Ecco qui. Magari ho reinventato l'acqua calda, ma tant'è.
|
| Ciao a tutti
| *Roby*
|
|

     B% = (X& And &HFF0000) \ &H10000
In questo caso perň sono + rapido io, che faccio una sola divisione invece
di un AND + una divisione. L'AND č inutile perchč la divisione intera
elimina automaticamente quello che tu elimini prima con l'AND.
(Io facevo cosě)
RgbColore.B = (dColore \ 65536)
Ciao
*Roby*

 End Function
Io uso questa:
Function adGetVBSysColor(ByVal vbSysColorConstant As SystemColorConstants)
As OLE_COLOR
    ' ritorna il valore RGB del colore di sistema dato il colore vb*
    adGetVBSysColor = GetSysColor(-(&H80000000 - vbSysColorConstant))
End Function
Forse tu l'avevi dichiarato Double perchè ti andava in overflow.
Fai come faccio io e il problema magicamente scompare :)
Ciao