[Erledigt] TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

[Erledigt] TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Beitrag von Nimral »

Problem: die Anzeige des Glyphen für den ungedrückten Zustand funktioniert beim BitButton und beim SpeedButton nur mit bestimmten Glyphen-Größen (hier: 40x40).

Wie das Testprojekt zeigt, funktionieren die 5 Glyphen mit einem 40x40 Bitmap (5 nebeneinander) einwandfrei. Die beiden kleineren Glyphen werden im Grundzustand (Button nicht betätigt - Glyph 1) nicht oder falsch gezeichnet (die orange Linie stammt offensichtlich von Glyph 1), wenn mit der Maus draufgeklickt oder drübergefahren (hover) wird, werden die Glyphen 2..4 korrekt gezeigt. Auch der "disabled" Glyph funktioniert.
BitBtn Glyph Problem.png
BitBtn Glyph Problem.png (5.38 KiB) 2577 mal betrachtet
Auf die Idee, dass es an der Größe liegen könnte kam ich durch einen Forenbeitrag von 2014, in dem jemand ein vergleichbares Problem unter Unix berichtet hat, allerdings fehlt da ein Hinweis darauf dass es nur den 1. Glyphen betrifft. Ich habe png und bmp versucht, beide verhalten sich gleich.

Bei Speedbuttons funktionieren die Glyphen mit den selben Grafikdateien und EInstellungen ebenfalls nicht richtig.

Kann bitte jemand das Problem nachvollziehen, damit ich guten Gewissens einen Bugreport einreichen kann? Oder habe ich doch was übersehen, kennt jemand vielleicht einen Workaround?

Anbei ein Testprojekt.

Lazarus 2.0.12 x32 auf WIndows 10 x64

Thnx, Armin.
Dateianhänge
BitButtonTest.zip
(132.89 KiB) 130-mal heruntergeladen
Zuletzt geändert von Nimral am Sa 15. Mai 2021, 12:24, insgesamt 2-mal geändert.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Beitrag von wp_xyz »

Das Problem liegt in der Art, wie in Delphi die Transparenz von Bitmaps eingeführt worden ist: Standardmäßig wird die Farbe des linken unteren Pixels eines Bitmaps als transparente Farbe angenommen, so dass die eigentlich undurchsichtigen alten Bitmaps auch transparent dargestellt werden können. Nun sind deine 20er und 24er Bilder aber bis zum Rand mit "Nutzfarbe" gefüllt, das bedeutet, dass das die linke untere Ecke des 1.Bildes die Transparenzfarbe definiert und das komplette 1. Bild als transparent dargestellt wird. Nimm mal mein beigefügten Modifikationen, und du wirst sehen, dass alles richtig funktioniert: ich habe im 20er-Streifen jedes Eck-Pixel weiß eingefärbt und im 24er-Streifen nur das linke untere Pixel des ganzen Streifens geändert, um zu zeigen, dass es nur auf dieses eine Pixel ankommt.
Dateianhänge
BtnGlyphMarkers_28x28-wp.png
BtnGlyphMarkers_28x28-wp.png (229 Bytes) 2540 mal betrachtet
BtnGlyphMarkers_20x20-wp.png
BtnGlyphMarkers_20x20-wp.png (168 Bytes) 2540 mal betrachtet

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Beitrag von Nimral »

Autsch.

Und daher die Linie auf dem einen Button ... mein Grafikprogramm hat, weil ich nicht darauf geachtet habe, an der Grenze der Glyphen mit Anti-Aliasing gearbeitet und deswegen war das Orange dort leicht anders. Aus dem gleichen Grund kamen dann die anderen 4 Glyphen annähernd richtig, weil dort die linke Pixellinie ganz leicht anders gefärbt war. Dass die Glyphen ein Pixel zu schmal sind fällt erst mal nicht auf. Was für eine Fußangel.

Mir scheint das wichtig, gibt es irgendwo einen Strich Doku zu diesem doch recht überraschenden Verhalten? Kann man es vielleicht sogar abschalten - schließlich unterstützen AFAIK sowohl bmp als auch png seit einer Dekade einen richtigen Alpha-Kanal? Abgesehen davon wünscht sich der Kunde meines jetzigen Projekts eckige, schwarze Glyphen. Ich kann natürlich das eine Pixelchen auch in Dunkel-Dunkelgrau zeichnen, dann sieht man es nicht...

Danke für Deine Info! Wieder mal :-) Ich seh schon, irgendwann muss ich mal etwas ausgeben, ohne Deine und der anderen Hero's Hilfe geht man mit Lazarus sang und klanglos unter.

Armin.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [Erledigt] TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Beitrag von Winni »

Hi!

Eine Hilfe um die Fallstricke dieses uralten Themas zu umgehen:

Pinsel das Glyph ohne Rücksicht auf links unten.
Und dann setzt Du im FormCreate:

Code: Alles auswählen

MyButton.Glyph.canvas.Pixels[0, MyButton.Glyph.height -1] := ClTansparenteFarbe;
Winni

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Beitrag von charlytango »

Nimral hat geschrieben:
Sa 15. Mai 2021, 12:23
Ich seh schon, irgendwann muss ich mal etwas ausgeben, ohne Deine und der anderen Hero's Hilfe geht man mit Lazarus sang und klanglos unter.
Jedes Entwicklungssystem und jede Sprache kennt solche Fallstricke und mehr.
Und in diesem besonderen Fall hättest du das gleiche Problem mit Delphi.
Möchte gar nicht wissen welcher Mist in anderen Sprachen sein Unwesen treibt.
Nur kommt man bei den üblichen "Hello World" oder CD-Verwaltungen als Demoprogram da nie drauf und alles ist eitel Wonne.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Beitrag von Winni »

charlytango hat geschrieben:
Sa 15. Mai 2021, 14:18
Und in diesem besonderen Fall hättest du das gleiche Problem mit Delphi.
Hi!

Die Mimik mit dem transparenten Pixel wurde in Windows 3.1 1992 eingeführt.
Das bedeuted, dass niemand dort darüber bescheid weiss, weil sie ja stolz sind, dass sie niemand im Personal haben, der länger als 15 Jahre für M$ arbeitet ......
Deppen.

Ich hab mit Deinem Problem unter Delphi 1 so etwa 1995 rumgekämpft. Seitdem hat sich da nix geändert. Obwohl Windows mal dringend eine vernünftige Implementierung des Alpha-kanals (Transparenz) nötig hätte.

Winni

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: [Erledigt] TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Beitrag von Nimral »

Tja, es ist ja nicht so, dass ich nicht in einem früheren Leben gewusst hätte, dass Windows das weiland (wenn ich mich recht erinnere für die ico Dateien) eingeführt hat. Als ich die Lösung sah, war mir schon ach dem 1. Satz klar worum es ging. Ich meine aber auch, dass diese Notlösung nicht lange beibehalten wurde, sie sollte eigenlich längst Geschichte sein. Dass sie es bis 2021 geschafft hat finde ich seltsam, und dass man das nicht wenigstens ausknipsen kann ebenfalls.

Aber egal, ich habe größere Probleme als ein lästiges Pixel, jetzt habe ich das Verhalten wieder auf dem Schirm. Es wird hoffentlich eine Weile im Gedächtnis bleiben.

Ich bin allerdings versucht, der Doku eine kleine Warnung hinzuzufügen. Den eher alten Hasen klingelt da irgendwas, Einsteiger aus der Generation Handy dürfte sowas ebenso ein Bein stellen wie der Generation vergesslich, zu der ich mich langsam zählen muss. Auch das Format mit den 5 nebeneinadnerliegenden Bildern ist glaub ich nicht beschrieben, ich bin da vor Jahren eher zufällig über die Speedbuttons drauf gestoßen.

Armin.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [Erledigt] TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Beitrag von Winni »

Hallo!

Ich hab mal in meinen alten Sourcen rumgewühlt, denn da gibt es folgenden Trick:

Man täuscht Transparenz vor, indem man das Glyph von Speed- oder Bit-Button mit der Farbe des parent füllt. Und dann malt man sich einen Button wie man auf jedem anderen Canvas halt malen kann.

Code: Alles auswählen

procedure TForm1.MyButtonClick(Sender: TObject);
const cap = 'Was ist los?';
      fHeight = 16;
var R, Rdest : TRect;
    w,h, x,y: integer;
begin
   w := MyButton.width;
   h := MyButton.Height;
   MyButton.glyph.SetSize (w,h);
   Rdest := Rect(0,0,w,h);
   MyButton.Glyph.Canvas.Brush.Color := ColorToRGB(MyButton.Parent.Color);
   MyButton.Glyph.Canvas.FillRect (RDest);
   R := Rect(4,4,w-4,h-4);
   MyButton.Glyph.Canvas.Pen.color := clRed;
   MyButton.Glyph.Canvas.Pen.Width:= 3;
   MyButton.Glyph.Canvas.Rectangle(R);
   MyButton.Glyph.Canvas.Font.Color := clBlue;
   MyButton.Glyph.Canvas.Font.Height := fHeight;
   x := (w-MyButton.Glyph.Canvas.TextWidth(cap)) div 2;
   y := (h -fHeight) div 2;
   MyButton.Glyph.Canvas.TextOut(x,y,cap);
end;
MyButton ist ein Speed- oder Bit-Button.


Winni

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Beitrag von wp_xyz »

Nimral hat geschrieben:
Sa 15. Mai 2021, 12:23
ohne Deine und der anderen Hero's Hilfe geht man mit Lazarus sang und klanglos unter.
Das geht dir mit jedem neuen Programm so. Meinst du bei mir war es anders? Das hat nichts mit Lazarus zu tun. Man muss jeden Fehler mindestens einmal gemacht und tagelang danach gesucht haben, dann ist man über dem Berg.
Winni hat geschrieben:
Sa 15. Mai 2021, 14:53
Ich hab mit Deinem Problem unter Delphi 1 so etwa 1995 rumgekämpft. Seitdem hat sich da nix geändert. Obwohl Windows mal dringend eine vernünftige Implementierung des Alpha-kanals (Transparenz) nötig hätte.
Das ist jetzt winni-mäßig mal wieder übertrieben. In Lazarus kannst du png-Bilder mit Alpha-Kanal verwenden, dort wo delphi noch TBitmaps verlangt hat, und der Alpha-Kanal funktioniert auch ohne BGRABitmap (vielleicht manchmal etwas umständlich, zugegeben).

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [Erledigt] TBitBtn, TSpeedButton: Glyphen Darstellungsfehler bei Glyph 1

Beitrag von Winni »

Hi!

Das mit der Übertreibung kannst Du Dir getrost sparen.

Ich hab über Windows geredet und da gilt:

CF_DIBV5 wird als Erweiterung des Bitmap-Standards für die Zwischenablage erlaubt - nur geht bei dem normalen Windows-Weg die Transparenz flöten. Oder man hat riesige Probleme, das Bild inkl. Transparenz aus der Zwischenablage zu erhalten. Haben wir gerade im internationalen BGRA-Sub-Forum durchgehechelt.

Die Transparenz ist in Windows "rangeflickt". Weil sie seinerzeit nicht kapiert haben, dass das 4. byte für Transparenz zustängig ist. Wie Apple und Linux es gemacht haben. Stattdessen haben sie ins 4. Byte die Infos für ihre System-Farben gepackt. De meistens erstmal mit ColorToRGB umgewandelt werden müssen. Sonst geht wieder was schief.

Dass Lazarus den Umweg über PNG geht, ist bekannt. Aber das war gerade nicht in der Diskussion.

Winni

Antworten