Piszę mały edytor, który chciałbym przystosować pod kolorystykę wizualnego stylu systemu; W nim mam zaimplementowane własnoręczne rysowanie itemów w takich kontrolkach jak: TMainMenu
, TPopupMenu
, TCheckListBox
, TComboBox
itd.; Rysowanie tła pozycji jest takie samo dla wszystkich kontrolek - pobieram systemowy kolor clHighlight
i na jego bazie ustalam jaśniejszy odcień dla tła itema, oraz ciemniejszy dla ramki itema (wszystkiego nie potrzeba opisywać - nie w tym rzecz); Dzięki temu przynajmniej większość stylów w systemie będzie obsłużona poprawnie; Efekt przedstawia poniższy zrzut - jeden algorytm malujący dla trzech wizualnych stylów WinXP: odpowiednio Domyślny (niebieski), Oliwkowozielony oraz Srebrny:
Podczas inicjalizacji modułu z silnikiem aplikacji tworzę obiekt silnika, po czym ustalam wszelkie kolory, które będą pomocne przy malowaniu itemów w programie; Wykorzystuje do tego krótką funkcję pozyskującą odcień podanego w argumencie koloru według wartości podanej w drugim parametrze; Kod algorytmu:
function _ChangeLightness(BaseColor: TColor; const LightingLevel: SmallInt): TColor;
begin
with TBitmap.Create() do
try
PixelFormat := pf24bit;
Width := 1;
Height := 1;
Canvas.Pixels[0, 0] := BaseColor;
BaseColor := Canvas.Pixels[0, 0];
Result := RGB(Min(Max(GetRValue(BaseColor) + LightingLevel, 0), 255),
Min(Max(GetGValue(BaseColor) + LightingLevel, 0), 255),
Min(Max(GetBValue(BaseColor) + LightingLevel, 0), 255));
finally
Free();
end;
end;
wywołanie:
Fill := _ChangeLightness(clHighlight, 15);
Frame := _ChangeLightness(clHighlight, -15);
Jednak nie jestem z niego zadowolony, ponieważ aby móc obliczyć dowolny odcień muszę tworzyć bitmapę, zamalować piksel na kolor, następnie pobrać z powrotem ten kolor do argumentu i odpowiednio dekrementować/inkrementować wartość każdej z trzech składowych co jest niepoprawne według mnie; Niestety jak do tej pory nie udało mi się tego zrobić inaczej;
Domyślam się, że np. stała clHighlight
jest niejaką maską, którą łączy się z innym kolorem w bliżej nieokreślony sposób i tak powstaje dany kolor, jednak nie wiem w jaki sposób konkretnie jest to wykonywane (oczywiście jeśli to jest prawda);
Pytanie: W jaki sposób wyciągnąć prawdziwy kolor ze stałej clHighlight
by móc wykonać powyższe czynności bez wykorzystania bitmapy?
- OwnColors.png (23 KB) - ściągnięć: 221