Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - farbige Buttons?


Visum - Do 18.07.02 20:26
Titel: farbige Buttons?
Hi,
wie kann ich einen Button farbig machen?

Geht das mit einem normalen TButton oder brauche ich da einen
TBitBtn zu?

Danke schonmal
Visum


b.brecht - Do 18.07.02 22:14

Tja, einen TButton kannst du nicht farbig machen.
Entweder nimmst du ein TPanel, TBitBtn oder einen TSpeedButton.

Wenn du das nicht willst schreib Dir deine eigee Komonente ;)


catweasel - Fr 19.07.02 21:25
Titel: Doch.. es sollte gehen.. auch mit Tbutton
Hu,

Doch es sollte gehen..
Ich hatee mal das Problem mit farbigen TabSheets....
(Sollte so aussehen wie ein buntes Ringbuch halt...)
Hab dazu mal was: :)


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.FormCreate(Sender: TObject);
Var
 Bitmap : TBitmap;
begin
   bitmap:=TBitmap.create;
   bitmap.loadfromfile('.\tabtextur.bmp');
   form1.TabSheet3.Brush.Bitmap:=bitmap;
   bitmap.dormant;
end;


natürlich nicht vergessen:


Quelltext
1:
2:
3:
4:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Bitmap.Free;
end;


Sollte an sich aber auch mit Buttons funktionieren.. oder???
(Is ein ad-hoc posting. Habs nicht getestet) :roll:

Catweasel....


b.brecht - Fr 19.07.02 22:06

geht eher nicht...


Visum - Fr 19.07.02 23:06

Jo, bei mir auch nicht.
Ich versuch grad mir eine neue Klasse zu erstellen.
Fragen dazu stehn woanders.


HaseKlopfer - Do 01.08.02 02:41

hm... ich hab (lang is her) ein bitmap, shape object was auch immer unter einen speedbutton gesetzt -> dessen eigenschaft flat auf true und du hast einen schönen button, allerdings scheiterts dann an der möglichkeit den tastaturfokus zu bekommen, kommt drauf an wie wichtig er dir ist...

lg,
johannes


catweasel - Do 01.08.02 03:50
Titel: warum nicht TImage...
Hi,

Ich hab mich nun durchgerungen einfach ein buttonmässiges Image zu benutzen.. Kann man ja auch anklicken..

Wer es noch abgefahrener mag (wie ich :wink: ), der kann ja auch eine paintbox benutzen, dann kann man auf den "Buttons" soagr videos abspielen... (mit kleinen Tricksereien)....

Catweasel


GPF - Do 01.08.02 05:12

Auf Torry [http://www.torry.net] und anderen Komponenten-Pages gibt es genügend TButton, TBitBtn, TSpeedButton Nachfahren, die Farben, Animationen, Bitmaps, etc. unterstützen.

Von Lösungen wie sie Catweasel und HaseKlopfer vorschlagen ist nur abzuraten.


Lord_Schubach - Do 01.08.02 15:04

Hi!

Farbige Buttons gehen wegen Windows nicht. Oder hast du etwa schon mal farbige Buttons in Windows gesehen? Du müsstest dir eine eigene Komponente machen nur müsstest du dir das Bild selbst malen. :D


catweasel - Do 01.08.02 20:06
Titel: Oh Lord....
Hi,

Wer sagt denn dass man unbedingt die windowsbuttons nehmen muss. Ich glaube man kann grundsätzlich ALLES nehmen zu dem ein onClick Ereigniss (oder was vergleichbares) exisitiert....

Catweasel


Terra23 - Mo 28.04.03 14:10

Mit dem Befehl


Quelltext
1:
PostMessage(ProgressBar1.Handle, $0409, 0, RGB(Rot, Grün, Blau));                    


kann man die Systemfarbe (blau) von den ProgressBar-Balken ändern. Geht das nicht auch mit Buttons?

PS: Das Zeichen $ ist nicht gemeint, es soll ein S sein, daß oben und unten kleine Striche dran hat.


hansa - Mo 28.04.03 14:40

Bevor ihr vor lauter Bäumen den Wald nicht mehr seht. 8) Hier ist ein farbiger Button (ursprünglich vom SwissDelphiCenter, URL finde ich nicht mehr) Ich habe das ganze getestet und es funktioniert einwandfrei :


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
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.