Valeur d'une couleur système [Résolu]

Menerlach 57 Messages postés dimanche 2 décembre 2012Date d'inscription 1 juin 2015 Dernière intervention - 14 déc. 2014 à 15:14 - Dernière réponse : Menerlach 57 Messages postés dimanche 2 décembre 2012Date d'inscription 1 juin 2015 Dernière intervention
- 15 déc. 2014 à 16:57
Bonjour,

Comment avoir la valeur d'une couleur système, par exemple "espace de travail de l'application" de façon à choisir des couleurs en fonction de celles du système, par exemple pour assombrir les éléments d'une feuille ?

Merci
Afficher la suite 

10 réponses

Répondre au sujet
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 14/12/2014 à 16:41
0
Utile
Bonjour,
Tu parles bien des couleurs système ?
Sous quoi développes-tu ? VB6 ou VB.Net (ce n'est pas la même chose) ...
Sous VB6, elles sont définissables par des constantes (voir rubrique des constantes - sous-rubrique couleurs dans ton aide VB6)
Tu as par ailleurs sur ce lien :
http://msdn.microsoft.com/en-us/library/1chc103x%28v=vs.90%29.aspx
un tableau des correspondances de ces constantes VB6 en VB.Net

PS : je' ne comprends par ailleurs pas la nécessité de connaître une "couleur système" pour l'assombrir ou l'éclaircir. Qu'elle soit "system" ou non, une couleur est transformable en en transformant ses composantes RGB

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
Menerlach 57 Messages postés dimanche 2 décembre 2012Date d'inscription 1 juin 2015 Dernière intervention - 14 déc. 2014 à 23:23
0
Utile
Merci de me répondre, le programme est en VB6.

Malheureusement je savais déjà tout ça mais pour transformer une couleur en changeant ses composantes RVB encore faut-il les connaître !

Si c'est une couleur de la palette, pas de problème mais si c'est une couleur système on se retrouve avec un nom de constante (par exemple vbWindowBackground) ou avec un numéro d'ordre dans les couleurs système (par exemple 0x80000005) et on n'est pas plus avancé, on ne connait pas la valeur RVB de la "Couleur d'arrière-plan de la fenêtre" et on est donc dans l'impossibilité de faire varier ses valeurs !

Pour le moment je n'ai trouvé de réponse ni dans la doc du basic ni sur internet...
Commenter la réponse de Menerlach
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 15/12/2014 à 01:39
0
Utile
Que me racontes-tu là ?
Les constantes représentent des numériques de type long
et donc : exemple :
toto = vbWindowBackground
MsgBox toto

t'affichera le long correspondant à la constante vbWindowBackground

C'est donc à partir de ce numérique que tu dois calculer la valeur de chacune des composantes de cette couleur.
Je pense que tu sais faire cela (de nombreux exemples de ce calcul sur ce forum).
Tu n'as d'ailleurs même pas besoin de passer par une variable toto. Le calcul peut utiliser directement la constante, puisqu'égale à un numérique.
Je ne vois pas quel est ton problème.

PS : quant à 0x80000005, ce n'est pas un " numéro d'ordre dans les couleurs système ", mais la valeur hexa de la couleur .
Regarde ===>>

MsgBox Hex(vbWindowBackground) & vbCrLf & "0x80000005"


dit encore autrement :
MsgBox Val("&H80000005") = vbWindowBackground

t'affichera True, bien évidemment.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
Menerlach 57 Messages postés dimanche 2 décembre 2012Date d'inscription 1 juin 2015 Dernière intervention - 15 déc. 2014 à 09:55
0
Utile
Ben non, la valeur de la couleur système n'est pas la valeur RVB la preuve est que cette valeur ne change pas si l'on change les couleurs systèmes. J'ai fais le test avec la couleur dénommée "Espace de travail de l'application" sa valeur est &H8000000C, le 8 c'est pour obtenir un signe négatif qui distingue les couleurs systèmes des autres, quand au C qu'est-ce que c'est d'autre qu'un numéro ? Du point de vue couleur la valeur ne porte que sur l'octet de droite c'est à dire sur le rouge alors que sur mon ordinateur cette couleur est un gris dont la vraie valeur est &00AAAAAA... Comment trouver ce AAAAAA autrement que par tâtonnement ?
Commenter la réponse de Menerlach
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 15/12/2014 à 10:01
0
Utile
C'est parce que tu n'as pas "traduit" en couleur "habituelle".
Il te faut la traduire avant.
Cette traduction se fait comme montré ici (exemple) :
http://vbnet.mvps.org/index.html?code/system/oletranslatecolor.htm


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 15/12/2014 à 11:17
0
Utile
Bon...
Je viens de te simplifier la vie, en écrivant rapidement ce petit bout de code très simple et "parlant" :
Private lacoul As Long
Private Type mescomposantes
R As Long
G As Long
B As Long
End Type

Private Declare Function TranslateColor Lib "olepro32.dll" Alias "OleTranslateColor" (ByVal clr As OLE_COLOR, ByVal palet As Long, col As Long) As Long

Private Sub Command1_Click()
Dim coulchoisie As Long
coulchoisie = vbWindowBackground ' ou celle que tu veux parmi les constantes/couleurs/système
ret = TranslateColor(coulchoisie, 0, lacoul)
MsgBox "la couleur choisie est ainsi composée, dans l'ordre R,G,B : " & vbCrLf & TRANSLATERGB(lacoul).R & vbCrLf & TRANSLATERGB(lacoul).G & vbCrLf & TRANSLATERGB(lacoul).B
End Sub

Private Function TRANSLATERGB(ByVal lacoul) As mescomposantes
TranslateColor lacoul, 0, lacoul
TRANSLATERGB.R = lacoul And &HFF&
TRANSLATERGB.G = (lacoul And &HFF00&) / 2 ^ 8
TRANSLATERGB.B = (lacoul And &HFF0000) / 2 ^ 16
End Function


En fouillant dans les sources que j'ai déposées il y a quelques années sous le pseudo jmfmarques, tu trouveras plusieurs fois cette méthode, utilisée différemment.
Tu y trouveras également de quoi modifier tes couleurs de diverses manières.




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 15 déc. 2014 à 11:34
0
Utile
ce que tu peux bien évidemment simplifier encore un peu ainsi :
Private Type mescomposantes
R As Long
G As Long
B As Long
End Type

Private Declare Function TranslateColor Lib "olepro32.dll" Alias "OleTranslateColor" (ByVal clr As OLE_COLOR, ByVal palet As Long, col As Long) As Long

Private Sub Command1_Click()
Dim coulchoisie As Long
coulchoisie = vbHighlight ' où celle que tu veux parmi les constantes/couleurs/système
MsgBox "la couleur choisie est ainsi composée, dans l'ordre R,G,B : " & vbCrLf & TRANSLATERGB(coulchoisie).R & vbCrLf & TRANSLATERGB(coulchoisie).G & vbCrLf & TRANSLATERGB(coulchoisie).B
End Sub

Private Function TRANSLATERGB(ByVal coulchoisie As Long) As mescomposantes
Dim lacoul As Long
TranslateColor coulchoisie, 0, lacoul
TRANSLATERGB.R = lacoul And &HFF&
TRANSLATERGB.G = (lacoul And &HFF00&) / 2 ^ 8
TRANSLATERGB.B = (lacoul And &HFF0000) / 2 ^ 16
End Function


Commenter la réponse de ucfoutu
Menerlach 57 Messages postés dimanche 2 décembre 2012Date d'inscription 1 juin 2015 Dernière intervention - 15 déc. 2014 à 11:39
0
Utile
1
Ben voila, cette fonction translatecolor c'est exactement ce que je cherchais ! Dommage que pour le moment elle refuse de fonctionner: la déclaration

Private Declare Function TranslateColor Lib "olepro32.dll" Alias "OleTranslateColor" (ByVal clr As OLE_COLOR, ByVal palet As Long, col As Long) As Long
produit le message d'erreur

"Type défini par l'utilisateur non défini"

Ce qui est peu curieux comme message, c'est normal que ce ne soit pas défini puisque c'est une définition, ce n'est quand même pas le type long qui pose problème puisqu'il est fréquemment utilisé sans soucis ou alors c'est OLE_COLOR ?

Finalement c'est bien ça ! En remplaçant OLE_COLOR par long ça fonctionne très bien.

Merci beaucoup, je n'aurais pas pu trouver ce Translatecolor tout seul, la première condition pour trouver quelque chose étant de savoir que ça existe !

Encore merci.
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 15 déc. 2014 à 11:50
Tu dois avoir un drôle de problème avec ta version !
OLE_COLOR est l'un des types répertoriés et reconnus par VB ! (comme d'autres, tel Long, Integer, etc ... la liste est longue ...)
Commenter la réponse de Menerlach
Menerlach 57 Messages postés dimanche 2 décembre 2012Date d'inscription 1 juin 2015 Dernière intervention - 15 déc. 2014 à 16:57
0
Utile
C'est curieux, il reconnait pourtant OLE_COLOR (j'ai essayé de donner ce type à une variable) mais il n'en veut pas dans TranslateColor, je viens de réessayer pour être sûr, mais ce n'est pas un problème puisque ça marche très bien en remplaçant par long. Les voies du VB sont impénétrables...

Encore merci.
Commenter la réponse de Menerlach

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.