AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

runder Button

Ein Thema von Hansa · begonnen am 27. Dez 2007 · letzter Beitrag vom 19. Jan 2008
Antwort Antwort
Seite 1 von 3  1 23      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

runder Button

  Alt 27. Dez 2007, 20:24
Hi,

brauche einen runden Button. Nicht wegen überflüssiger Spielereien, sondern um einen Knopf zu simulieren (Touchscreen). Verschiedenes ist zu finden. Das reicht von 1500 Zeilen-Unit abgeleitet von TGraphicControl, bis zu dem hier :
Delphi-Quellcode:
procedure DrawRounded(Control: TWinControl);
var
  R: TRect;
  Rgn: HRGN;
begin
  with Control do
  begin
    R := ClientRect;
    rgn := CreateRoundRectRgn(R.Left, R.Top, R.Right, R.Bottom, 14, 14);
    Perform(EM_GETRECT, 0, lParam(@r));
    InflateRect(r,1,1);
    Perform(EM_SETRECTNP, 0, lParam(@r));
    SetWindowRgn(Handle, rgn, True);
    Invalidate;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DrawRounded(Button1);
end;
Am besten gefällt mir noch das hier (SwissDelphiCenter) :

Delphi-Quellcode:
procedure TColorRundButton.DrawButton(Rect: TRect; State: UINT);
var
  Flags, OldMode: Longint;
  IsDown, IsDefault, IsDisabled: Boolean;
  OldColor: TColor;
  OrgRect: TRect;
  rgn: HRGN;
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 begin
    DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);
  end;

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

  OldColor := FCanvas.Brush.Color;
  FCanvas.Brush.Color := BackColor;
  FCanvas.FillRect(Rect);
  FCanvas.Brush.Color := OldColor;
  OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);
  FCanvas.Font.Color := ForeColor;
  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 IsFocused and IsDefault then begin
    Font.Style := Font.Style + [fsBold];
  end
  else begin
    Font.Style := Font.Style - [fsBold];
  end;
(* laut WinSDK :
    int nLeftRect,   // x-coordinate of region's upper-left corner
    int nTopRect,   // y-coordinate of region's upper-left corner
    int nRightRect,   // x-coordinate of region's lower-right corner
    int nBottomRect    // y-coordinate of region's lower-right corner
*)

  rgn := CreateRoundRectRgn(3,3,Width - 2,Height - 2,10,10);
  SetWindowRgn(Handle, rgn, True);
end; (*DrawButton*)
Da wurde eine protected procedure neu eingeführt. Auch etwas mehr als gewünscht (aber Unit nur ca. 230 Zeilen), zumindest aber siehts brauchbar aus. Der damit erzeugte Button hat abgerundete Ecken. Wie kriege ich den nun komplett rund ? Das CreateRoundRectRgn hat anscheinend 6 Parameter. Laut WinSDK aber nur 4. Was nun ? Alternativ wäre auch andere Komponente denkbar (TPanel ??), die sich relativ leicht "rund" machen lässt.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von DerFree
DerFree

Registriert seit: 9. Dez 2004
Ort: Bremerhaven
29 Beiträge
 
Delphi 7 Personal
 
#2

Re: runder Button

  Alt 27. Dez 2007, 21:15
Hi,

bei den JEDI's ist ein "JvShapedButton" dabei, den du a.u. auch auf "Rund" einstellen kannst.
Erik
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: runder Button

  Alt 27. Dez 2007, 21:18
Hallo Hansa,

bezüglich der API-Funktion solltest du direkt beim Hersteller nachsehen.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: runder Button

  Alt 28. Dez 2007, 00:07
Der schweizer Code ist nicht schlecht (bitte selber suchen -> 1. Tip zu TButton). So geht es :
Delphi-Quellcode:
  begin
    Font.Style := Font.Style - [fsBold];
  end;
(*
Width := 100;
Height := 100;
*)

Height := Width;
// rgn := CreateRoundRectRgn(3,3,Width - 2,Height - 2,20,20);
//showmessage (IntToStr (Width)+' '+IntToStr (Height));
  rgn := CreateRoundRectRgn(3,3,Width - 2,Height - 2,Width,Height);
  SetWindowRgn(Handle, rgn, True);
end; (*DrawButton*)
Beweis : siehe Anhang. Weiß noch jemand, was gemacht werden muss, damit um die jetzt gefüllte Fläche (also genau auf der Umrandung) eine Linie um die Fläche gezogen wird, in anderer Farbe, ohne die Fläche selbst zu beeinflussen ?
Miniaturansicht angehängter Grafiken
colorrundbutton_211.jpg  
Gruß
Hansa
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

Re: runder Button

  Alt 28. Dez 2007, 01:08
Wieso CreateRoundRectRgn und nicht CreateEllipticRgn?
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: runder Button

  Alt 28. Dez 2007, 01:43
Was weiß denn ich ? Wollte ja Kreis. Da gilt Width = Height. Und das ist auch eine Ellipse.

Delphi-Quellcode:
  rgn := CreateRoundRectRgn(3,3,Width - 2,Height - 2,Width,Height);
  SetWindowRgn(Handle, rgn, True);
  FCanvas.Pen.Color := clBlack;
  FCanvas.Pen.Width := 5;
  FCanvas.Brush.Color := clBlue;
  FCanvas.RoundRect(3,3,Width - 2 - 1,Height - 2 - 1,Width,Height);
end; (*DrawButton*)
Der Rand wird jetzt auch gezeichnet, überdeckt aber die Caption dieses runden Buttons. Was ist zu tun ? DP-Ampeln kann man damit aber zumindest mal bauen.
Miniaturansicht angehängter Grafiken
dp-ampel_229.jpg  
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

Registriert seit: 12. Jun 2003
107 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: runder Button

  Alt 28. Dez 2007, 02:12
Wenn das ein Ampel werden soll warum nimmst du nicht ein Image und gibst dem noch ein paar Ereignisse.

MFG
Wenn man nicht weiß was man sucht, findet man auch mit Google nichts.
Bevor ich hier eine Frage stelle, wurde Google vorher befragt. Hinweise dieser Art kann man sich schenken. Im übrigen muss mir niemand antworten.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8

Re: runder Button

  Alt 28. Dez 2007, 02:26
Besser um diese Uhrzeit nicht mehr so viel denken, Opa. Es geht um keine Ampel, sondern um das, was in Beitrag #1 gefragt wurde. Die Ampel ist bereits als Neujahrs-Witz zu verstehen.
Gruß
Hansa
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: runder Button

  Alt 28. Dez 2007, 09:09
Wenn Du einen Touchscreen-Buitoni möchtest, dann mal Dir einen. Dann noch einen, so wie er gedrückt aussieht. Und noch einen, so wie er aussehen soll, wenn man mit der Maus drüber fährt. Und noch einen, wenn er nicht drückbar sein soll (also Enabled := False).

Dann schnapp Dir ein TImage und fettich. Wieso willst du dir einen mit Regions abbrechen? Vasteh ick nich.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: runder Button

  Alt 28. Dez 2007, 10:18
Regions könnte man noch benutzen, um den klickbaren Bereich einzugrenzen. Ansonsten finde ich auch, dass das mit vorgefertigten Grafiken einfach besser aussieht
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz