TButton z właściwością Color

0

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

1

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.

0

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.

1

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.

0

Dobra już prawie że skończyłem swojego buttona, bo szybciej narysować niż znaleźć.

0

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.

0

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ć.

button.jpg

1
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ć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1