Kolory Delphi (TColor
) to XXBBGGRR
, gdy nie są z palety lub specjalnego koloru.
Aby uzyskać więcej informacji na temat formatu (i innych specjalnych przypadków), patrz: this article. The article wskazany przez Christian.K zawiera również pewne szczegóły na temat specjalnych przypadków.
Standardowe kolory
Aby przekształcić do standardowego koloru należy użyć coś takiego:
var color = Color.FromArgb(0xFF, c & 0xFF, (c >> 8) & 0xFF, (c >> 16) & 0xFF);
Aby przekonwertować hex,:
string ColorToHex(Color color)
{
return string.Format("#{0:X2}{1:X2}{2:X2}",
color.R, color.G, color.B);
}
kolory systemowe
Dla systemu kolory (wartości ujemne w bazie danych), są po prostu consta okna nts zamaskowany przez 0x80000000
.
Dzięki David Heffernan za informacje.
Przykładowy kod
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));
}
}
Najlepszym sposobem przekonwertowania koloru systemu na RGB jest wykonanie polecenia VCL. Wywołanie ['GetSysColor()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724371 (v = vs.85).aspx) przekazując 'c & 0x000000FF'. Innymi słowy, nie są one zdefiniowane jako VCL, są * zdefiniowane * systemowe. –
@ David, w swoim komentarzu podałeś dokładną odpowiedź, nie publikując go jako odpowiedzi? –
@PA. Komentarz jest tylko niewielką częścią odpowiedzi. Mam nadzieję, że VirtualBlackFox uwzględni tę sugestię w tej odpowiedzi, a więc będzie w stanie usunąć dość długą i męczącą listę. –