2009-09-22 3 views
3

Может ли кто-нибудь сказать мне, как из ARGB, соответствующие окна Цвет вычисляется? Я знаю, что есть ColorTranslator.ToWin32(), который выполняет расчет, но как это делается?Hows делает цвет окон рассчитывается из ARGB

Кроме того, в чем разница между цветом OLE и цветом windows (win32)?

JD.

ответ

2

Цветовой объект в .NET включает альфа-канал (то есть уровень прозрачности), а цвета Win32 - это чисто RGB. Таким образом, чтобы конвертировать между двумя вы хотите что-то вроде следующего:

static public int ConvertColourToWindowsRGB(Color dotNetColour) 
    { 
     int winRGB = 0; 

     // windows rgb values have byte order 0x00BBGGRR 
     winRGB |= (int)dotNetColour.R; 
     winRGB |= (int)dotNetColour.G << 8; 
     winRGB |= (int)dotNetColour.B << 16; 

     return winRGB; 
    } 

    static public Color ConvertWindowsRGBToColour(int windowsRGBColour) 
    { 
     int r = 0, g = 0, b = 0; 

     // windows rgb values have byte order 0x00BBGGRR 
     r = (windowsRGBColour & 0x000000FF); 
     g = (windowsRGBColour & 0x0000FF00) >> 8; 
     b = (windowsRGBColour & 0x00FF0000) >> 16; 

     Color dotNetColour = Color.FromArgb(r, g, b); 

     return dotNetColour; 
    } 
+0

Спасибо за ответ John, это то, что ColorTranslator.ToWin32()/FromWinW32() делает? Кроме того, что такое цвет OLE? JD. –

+1

По существу да - поскольку Александр показал, что разобранный код очень похож. Идея OLE Color заключается в том, что он может включать в себя флаг, указывающий, что цвет представляет собой системный цвет, например «лицо кнопки». Поскольку они могут отображаться по-разному в разных операционных системах/темах, они были бы полезны, если вы хотите, чтобы ваше приложение соответствовало текущей теме Windows. Если они не включают флаг, они будут вести себя точно так же, как цвет Win32. –

+1

Спасибо за объяснение. У меня никогда не было использования побитовых и сдвиговых операций, поэтому, увидев, что ваш пример заставил меня научиться их использовать. Также благодаря Alex ниже я попытаюсь использовать Reflector больше в будущем. –

3

с использованием IL Disassembler (например, отражатель), вы можете получить код для ColorTranslator.ToWin32(). Обратите внимание, что цвет ToWin32 не использует альфа-значение.

public static int ToWin32(Color c) 
{ 
    return ((c.R | (c.G << 8)) | (c.B << 0x10)); 
} 

ColorTranslator.ToOle (...) является тестирование, если цвет является стандартной цветовой системы в противном случае, он использует преобразование ToWin32:

public static int ToOle(Color c) 
{ 
    if (c.IsKnownColor) 
    { 
     switch (c.ToKnownColor()) 
     { 
      case KnownColor.ActiveBorder: 
       return -2147483638; 

      case KnownColor.ActiveCaption: 
       return -2147483646; 

      case KnownColor.ActiveCaptionText: 
       return -2147483639; 

      case KnownColor.AppWorkspace: 
       return -2147483636; 

      case KnownColor.Control: 
       return -2147483633; 

      case KnownColor.ControlDark: 
       return -2147483632; 

      case KnownColor.ControlDarkDark: 
       return -2147483627; 

      case KnownColor.ControlLight: 
       return -2147483626; 

      case KnownColor.ControlLightLight: 
       return -2147483628; 

      case KnownColor.ControlText: 
       return -2147483630; 

      case KnownColor.Desktop: 
       return -2147483647; 

      case KnownColor.GrayText: 
       return -2147483631; 

      case KnownColor.Highlight: 
       return -2147483635; 

      case KnownColor.HighlightText: 
       return -2147483634; 

      case KnownColor.HotTrack: 
       return -2147483635; 

      case KnownColor.InactiveBorder: 
       return -2147483637; 

      case KnownColor.InactiveCaption: 
       return -2147483645; 

      case KnownColor.InactiveCaptionText: 
       return -2147483629; 

      case KnownColor.Info: 
       return -2147483624; 

      case KnownColor.InfoText: 
       return -2147483625; 

      case KnownColor.Menu: 
       return -2147483644; 

      case KnownColor.MenuText: 
       return -2147483641; 

      case KnownColor.ScrollBar: 
       return -2147483648; 

      case KnownColor.Window: 
       return -2147483643; 

      case KnownColor.WindowFrame: 
       return -2147483642; 

      case KnownColor.WindowText: 
       return -2147483640; 

      case KnownColor.ButtonFace: 
       return -2147483633; 

      case KnownColor.ButtonHighlight: 
       return -2147483628; 

      case KnownColor.ButtonShadow: 
       return -2147483632; 

      case KnownColor.GradientActiveCaption: 
       return -2147483621; 

      case KnownColor.GradientInactiveCaption: 
       return -2147483620; 

      case KnownColor.MenuBar: 
       return -2147483618; 

      case KnownColor.MenuHighlight: 
       return -2147483619; 
     } 
    } 
    return ToWin32(c); 
} 

Это означает, что если объявить цвет цвет = SystemColors .ControlText, ColorTranslator.ToOle (цвет) вернет -2147483630, но если вы установите цвет в пользовательский цвет ARGB, ColorTranslator.ToOle вернет стандартное значение ToWin32().

Смежные вопросы