Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi SpeedButton: falsche Darstellung eines Bitmaps (https://www.delphipraxis.net/130121-speedbutton-falsche-darstellung-eines-bitmaps.html)

Helmi 3. Mär 2009 19:51


SpeedButton: falsche Darstellung eines Bitmaps
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

ich hab einen Speedbutton in den ich ein Bitmap lade.
Das Bitmap (cycle start.bmp) hat als Hintergrundfarbe grün.

Wenn das Bild in den Speedbutton geladen wurde, dann sieht man nur ansatzweise das grün.
Eigentlich sieht man den Hintergrund des Buttons.

Wieso seh ich nicht das komplette Bitmap und wie kann ich das richtig anzeigen lassen?

Satty67 3. Mär 2009 19:53

Re: SpeedButton: falsche Darstellung eines Bitmaps
 
Die Pixelfarbe unten links in der Ecke bestimmt die Farbe, die Transparent gezeichnet wird.

Helmi 3. Mär 2009 19:58

Re: SpeedButton: falsche Darstellung eines Bitmaps
 
Transparent = false hat nichts gebracht

Satty67 3. Mär 2009 20:01

Re: SpeedButton: falsche Darstellung eines Bitmaps
 
Ja, hab ich gemerkt (hab's heimlich wieder gelöscht)

Setze in das untere/linke Pixel mal ein rosa Punkt. Dann siehst Du wie es arbeitet.

3 Ideen habe ich jetzt dazu:

1. in jede Ecke ein rosa Pixel, dann ist es ein leicht abgerundeter Button
2. Bild in 17x16 zeichnen und links ein rosa Strich (Versatz mit Eigenschaft "Margin" ausgleichen)
3. Bild aus Imagelist, dann kann man wohl ein anderes Verhalten einstellen (kenne ich mich aber nicht mit aus)

Helmi 3. Mär 2009 20:04

Re: SpeedButton: falsche Darstellung eines Bitmaps
 
Zitat:

Zitat von Satty67
Ja, hab ich gemerkt (hab's heimlich wieder gelöscht)

Setze in das untere/linke Pixel mal ein rosa Punkt. Dann siehst Du wie es arbeitet.

Ah, cool -aber wieso ist das so?

Und muss ich jetzt meine ganzen Bitmaps, es sin ein paar viele, jetzt alle mit einem rosa Punkt ausstatten
oder kann ich das beim Reinladen auch im Code machen?

[Edit]
Ich hab 50 SpeedButtons und für jeden Button wird ein auswählbares Bitmap geladen
(steht in einer Ini-Datei)

Satty67 3. Mär 2009 20:06

Re: SpeedButton: falsche Darstellung eines Bitmaps
 
Hab' meinen Post oben erweitert, glaube da müsstest Du Dich mal mit ImageList beschäftigen, vielleicht weis hier auch jemand wie das dann genau funktioniert.

Warum ist das so...

hielt man beim Entwickler von Windows wohl für eine gute Idee, die Transparente Farbe eines Glyph zu definieren :stupid:

Zieh mal eine ImageList auf Dein Formular... Doppelklick auf das Symbol un ein paar Bilder reinladen.
Dann teste mal folgenden Code:
Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  aBitmap:TBitmap;
begin
  aBitmap := TBitmap.Create;
  ImageList1.GetBitmap(1 {<- hier ist der Index des zu ladenden Bildes}, aBitmap);
  SpeedButton1.glyph.Assign(aBitmap);
end;
(Hoffe das ist so korrekt)

Helmi 3. Mär 2009 20:34

Re: SpeedButton: falsche Darstellung eines Bitmaps
 
Ich habs jetzt mal mit einer Imagelist probiert.
Ich lade das bild in ein Bitmap - übergib das der Imagelist, wähl dann das erste Bild aus (ist ja nur eines drin)
und lass mir dann dieses Bild wieder auf Bitmap ausgeben.
Nur leider kommt das gleiche raus...

(Hab die ImageList zur Laufzeit erzeugen lassen)

Helmi 3. Mär 2009 20:57

Re: SpeedButton: falsche Darstellung eines Bitmaps
 
Habs jetzt so gelöst:

Delphi-Quellcode:
      //Bitmap erzeugen
      Bitmap := TBitmap.Create;

      try
        Bitmap.LoadFromFile(S);

        Bitmap.Canvas.Pixels[0, Pred(Bitmap.Height)] := clFuchsia;

        Dummy.Glyph.Assign(Bitmap);
      finally
        //Bitmap löschen und freigeben
        FreeAndNil(Bitmap);
      end;
Damit wird einfach das linke untere Pixel auf die Farbe clFuchsia umgeschrieben
und schon funktionierts.

Garfield 4. Mär 2009 07:25

Re: SpeedButton: falsche Darstellung eines Bitmaps
 
Zitat:

Zitat von Helmi
Wieso seh ich nicht das komplette Bitmap und wie kann ich das richtig anzeigen lassen?

Liegt wohl daran, dass Du nicht die klassische Oberfläche von Windows verwendest. Das Icon wird mit dieser procedure gezeichnet:
Delphi-Quellcode:
procedure TButtonGlyph.DrawButtonGlyph(Canvas: TCanvas; const GlyphPos: TPoint;
  State: TButtonState; Transparent: Boolean);
var
  Index: Integer;
  Details: TThemedElementDetails;
  R: TRect;
  Button: TThemedButton;
begin
  if FOriginal = nil then Exit;
  if (FOriginal.Width = 0) or (FOriginal.Height = 0) then Exit;
  Index := CreateButtonGlyph(State);
  with GlyphPos do
  begin
    if ThemeServices.ThemesEnabled then
    begin
      R.TopLeft := GlyphPos;
      R.Right := R.Left + FOriginal.Width div FNumGlyphs;
      R.Bottom := R.Top + FOriginal.Height;
      case State of
        bsDisabled:
          Button := tbPushButtonDisabled;
        bsDown,
        bsExclusive:
          Button := tbPushButtonPressed;
      else
        // bsUp
        Button := tbPushButtonNormal;
      end;
      Details := ThemeServices.GetElementDetails(Button);
      ThemeServices.DrawIcon(Canvas.Handle, Details, R, FGlyphList.Handle, Index);
    end
    else
      if Transparent or (State = bsExclusive) then
      begin
        ImageList_DrawEx(FGlyphList.Handle, Index, Canvas.Handle, X, Y, 0, 0,
          clNone, clNone, ILD_Transparent)
      end
      else
        ImageList_DrawEx(FGlyphList.Handle, Index, Canvas.Handle, X, Y, 0, 0,
          ColorToRGB(clBtnFace), clNone, ILD_Normal);
  end;
end;
Ist ThemeServices.ThemesEnabled wird die Eigenschaft Transparent nicht ausgewertet.


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