Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild in eine Buttonkomponente?? (https://www.delphipraxis.net/108658-bild-eine-buttonkomponente.html)

STS301 17. Feb 2008 11:37


Bild in eine Buttonkomponente??
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi

bin gerade dabei eine Buttonkomponente zu erstellen, ich will allerdings (falls dies möglich ist) ein Bild statt zb. im Anhang einen Kreis als Button verwenden.

mit loadfromFile und LoadBitmap funktioniert es nicht, muss ich da einen eigenen Dateityp verwenden oder funktionieren solche Sachen grundsätzlich nicht?

hier ist einmal ein Auszug aus dem Kreisbutton

Delphi-Quellcode:
procedure TOButton.Paint;
var i: Integer;
begin
  // Position für Anzeige von Caption
  x := (Width - Canvas.TextWidth(Caption)) div 2;
  y := (Height- Canvas.TextHeight(Caption)) div 2;
  // OButton gedrückt
  if Pressed then
    for i := 1 to 3 do
    begin
      // Canvas.Pen.Color := OColor[4-i];      
      Canvas.Pen.Color := OColor[(i+1) div 2];    //statt den paar zeilen ein Bild einfügen
      Canvas.Arc (i, i, Width-i, Height-i, i, i, i, i);
      Canvas.Ellipse (3, 3, Width-3, Height-3);
      Canvas.TextOut (x+1,y+1, Caption+' ');
    end
  // OButton nicht gedrückt
  else
    for i := 1 to 3 do
    begin
      Canvas.Pen.Color := OColor[i];
      Canvas.Arc (i, i, Width-i, Height-i, i, i, i, i);//hier genau so
      Canvas.Ellipse (3, 3, Width-3, Height-3);
      Canvas.TextOut (x,y, Caption+' ');
    end;
end;

sirius 17. Feb 2008 12:28

Re: Bild in eine Buttonkomponente??
 
Und der TBitButton reicht dir nicht?

STS301 17. Feb 2008 12:29

Re: Bild in eine Buttonkomponente??
 
naja, ich will eher eine eigene Buttonform (das Bild) und nicht ein Bild im Button

STS301 18. Feb 2008 13:09

Re: Bild in eine Buttonkomponente??
 
kann mir wirklich keier helfen?

Landfloh 18. Feb 2008 13:14

Re: Bild in eine Buttonkomponente??
 
Ich würd auch sagen der TBitButton sonst kenn ich nichts. :|

STS301 18. Feb 2008 13:39

Re: Bild in eine Buttonkomponente??
 
das heißt sonst muss man den Button mit Canvas zeichnen, oder wie sonst?

sieht bei den AlphaSkinButtons ziemlich schwierig aus es nur mit Canvas zu machen?

rollstuhlfahrer 18. Feb 2008 16:55

Re: Bild in eine Buttonkomponente??
 
ne andere version ist die Image-Komponente, die auch angeklickt werden kann. Wenn man das Image auf Transpartent schaltet kanns auch wie ein Button aussehen. Nur der Klick wird auch dann gehaldelt, wenn er nicht auf dem Bild ist...

rollstuhlfahrer

STS301 18. Feb 2008 17:10

Re: Bild in eine Buttonkomponente??
 
das möchte ich ja vermeiden

hat sonst keiner eine Idee??

DeddyH 18. Feb 2008 17:14

Re: Bild in eine Buttonkomponente??
 
Du könntest das Image laden, abscannen und Dir eine region zusammenbasteln, aber das ist alles Andere als trivial.

HalloDu 18. Feb 2008 17:18

Re: Bild in eine Buttonkomponente??
 
Vor kurzem erst hat doch jemand einen runden Button geschrieben. Hier

STS301 18. Feb 2008 17:19

Re: Bild in eine Buttonkomponente??
 
Zitat:

Zitat von DeddyH
Du könntest das Image laden, abscannen und Dir eine region zusammenbasteln, aber das ist alles Andere als trivial.

bis Image laden komme ich mit, abscannen auch noch aber danach stehe ich auf der Leitung???

wie hast du es eigentlich mit deinem Button gemacht (ich würde es wenn es geht nur ohne GDI+ machen)

unter uns: ich finde die GDi+.dll nicht !!, weder auf msdn noch bei deinem Source :(

@HalloDu
einen "Runden Button" habe ich ja auch schon geschrieben --> .pas am Anfang

DeddyH 18. Feb 2008 17:25

Re: Bild in eine Buttonkomponente??
 
Zur DLL: schau mal hier (am Besten mit dem IE).

STS301 18. Feb 2008 17:33

Re: Bild in eine Buttonkomponente??
 
unter deinem Link steht, dass die Seite weggezogen ist und dann werde ich zu "Windows® Server 2003 SP1 Platform SDK Web Install" verlinkt (mit IE 7).

und kannst du mir vielleicht bei meinem Problem weiterhelfen:

bis Image laden komme ich mit, abscannen auch noch aber danach stehe ich auf der Leitung???

DeddyH 18. Feb 2008 17:35

Re: Bild in eine Buttonkomponente??
 
Du müsstest die Form erkennen und dementsprechend eine Region bilden, aber da schreib ich jetzt keinen Source dazu, das ist mir viel zu aufwändig.

STS301 18. Feb 2008 17:41

Re: Bild in eine Buttonkomponente??
 
na gut danke.
kann mir vielleicht jemand einen Link oder ein Tutorial zu dem von DeddyH angesprochenes Thema geben?

Muetze1 18. Feb 2008 17:48

Re: Bild in eine Buttonkomponente??
 
Delphi-Quellcode:
function CreateBitmapRegion(const ABitmap: TBitmap): HRGN;
var
  lTransparentColor: TRGBTriple;
  lX, lY, lStartX: Integer;
  lPixel: PRGBQuad;
  lExcluded: HRGN;
begin
  if assigned(ABitmap) then
  begin
    result := CreateRectRGN(0, 0, ABitmap.Width, ABitmap.Height);

    ABitmap.PixelFormat := pf32bit;

    lTransparentColor.rgbtRed  := GetRValue(ColorToRGB(ABitmap.TransparentColor));
    lTransparentColor.rgbtGreen := GetGValue(ColorToRGB(ABitmap.TransparentColor));
    lTransparentColor.rgbtBlue := GetBValue(ColorToRGB(ABitmap.TransparentColor));

    for lY := 0 to pred(ABitmap.Height) do
    begin
      lPixel := ABitmap.Scanline[lY];

      lStartX := -1;

      for lX := 0 to pred(ABitmap.Width) do
      begin
        if (lPixel^.rgbRed  = lTransparentColor.rgbtRed) and
           (lPixel^.rgbGreen = lTransparentColor.rgbtGreen) and
           (lPixel^.rgbBlue = lTransparentColor.rgbtBlue) then
        begin
          if lStartX = -1 then
            lStartX := lX;
        end
        else
        begin
          if lStartX > -1 then
          begin
            lExcluded := CreateRectRGN(lStartX, lY, lX, succ(lY));
            try
              CombineRGN(result, result, lExcluded, RGN_DIFF);
              lStartX := -1;
            finally
              DeleteObject(lExcluded);
            end;
          end;
        end;
        Inc(lPixel);
      end;

      if lStartX > -1 then
      begin
        lExcluded := CreateRectRGN(lStartX, lY, ABitmap.Width, succ(lY));
        try
          CombineRGN(result, result, lExcluded, RGN_DIFF);
        finally
          DeleteObject(lExcluded);
        end;
      end;
    end;
  end
  else
    result := 0;
end;
Liefert dir eine Region zu dem übergebenen Bild, wobei die Region alle Teile ausschliesst, welche die Transparenzfarbe des Bitmaps haben.

Ansonsten: MSDN-Library durchsuchenSetWindowRgn()

bitsetter 18. Feb 2008 18:05

Re: Bild in eine Buttonkomponente??
 
Zitat:

Zitat von rollstuhlfahrer
ne andere version ist die Image-Komponente, die auch angeklickt werden kann. Wenn man das Image auf Transpartent schaltet kanns auch wie ein Button aussehen. Nur der Klick wird auch dann gehaldelt, wenn er nicht auf dem Bild ist...

rollstuhlfahrer

Hallo,

wenn du ein Bitmap benutzt, dann kannst du beim Klicken die Farbe des Pixels unter dem Kursor vom Bild abfragen. Nur wenn die Farbe ungleich von TransparentColor des Bildes ist, dann wird das onMouseDown Ereignis ausgelöst sonst nicht. Alternativ könnte man auch die Maske des Bildes abfragen.

STS301 18. Feb 2008 18:16

Re: Bild in eine Buttonkomponente??
 
@Muetze1
Danke, was muss ich an dem Source ändern, damit ich das gewünschte Bild bekomme (ich will jetzt nicht zu viel verlangen, ich habe aber überhaupt keine Ahnung was der Source bedeutet :( )

@bitsetter
stimmt so könnte man es machen, aber es ist leider kein Button :pale:

Muetze1 18. Feb 2008 19:21

Re: Bild in eine Buttonkomponente??
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kleines Beispiel im Anhang. Damit solltest du dann deinen Button anpassen können.

STS301 18. Feb 2008 19:27

Re: Bild in eine Buttonkomponente??
 
danke, und hoffentlich ein Bild einfügen können
setzte mich dann morgen damit auseinander :thanks:

Muetze1 18. Feb 2008 19:49

Re: Bild in eine Buttonkomponente??
 
Das bedeutet du weisst nur nicht wie man eine Eigenschaft definiert die ein Bild aufnimmt um es dann auch zum Zeichnen zu nutzen?

Delphi-Quellcode:
type
  TButttonKompo = class(TCustomControl)
  private
    fBild: TBitmap;
    procedure SetBild(AValue: TBitmap);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure Paint; override;
  published
    property Bild: TBitmap read fBild write SetBild;
  end;

...

constructor TButtonKompo.Create(AOwner: TComponent)
begin
  inherited;

  fBild := TBitmap.Create;
end;

destructor TButtonKompo.Destroy;
begin
  fBild.Free;

  inherited;
end;

procedure TButtonKompo.SetBild(AValue: TBitmap);
begin
  fBild.Assign(AValue);
  Invalidate;
end;

procedure TButtonKompo.Paint;
begin
  if not fBild.Empty then
    self.Canvas.Draw(0, 0, fBild);
end;
So, das ist alles. Ohne Gewähr, da hier im Forum getippt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 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