[VB 6] Convertir une couleur système en RGB ? [résolu]

Convertir une couleur système en RGB ? [résolu] [VB 6] - VB/VBA/VBS - Programmation

Marsh Posté le 23-06-2002 à 03:13:24    

Une couleur système est un indice indiquant quelle couleur de la configuration windows utiliser (texte, fond, barre, sélection...)
 
Une couleur RGB utilise trois octets pour stocker les composantes rouge, vert, et bleu.
 
Elles sont donc très différentes, et je ne vois vraiment pas comment passer du mode système à RGB.


Message édité par Musaran le 26-06-2002 à 22:27:01

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 23-06-2002 à 03:13:24   

Reply

Marsh Posté le 23-06-2002 à 09:28:28    

je ne connais pas, mais je crois que la couleur système et en Hexadécimal ? si c'est le cas, ce n'est plus trés compliqué...il te suffit de convertir l'hexadeciaml en decimal... ;)


---------------
;) Bienvenue sur le site...:)             http://perso.wanadoo.fr/rapport
Reply

Marsh Posté le 23-06-2002 à 10:39:35    

essaye peut etre l'API GetSysColor
 
Declare Function GetSysColor Lib "user32" Alias "GetSysColor" (ByVal nIndex As Long) As Long
 
jamais testé , je pense que le paramatre index est l'octet de poid ort dont tu parle , et la fonction renvoie la couleur RGB.


Message édité par cerdoc le 23-06-2002 à 10:39:46
Reply

Marsh Posté le 23-06-2002 à 22:50:56    

macray a écrit a écrit :

je ne connais pas, mais je crois que la couleur système et en Hexadécimal ? si c'est le cas, ce n'est plus trés compliqué...il te suffit de convertir l'hexadeciaml en decimal... ;)  



Non, ce sont deux systèmes trop différents.
L'un me dit: n-ième couleur du système.
L'autre me dit: rouge tant, vert tant, bleu tant.
 

cerdoc a écrit a écrit :

essaye peut etre l'API GetSysColor
 
Declare Function GetSysColor Lib "user32" Alias "GetSysColor" (ByVal nIndex As Long) As Long
 
jamais testé , je pense que le paramatre index est l'octet de poid ort dont tu parle , et la fonction renvoie la couleur RGB.  




Ça doit être la bonne solution.
Je reviens dès que ça marche (ou pas).


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 24-06-2002 à 09:04:52    

musaran a écrit a écrit :

Non, ce sont deux systèmes trop différents.
L'un me dit: n-ième couleur du système.
L'autre me dit: rouge tant, vert tant, bleu tant.
 
 
Ça doit être la bonne solution.
Je reviens dès que ça marche (ou pas).  



:jap:


---------------
;) Bienvenue sur le site...:)             http://perso.wanadoo.fr/rapport
Reply

Marsh Posté le 24-06-2002 à 11:54:38    

Option Explicit
 
private Type RGB
  R As Long
  G As Long
  B As Long
End Type
 
private Function GetRGB(ByVal Color As Long) As RGB
  Dim The_Couleur As String
 
  The_Couleur = Right("000000" & Hex(Color), 6)
  With GetRGB
    .R = Val("&h" & Right(The_Couleur , 2))
    .G = Val("&h" & Mid(The_Couleur , 3, 2))
    .B = Val("&h" & Left(The_Couleur , 2))
  End With
 
End Function

Reply

Marsh Posté le 24-06-2002 à 20:40:32    

KarLKoX a écrit a écrit :

Option Explicit
 
private Type RGB
  R As Long
  G As Long
  B As Long
End Type
 
private Function GetRGB(ByVal Color As Long) As RGB
  Dim The_Couleur As String
 
  The_Couleur = Right("000000" & Hex(Color), 6)
  With GetRGB
    .R = Val("&h" & Right(The_Couleur , 2))
    .G = Val("&h" & Mid(The_Couleur , 3, 2))
    .B = Val("&h" & Left(The_Couleur , 2))
  End With
 
End Function  




 
oh ça c'est bien vu !

Reply

Marsh Posté le 24-06-2002 à 21:29:21    


Public Declare Function GetSysColor Lib "USER32.DLL" (ByVal nIndex As Long) As Long
 
 
Public Function Get_Color(ByVal nColor As Long) As Long
 
    Get_Color = IIf(nColor And &H80000000, GetSysColor(nColor And &H7FFFFFFF), nColor)
 
End Function


 
Tu lui file une couleur RGB normale ou système, ca te retourne la couleur traduite (ou pas)
 
 
Apres, pour les composantes R,G,B, tu utilises ca :
 


Public Type RGB_Def
  R As Long
  G As Long
  B As Long
End Type
 
Public Function Get_RGBValues(Byval nColor As Long) As RGB_Def
 
    nColor = Get_Color(nColor)
 
    Get_RGBValues.R = nColor Mod 256
    nColor = nColor \ 256
    Get_RGBValues.G = nColor Mod 256
    nColor = nColor \ 256
    Get_RGBValues.B = nColor
 
End Function


 
Je pense que c'est bien plus rapide que de faire une suite de concaténations et de conversions de chaines....

Reply

Marsh Posté le 25-06-2002 à 16:07:12    

justement non, moi aussi je bitshiftais mais en VB, c'est un poil plus long (testé avec GetTickCount).

Reply

Marsh Posté le 26-06-2002 à 01:48:55    

N'en jetez plus !
 
Mon idée est de faire la moyenne de la couleur sytème "grisé" et rouge pour indiqué qu'un path n'est pas valide, même s'il est désactivé.
 
Je vous montrerais mon "Oeuvre" dès qu'elle sera prête (y'a pas le feu au lac).
 
karlkox as-tu essayé avec une string de longueur fixe ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 26-06-2002 à 01:48:55   

Reply

Marsh Posté le 26-06-2002 à 21:30:13    

oui c'est pour ca que j'utilise space$ a la place :)

Reply

Marsh Posté le 26-06-2002 à 22:19:28    

La valeur des couleurs système est dans l'octet de poids faible, contrairement à ce que j'avais dit dans mon premier post.
Les couleurs système sont simplement marquées par le bit de poids fort à 1.
 
KarLKoX
Attention avec GetTickCount, cette horloge a un pas de 10 à 55 ms, et elle tourne même lorsque le process chronométré est préempté.
Je crois que j'ai mieux, je cherche et je le poste.
 
Tu as chronométré quoi ? L'environnement Visual Basic (interprété, favorisant le texte) est très différent de l'exécutable (compilé, favorisant les entiers).
 
Note:
Le shiftage par division par une puissance de 2 n'est malheureusement pas optimisé en vrai décalage, car Long est un type signé, et que pour un nombre négatif le décalage est différent d'une division/multiplication par 2.
 
 
Enfin, toujours est-il que ça marche, voici mon code:

Declare Function GetSysColor Lib "USER32.DLL" (ByVal nIndex As Long) As Long
 
'helper
Function AvgLong(ByVal Arg1 As Long, ByVal Arg2 As Long) As Long
   AvgLong = (Arg1 + Arg2) / 2
End Function
 
'Color handling
Function Color_SysToRGB(ByVal SysColor As Long) As Long
   Color_SysToRGB = GetSysColor(SysColor And &H7FFFFFFF)
End Function
 
Function Color_AnyToRGB(ByVal ArgColor As Long) As Long
   If (ArgColor And &H80000000) Then ArgColor = Color_SysToRGB(ArgColor)
   Color_AnyToRGB = ArgColor
End Function
 
Function Color_BlendRGB(ByVal Arg1 As Long, ByVal Arg2 As Long) As Long
   Dim RPart As Long
   Dim GPart As Long
   Dim BPart As Long
   
   RPart = AvgLong(Arg1 And &HFF, Arg2 And &HFF)
   GPart = AvgLong(Arg1 And &HFF00, Arg2 And &HFF00)
   BPart = AvgLong(Arg1 And &HFF0000, Arg2 And &HFF0000)
   
   Color_BlendRGB = RPart Or GPart Or BPart
End Function
 
'code utilisateur
Private Sub txt_Change()
   txt.ForeColor = IIf(Exists, _
      IIf(Grayed, vbGrayText, vbWindowText), _
      IIf(Grayed, Color_BlendRGB(vbRed, Color_SysToRGB(vbGrayText)), vbRed))
End Sub


Message édité par Musaran le 26-06-2002 à 22:22:54

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed