с использованием 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().
Спасибо за ответ John, это то, что ColorTranslator.ToWin32()/FromWinW32() делает? Кроме того, что такое цвет OLE? JD. –
По существу да - поскольку Александр показал, что разобранный код очень похож. Идея OLE Color заключается в том, что он может включать в себя флаг, указывающий, что цвет представляет собой системный цвет, например «лицо кнопки». Поскольку они могут отображаться по-разному в разных операционных системах/темах, они были бы полезны, если вы хотите, чтобы ваше приложение соответствовало текущей теме Windows. Если они не включают флаг, они будут вести себя точно так же, как цвет Win32. –
Спасибо за объяснение. У меня никогда не было использования побитовых и сдвиговых операций, поэтому, увидев, что ваш пример заставил меня научиться их использовать. Также благодаря Alex ниже я попытаюсь использовать Reflector больше в будущем. –