Los colores Delphi (TColor
) son XXBBGGRR
cuando no son de una paleta o un color especial.
Ver this article para más detalles sobre el formato (y otros casos especiales). The article señalado por Christian.K también contiene algunos detalles sobre los casos especiales.
Colores estándar
Convertir en un color estándar que puedes usar algo como:
var color = Color.FromArgb(0xFF, c & 0xFF, (c >> 8) & 0xFF, (c >> 16) & 0xFF);
Para convertir a hexadecimal:
string ColorToHex(Color color)
{
return string.Format("#{0:X2}{1:X2}{2:X2}",
color.R, color.G, color.B);
}
colores del sistema
Para el sistema colores (valores negativos en su base de datos), son simplemente las ventanas consta nts enmascarado por 0x80000000
.
Gracias a David Heffernan por la información.
Código de ejemplo
Color DelphiColorToColor(uint delphiColor)
{
switch((delphiColor >> 24) & 0xFF)
{
case 0x01: // Indexed
case 0xFF: // Error
return Color.Transparent;
case 0x80: // System
return Color.FromKnownColor((KnownColor)(delphiColor & 0xFFFFFF));
default:
var r = (int)(delphiColor & 0xFF);
var g = (int)((delphiColor >> 8) & 0xFF);
var b = (int)((delphiColor >> 16) & 0xFF);
return Color.FromArgb(r, g, b);
}
}
void Main()
{
unchecked
{
Console.WriteLine(DelphiColorToColor((uint)(-2147483646)));
Console.WriteLine(DelphiColorToColor(
(uint)KnownColor.ActiveCaption | 0x80000000
));
Console.WriteLine(DelphiColorToColor(0x00FF8000));
}
}
La mejor manera de convertir un color del sistema a RGB es hacer como el VCL hace. Llame [ 'GetSysColor()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724371 (v = vs.85).aspx) pasando 'c & 0x000000FF'. En otras palabras, estos no están definidos por VCL, están * sistema * definidos. –
@David, en su comentario proporcionó la respuesta exacta, ¿no lo publica como respuesta? –
@PA. El comentario es solo una pequeña parte de la respuesta. Espero que VirtualBlackFox incorpore la sugerencia en esta respuesta y así poder eliminar la lista bastante larga y tediosa. –