Nowy tydzień, nowe problemy.
Jak już pisałem wcześniej, z grafiką jestem na bakier... a interfejs musi wyglądać...
Mam taki problem. Potrzebuję pobrać kolor paska postępu TProgressBar (tpBar oraz tpChunk). Kolor, który kontrolka przyjmuje z systemu.
Jeśli system ma włączone Motywy (Windows Theme) to można to zrobić tak:
uses Vcl.Themes;
var
LStyles : TCustomStyleServices;
Details : TThemedElementDetails;
LRect : TRect;
begin
if StyleServices.Enabled then
begin
LRect := PAINTBOX.ClientRect;
Details := StyleServices.GetElementDetails(tpBar);
//Details := StyleServices.GetElementDetails(tpChunk);
StyleServices.DrawElement(PAINTBOX.Canvas.Handle, Details, LRect);
end
end;
Powyższy kod pobiera szczegóły dla danej kontrolki i maluje je na płótnie TPaintBox... Teoretycznie mam interesujący mnie kolor wymalowany gdzie chcę.
ALE, ja chcę pobrać sam Kolor (TColor) - żeby móc stworzyć wykres w odpowiednich kolorach (czyli pasek postępu na danym tle).
Jak to się robi? Czy wystarczy pobrać kolor z danego piksela naszej kontrolki TPaintBox (na której właśnie namalowałem ten kolor) - przy czym nie wiem czy on jest jednolity.
Zdaję się Canvas.Pixels(x,y) pozwala na pobranie koloru... ale czy to jest dobra metoda?
Ten kod pobiera odpowiednie kolory:
var
LStyles : TCustomStyleServices;
Details : TThemedElementDetails;
LRect : TRect;
iUsedColor : TColor;
iBkgColor : TColor;
BMP : TBitMap;
begin
if StyleServices.Enabled then
begin
BMP := TBitmap.Create;
try
BMP.Width := 20;
BMP.Height := 20;
LRect := Rect(0, 0, BMP.Width, BMP.Height);
// GET BACKGROUND COLOR (tpBar)
Details := StyleServices.GetElementDetails(tpBar);
StyleServices.DrawElement(BMP.Canvas.Handle, Details, LRect);
iBkgColor := BMP.Canvas.Pixels[BMP.Width div 2, BMP.Height div 2];
// GET PROGRESS COLOR (tpChunk)
Details := StyleServices.GetElementDetails(tpChunk);
StyleServices.DrawElement(BMP.Canvas.Handle, Details, LRect);
iUsedColor := BMP.Canvas.Pixels[BMP.Width div 2, BMP.Height div 2];
ShowMessage('Progress: ' + '$' + IntToHex(iUsedColor) + #10#13 +
'Background: ' + '$' + IntToHex(iBkgColor) + #10#13 +
'');
finally
BMP.Free;
end;
end
else
begin
end;
Ale - jak widać, pobieram kolor piksela ze środka bitmapy - a pasek postępu lubi być gradientem, więc ta metoda daje "uśredniony wynik"...
Może piszę niezrozumiale - chodzi o to, że system rysuje kontrolkę postępu TProgressBar na swój sposób (pasek postępu i tła mają przypisane odpowiednie kolory, w zależności od motywu) - chcę pobrać te kolory i znając je mogę stworzyć własny wykres z kolorami zgodnymi z systemem.
Ps: A co jeśli system ma wyłączone motywy? Jak wtedy pobrać te kolory?
-Pawel