AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi SpeedButton: falsche Darstellung eines Bitmaps
Thema durchsuchen
Ansicht
Themen-Optionen

SpeedButton: falsche Darstellung eines Bitmaps

Ein Thema von Helmi · begonnen am 3. Mär 2009 · letzter Beitrag vom 4. Mär 2009
Antwort Antwort
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#1

SpeedButton: falsche Darstellung eines Bitmaps

  Alt 3. Mär 2009, 19:51
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?
Angehängte Grafiken
 
Angehängte Grafiken
Dateityp: bmp cycle_start_179.bmp (2,7 KB, 23x aufgerufen)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

Re: SpeedButton: falsche Darstellung eines Bitmaps

  Alt 3. Mär 2009, 19:53
Die Pixelfarbe unten links in der Ecke bestimmt die Farbe, die Transparent gezeichnet wird.
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#3

Re: SpeedButton: falsche Darstellung eines Bitmaps

  Alt 3. Mär 2009, 19:58
Transparent = false hat nichts gebracht
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#4

Re: SpeedButton: falsche Darstellung eines Bitmaps

  Alt 3. Mär 2009, 20:01
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)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#5

Re: SpeedButton: falsche Darstellung eines Bitmaps

  Alt 3. Mär 2009, 20:04
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)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#6

Re: SpeedButton: falsche Darstellung eines Bitmaps

  Alt 3. Mär 2009, 20:06
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

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)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#7

Re: SpeedButton: falsche Darstellung eines Bitmaps

  Alt 3. Mär 2009, 20:34
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)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#8

Re: SpeedButton: falsche Darstellung eines Bitmaps

  Alt 3. Mär 2009, 20:57
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.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#9

Re: SpeedButton: falsche Darstellung eines Bitmaps

  Alt 4. Mär 2009, 07:25
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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:24 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