Witam
Nigdy nie myślałem że tu napiszę taką prośbę ale po przeglądaniu kilkunastu komponentów z Google nie udało mi się nic takiego znaleźć a potrzebny na wczoraj, bo muszę na szybko zrobić pewien projekt.
Jak w temacie poszukuję darmowego komponentu jak TButton
tylko z działającą właściwością Color
ale co ważne żeby nie wyglądał jak jak stare kontrolki (takie jak w Windows bez kompozycji pulpitu, bo takich jest pełno) tylko jakoś po ludzku (taki płaski jak w nowych Windows).
Dzięki
A nie wolałbyś napisać takiego komponentu? Większość (albo i wszystkie) właściwości możesz bez problemu odziedziczyć z klasy TWinControl
(lub TCustomControl
– nie pamiętam którą w Delphi się rozszerza) i podbić sobie do sekcji published
, aby widzieć je w oknie inspektora obiektów. Jedyne co trzeba będzie napisać to kod metody Paint
, aby samemu określić sposób renderowania.
Naprawdę niewiele pisania będzie. Jeśli nie masz dostepu do kodu VCL to możesz podpatrzeć co nieco z LCL.
Właśnie dawno nie bawiłem się w rysowanie a nie bardzo mam czas na pisanie "po omacku", bo program pilny a muszą być kolorowe buttony.
Coż, gotowej kontrolki nie mam, a jeśli nie znalazłeś nic, to IMO jedynie pozostaje napisanie swojej.
Jeśli chesz uzyskać efekt podobny do Windows 10, to wystarczy wywołać Canvas.Rectangle
dla tła i Canvas.TextRect
dla tekstu. Ewentualnie Canvas.DrawFocusRect
dla obramowania zfokusowanej kontrolki (albo wybrać inny kolor obramowania). Zwykły przycisk to akurat kontrolka najłatwiejsza do zaprogramowania.
naprawdę tak trudno https://www.google.pl/search?q=delphi+color+tbutton
Dobra już prawie że skończyłem swojego buttona, bo szybciej narysować niż znaleźć.
Do malowania tekstu na tle możesz też skorzystać z systemowej funkcji DrawTextW
– pozwoli Ci ona na zmierzenie tekstu (flagami steruje się jej zachowaniem, w zależności od potrzeb) i jego faktyczne namalowanie.
Jeszcze mam pytanie czy istnieje jakiś sposób do obliczenia koloru tej ramki w około aktywnego przycisku na podstawie jego koloru? Czy raczej muszę mieć dodatkową właściwość i ustawiać na piechotę?
Może i bym znalazł ale nie mam pojęcia jak to nazwać.
kAzek napisał(a):
Jeszcze mam pytanie czy istnieje jakiś sposób do obliczenia koloru tej ramki w około aktywnego przycisku na podstawie jego koloru?
@kAzek: co konkretnie chcesz obliczyć? Ciemniejszy odcień koloru tła?
Sam używam funkcji do pozyskiwania odcienia jaśniejszego, ciemniejszego, skali szarości itd., mogę wrzucić gotowce. Tyle tylko, że nie są to gołe funkcje, a metody helperów, więc musiałbyś sobie je przystosować do własnych wymagań. Bo w sumie to nie wiem jak wygląda w Delphi sprawa z helperami dla typów prostych.
Edit: wrzucam kod – w razie czego może ktoś kiedyś skorzysta. Kod natywny dla FPC:
{$MODE OBJFPC} {$MODESWITCH TYPEHELPERS} {$INLINE ON}
{..}
type
UInt8Helper = type helper(SysUtils.TByteHelper) for UInt8
public
function ToDarker(APercent: UInt8): UInt8; inline;
function ToBrighter(APercent: UInt8): UInt8; inline;
end;
type
TColorHelper = type helper for Graphics.TColor
public
function ToDarker(APercent: UInt8): TColor; inline;
function ToBrighter(APercent: UInt8): TColor; inline;
end;
{..}
function UInt8Helper.ToDarker(APercent: UInt8): UInt8;
begin
Result := Trunc(Self * (100 - APercent) / 100);
end;
function UInt8Helper.ToBrighter(APercent: UInt8): UInt8;
begin
Result := Trunc(Self * (100 - APercent) / 100) + Round(255 - (100 - APercent) / 100 * 255);
end;
function TColorHelper.ToDarker(APercent: UInt8): TColor;
var
LR, LG, LB: UInt8;
begin
RedGreenBlue(Self, LR, LG, LB);
Result := RGBToColor(LR.ToDarker(APercent), LG.ToDarker(APercent), LB.ToDarker(APercent));
end;
function TColorHelper.ToBrighter(APercent: UInt8): TColor;
var
LR, LG, LB: UInt8;
begin
RedGreenBlue(Self, LR, LG, LB);
Result := RGBToColor(LR.ToBrighter(APercent), LG.ToBrighter(APercent), LB.ToBrighter(APercent));
end;
Wartości procentażu z zakresu od 0
do 100
, gdzie 0
da ten sam kolor, a 100
da maksymalnie przyciemniony (czarny) lub maksymalnie rozjaśniony (biały). Im wyższa wartość, tym większe przyciemnienie lub rozjaśnienie. RedGreenBlue
oraz RGBToColor
zawarte są w module Graphics
.
Przykład użycia (w postaci helperów):
procedure TMyButton.Paint();
begin
Canvas.Brush.Color := Self.Color; // kolor podstawowy (z wbudowanej właściwości)
Canvas.Pen.Color := Self.Color.ToDarker(50); // 50% ciemniejszy od podstawowego
Canvas.Rectangle(Self.ClientRect);
{..}
end;
W razie pytań – pytać.