Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1634 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°163999
Musaran
Cerveaulté
Posté le 23-06-2002 à 03:13:24  profilanswer
 

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
mood
Publicité
Posté le 23-06-2002 à 03:13:24  profilanswer
 

n°164004
macray
Posté le 23-06-2002 à 09:28:28  profilanswer
 

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
n°164019
cerdoc
Comment l'AK47 à changé ma vie
Posté le 23-06-2002 à 10:39:35  profilanswer
 

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
n°164256
Musaran
Cerveaulté
Posté le 23-06-2002 à 22:50:56  profilanswer
 

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
n°164348
macray
Posté le 24-06-2002 à 09:04:52  profilanswer
 

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
n°164455
karlkox
Posté le 24-06-2002 à 11:54:38  profilanswer
 

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

n°164969
cerdoc
Comment l'AK47 à changé ma vie
Posté le 24-06-2002 à 20:40:32  profilanswer
 

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 !

n°165001
spark
Luc ?
Posté le 24-06-2002 à 21:29:21  profilanswer
 


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....

n°165554
karlkox
Posté le 25-06-2002 à 16:07:12  profilanswer
 

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

n°165996
Musaran
Cerveaulté
Posté le 26-06-2002 à 01:48:55  profilanswer
 

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
mood
Publicité
Posté le 26-06-2002 à 01:48:55  profilanswer
 

n°166727
karlkox
Posté le 26-06-2002 à 21:30:13  profilanswer
 

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

n°166740
Musaran
Cerveaulté
Posté le 26-06-2002 à 22:19:28  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[c] Comment convertir un entier en char ...Convertir un fichier dvi en pdf sous windows
[Delphi] Fermer une application ouverte avec delphi [résolu][SQL] Problème de TimeOut [Résolu]
[PHP - MySQL] Problème connexion BDD MySQL (résolu)comment imbriquer des menus .....? [RESOLU]
Mettre une image en fond de form + pb DBlookupCombobox [RESOLU][ PHP ] Probleme pour systeme de News (DATE)
oracle:date systeme??SQL debutant cherche erreur syntaxe [resolu]
Plus de sujets relatifs à : [VB 6] Convertir une couleur système en RGB ? [résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR