2009-08-06 5 views

Répondre

4

En bref, oui. MSDN le couvre here. Le problème est que cela ne se fait pas via Color - vous devez gérer la valeur en BGR - chaque entier est composé des couleurs 00BBGGRR, donc vous avez décalé le bleu de 16, le vert de 8 et le rouge " comme si".

Mon VB suce, mais en C#, pour ajouter pourpre:

using (ColorDialog dlg = new ColorDialog()) 
    { 
     Color purple = Color.Purple; 
     int i = (purple.B << 16) | (purple.G << 8) | purple.R; 
     dlg.CustomColors = new[] { i }; 
     dlg.ShowDialog(); 
    } 
réflecteur

me assure que ce qui est similaire à:

Using dlg As ColorDialog = New ColorDialog 
    Dim purple As Color = Color.Purple 
    Dim i As Integer = (((purple.B << &H10) Or (purple.G << 8)) Or purple.R) 
    dlg.CustomColors = New Integer() { i } 
    dlg.ShowDialog 
End Using 
+0

+1 pour la manipulation au niveau du bit. Je souhaite vraiment que MS documente mieux ce genre de choses. –

2

L'exemple existant contient une erreur. Purple.B est un octet pas un nombre entier, donc le décalage de 8 ou 16 bits ne fera rien à la valeur. Chaque octet doit d'abord être converti en entier avant de le déplacer. Quelque chose comme ça (VB.NET):

Dim CurrentColor As Color = Color.Purple 
Using dlg As ColorDialog = New ColorDialog 
    Dim colourBlue As Integer = CurrentColor.B 
    Dim colourGreen As Integer = CurrentColor.G 
    Dim colourRed As Integer = CurrentColor.R 
    Dim newCustomColour as Integer = colourBlue << 16 Or colourGreen << 8 Or colourRed 
    dlg.CustomColors = New Integer() { newCustomColour } 
    dlg.ShowDialog 
End Using 
4

Si vous voulez avoir plus de 1 couleur personnalisée, vous pouvez le faire:

  'Define custom colors 
    Dim cMyCustomColors(1) As Color 
    cMyCustomColors(0) = Color.FromArgb(0, 255, 255) 'aqua 
    cMyCustomColors(1) = Color.FromArgb(230, 104, 220) 'bright pink 

    'Convert colors to integers 
    Dim colorBlue As Integer 
    Dim colorGreen As Integer 
    Dim colorRed As Integer 
    Dim iMyCustomColor As Integer 
    Dim iMyCustomColors(cMyCustomColors.Length - 1) As Integer 

    For index = 0 To cMyCustomColors.Length - 1 
     'cast to integer 
     colorBlue = cMyCustomColors(index).B 
     colorGreen = cMyCustomColors(index).G 
     colorRed = cMyCustomColors(index).R 

     'shift the bits 
     iMyCustomColor = colorBlue << 16 Or colorGreen << 8 Or colorRed 

     iMyCustomColors(index) = iMyCustomColor 
    Next 

    ColorDialog1.CustomColors = iMyCustomColors 
    ColorDialog1.ShowDialog() 
0

SIMPLIFIÉE (basé sur Gabby)

Si vous connaissez l'ARGB de vos couleurs personnalisées cibles, puis utilisez:

'    Define custom colors 
ColorDialog1.CustomColors = New Integer() {(255 << 16 Or 255 << 8 Or 0), _ 
              (220 << 16 Or 104 << 8 Or 230), _ 
              (255 << 16 Or 214 << 8 Or 177)} 
ColorDialog1.ShowDialog() 
'where colors are (arbg) 1: 0,255,255 [aqua] 
'      2: 230,104,220 [bright pink] 
'      3: 177,214,255 [whatever] 
Questions connexes