Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie Farben von Buttons ändern? (https://www.delphipraxis.net/151608-wie-farben-von-buttons-aendern.html)

himitsu 25. Mai 2010 08:13


Wie Farben von Buttons ändern?
 
Tachchen,

in meinem kleinen Manifest-Creator (in der neuen Version im Beitrag #48) hab ich es ja nun so eingerichtet daß die Eingabeelemente farblich hinterlegt werden, wenn man diese links im TreeView ausgewählt hat.
Delphi-Quellcode:
THilfstyp(C).Color := Rosa;
Aber irgendwie hab ich bei ganzen Button-Controls, wie z.B. TButton und TCheckBox, einfach nix gefunden, wie sowas einfach möglich ist.
Es färbt sich nie was, solange der XP-Style aktiv ist.
Auch über den Font is nix zu machen.
Delphi-Quellcode:
THilfstyp(C).Font.Color := Rosa;
(beim Panel müß man ja "nur" das ParentColor umstellen, aber sowas gibt's hier nicht)



Hat irgendwe 'nen Tipp, wie man da was "Einfaches" machen,
(soll ja nix Aufwändiges sein, also selber die Controls zu zeichnen fällt weg)
oder was man sonst als "hübsche" Markierung nutzen könnte?

implementation 25. Mai 2010 08:19

Re: Wie Farben von Buttons ändern?
 
Du könntest vielleicht selbst die Zeichenroutine übernehmen, darin die alte vom Button aufrufen, und dann vielleicht transparent drübermalen :gruebel:

hoika 25. Mai 2010 09:08

Re: Wie Farben von Buttons ändern?
 
Hallo,

der TButton kann in seiner Farbe nicht verändert werden,
ein TBitBtn schon ...


Heiko

himitsu 25. Mai 2010 09:55

Re: Wie Farben von Buttons ändern?
 
Zitat:

Zitat von hoika
der TButton kann in seiner Farbe nicht verändert werden

Hatte ich vorhin auch gemerkt, beim TButton wurde .Color nicht veröffentlicht und läßt sich so nicht direkt verändern.

Nja, im Grunde suche ich nur eine schöne und einfache Möglichkeit, um die Komponenten hervorzuheben,
damit man schnell erkennt, welche Komponente mit dem Eintrag im TreeView verbunden ist.


Für den TButton hab ich jetzt erstmal .Default mißbraucht (sind ja aktuell nur 2 Buttons), das fällt schonmal ein bissl auf, aber für die CheckBoxen fehlt noch was.
Und eigentlich wäre es mit lieber, wenn alles nach dem selben Muster markiert/hervorgehoben würde.

rollstuhlfahrer 25. Mai 2010 10:00

Re: Wie Farben von Buttons ändern?
 
Dann tausche doch einfach alle TButton gegen TBitBtn aus. Die sehen genauso aus und fühlen sich genauso an.

Bernhard

hathor 25. Mai 2010 12:58

Re: Wie Farben von Buttons ändern?
 
Zitat:

Zitat von himitsu
...Hat irgendwe 'nen Tipp, wie man da was "Einfaches" machen,
(soll ja nix Aufwändiges sein, also selber die Controls zu zeichnen fällt weg)
oder was man sonst als "hübsche" Markierung nutzen könnte?

http://www.rhostyle.com/Files/xpCtrl.zip
(oder hier:
http://delphi.icm.edu.pl/ftp/d20free/clrbtn.zip
)

Warum???

Delphi-Quellcode:
unit ColorButton;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls;

type
  TDrawButtonEvent = procedure(Control: TWinControl;
    Rect: TRect; State: TOwnerDrawState) of object;

  TColorButton = class(TButton)
  private
    FCanvas: TCanvas;
    IsFocused: Boolean;
    FOnDrawButton: TDrawButtonEvent;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure SetButtonStyle(ADefault: Boolean); override;
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
    procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
    procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
    procedure DrawButton(Rect: TRect; State: UINT);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Canvas: TCanvas read FCanvas;
  published
    property OnDrawButton: TDrawButtonEvent read FOnDrawButton write FOnDrawButton;
    property Color;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TColorButton]);
end;

constructor TColorButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TCanvas.Create;
end;

destructor TColorButton.Destroy;
begin
  inherited Destroy;
  FCanvas.Free;
end;

procedure TColorButton.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do Style := Style or BS_OWNERDRAW;
end;

procedure TColorButton.SetButtonStyle(ADefault: Boolean);
begin
  if ADefault <> IsFocused then
  begin
    IsFocused := ADefault;
    Refresh;
  end;
end;

procedure TColorButton.CNMeasureItem(var Message: TWMMeasureItem);
begin
  with Message.MeasureItemStruct^ do
  begin
    itemWidth := Width;
    itemHeight := Height;
  end;
end;

procedure TColorButton.CNDrawItem(var Message: TWMDrawItem);
var
  SaveIndex: Integer;
begin
  with Message.DrawItemStruct^ do
  begin
    SaveIndex := SaveDC(hDC);
    FCanvas.Lock;
    try
      FCanvas.Handle := hDC;
      FCanvas.Font := Font;
      FCanvas.Brush := Brush;
      DrawButton(rcItem, itemState);
    finally
      FCanvas.Handle := 0;
      FCanvas.Unlock;
      RestoreDC(hDC, SaveIndex);
    end;
  end;
  Message.Result := 1;
end;

procedure TColorButton.CMEnabledChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end;

procedure TColorButton.CMFontChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end;

procedure TColorButton.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
  Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos));
end;

procedure TColorButton.DrawButton(Rect: TRect; State: UINT);
var
  Flags, OldMode: Longint;
  IsDown, IsDefault, IsDisabled: Boolean;
  OldColor: TColor;
  OrgRect: TRect;
begin
  OrgRect := Rect;
  Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
  IsDown := State and ODS_SELECTED <> 0;
  IsDefault := State and ODS_FOCUS <> 0;
  IsDisabled := State and ODS_DISABLED <> 0;

  if IsDown then Flags := Flags or DFCS_PUSHED;
  if IsDisabled then Flags := Flags or DFCS_INACTIVE;

  if IsFocused or IsDefault then
  begin
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Style := bsClear;
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, - 1, - 1);
  end;

  if IsDown then
  begin
    FCanvas.Pen.Color := clBtnShadow;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Color := clBtnFace;
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, - 1, - 1);
  end
  else
    DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);

  if IsDown then OffsetRect(Rect, 1, 1);

  OldColor := FCanvas.Brush.Color;
  FCanvas.Brush.Color := Color;
  FCanvas.FillRect(Rect);
  FCanvas.Brush.Color := OldColor;
  OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);
  FCanvas.Font.Color := clBtnText;
  if IsDisabled then
    DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,
    ((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2,
    ((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2,
      0, 0, DST_TEXT or DSS_DISABLED)
  else
    DrawText(FCanvas.Handle, PChar(Caption), - 1, Rect,
      DT_SINGLELINE or DT_CENTER or DT_VCENTER);
  SetBkMode(FCanvas.Handle, OldMode);

  if Assigned(FOnDrawButton) then
    FOnDrawButton(Self, Rect, TOwnerDrawState(LongRec(State).Lo));

  if IsFocused and IsDefault then
  begin
    Rect := OrgRect;
    InflateRect(Rect, - 4, - 4);
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Brush.Color := clBtnFace;
    DrawFocusRect(FCanvas.Handle, Rect);
  end;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz