Возможно ли в winforms, vb.net, определить конкретные настраиваемые цвета, которые будут отображаться в полях настраиваемых цветов в colordialog?

3
Alex Gordon 6 Авг 2009 в 23:36

4 ответа

Лучший ответ

Короче да. MSDN покрывает это здесь. Проблема в том, что это не делается через Color - вам нужно обрабатывать значение, которое задает BGR - то есть каждое целое число состоит из цветов как 00BBGGRR, поэтому вы сдвигаете влево синий цвет на 16, зеленый на 8, и используйте красный "как есть".

Мой VB отстой, но на C # добавить фиолетовый:

    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();
    }

Отражатель уверяет меня, что это похоже на:

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
5
Marc Gravell 6 Авг 2009 в 19:46

УПРОЩЕННЫЙ (на основе Габби)

Если вы знаете ARGB ваших целевых пользовательских цветов, используйте:

 '                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]
0
Vinelander 10 Сен 2015 в 12:46

Существующий пример содержит ошибку.

Purple.B - это байт, а не целое число, поэтому его сдвиг на 8 или 16 бит не повлияет на значение. Каждый байт сначала должен быть приведен к целому числу, прежде чем сдвигать его. Примерно так (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
2
16 Авг 2009 в 20:23

Если вы хотите иметь более одного собственного цвета, вы можете сделать это:

            '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()
5
Gabby 25 Янв 2012 в 19:04