BitBtn und übergrosses Bitmap

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Mathias
Beiträge: 6710
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

BitBtn und übergrosses Bitmap

Beitrag von Mathias »

So wie es scheint, habe ich gerade ein Bug entdeckt.
Das Glyph geht über die Kante des BitBtn.
Nach meines Wissens, darf bei einem Widget nicht über die Kante hinaus gezeichnet werden.
Noch extrem wird der Effekt, wen ich diesen Button noch verkleinere.
Ich verwende GTK2.
Dateianhänge
Bildschirmfoto vom 2024-09-22 13-46-21.png
Bildschirmfoto vom 2024-09-22 13-46-21.png (4.41 KiB) 901 mal betrachtet
bitbtn_test.zip
(156.85 KiB) 49-mal heruntergeladen
Bildschirmfoto vom 2024-09-22 13-40-37.png
Bildschirmfoto vom 2024-09-22 13-40-37.png (3.63 KiB) 901 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Ally
Beiträge: 273
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: BitBtn und übergrosses Bitmap

Beitrag von Ally »

Hallo Mathias,

unter Windows passiert das nicht.
Ich würde das trotzdem nicht als Bug bezeichnen.
Eine .ico-Datei als Glyph zu verwenden ist eine etwas suboptimale Vorgehensweise.
Eine .ico-Datei beinhaltet mehrere Bitmaps in unterschiedlichen Auflösungen, die eigentlich nur unter Windows wirklich richtig genutzt werden (Desktop, Explorer usw.).
Für einen BitBtn bietet Lazarus schon seit geraumer Zeit bessere Alternative zu Glyph.
Benutzt man statt dessen eine Imagelist wird es z.B. sehr einfach eine Anwendung skalierbar zu machen.
Anbei ein Beispiel.
Man beachte auch den Ressourcenverbrauch. Das Ico ist 131 kb groß, die drei Bug-Bitmaps bringen es zusammen auf gerade mal 6 kb.
Bei einer Anwendung mit vielen Buttons kann sich das sehr unangenehm bemerkbar machen.

Gruß
Roland
Dateianhänge
BugButton.zip
(148.24 KiB) 45-mal heruntergeladen

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

Re: BitBtn und übergrosses Bitmap

Beitrag von wp_xyz »

Ich denke schon, dass das ein Bug ist, der unter gtk2 speziell beim ico-Format auftritt. Der Fehler kommt nicht unter gtk3 und qt5 (andere WS habe ich nicht getestet), und auch nicht bei png. Du solltest einen Bug-Report schreiben.

Mathias
Beiträge: 6710
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: BitBtn und übergrosses Bitmap

Beitrag von Mathias »

Eine .ico-Datei als Glyph zu verwenden ist eine etwas suboptimale Vorgehensweise.
Das ico war nur als Test. Das Problem tritt auch auf, bei kleinen PNG-Dateien kleiner 1KB.
Ich denke schon, dass das ein Bug ist, der unter gtk2 speziell beim ico-Format auftritt.
Jetzt die Frage, kommt dies auch bei nativen GTK2 vor.

Verwendet Lazarus folgendes intern ?

Code: Alles auswählen

 gtk_button_set_image(GTK_BUTTON(button), image);
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: BitBtn und übergrosses Bitmap

Beitrag von wp_xyz »

Mathias hat geschrieben: So 22. Sep 2024, 18:26 Das ico war nur als Test. Das Problem tritt auch auf, bei kleinen PNG-Dateien kleiner 1KB.
Kann ich nicht bestätigen. Wenn ich eines der 64x64 großen png Bilder aus images/general_purpose der Glyph-Property eines 40x40 großen TBitBtn zuweise, wird NICHT über den Rand rausgezeichnet.

Mathias
Beiträge: 6710
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: BitBtn und übergrosses Bitmap

Beitrag von Mathias »

Es passiert auch, wen ich eine 24x24 png nehme.

Und je länger der Text in Caption, desto schlimmer wird es.
Dateianhänge
Bildschirmfoto vom 2024-09-22 19-55-08.png
Bildschirmfoto vom 2024-09-22 19-55-08.png (2.54 KiB) 847 mal betrachtet
bitbtn_test.tar
(148 KiB) 44-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: BitBtn und übergrosses Bitmap

Beitrag von wp_xyz »

Mathias hat geschrieben: So 22. Sep 2024, 19:55 Es passiert auch, wen ich eine 24x24 png nehme.

Und je länger der Text in Caption, desto schlimmer wird es.
Hast Recht. Der Caption-Text war zu kurz.

Mathias
Beiträge: 6710
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: BitBtn und übergrosses Bitmap

Beitrag von Mathias »

Der Fall ist Klar, das gibt einen Bugreport bei GTK2 und nicht bei Lazarus.

Code: Alles auswählen

program project1;

uses
  GLib2,
  Gdk2,
  Gtk2;

var
  Window, fixed, btn1, image: PGtkWidget;
begin
  GTK_Init(@argc, @argv);

  Window := gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(Window), 'Hallo');
  gtk_window_set_default_size(GTK_WINDOW(Window), 320, 200);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

  fixed := gtk_fixed_new();
  gtk_container_add(GTK_CONTAINER(window), fixed);

  btn1 := gtk_button_new();
  image := gtk_image_new_from_file('test.ico');

  gtk_button_set_image(GTK_BUTTON(btn1), image);
  gtk_fixed_put(GTK_FIXED(fixed), btn1, 10, 10);
  gtk_widget_set_size_request(btn1, 75, 25);

  gtk_widget_show_all(window);

  g_signal_connect(G_OBJECT(window), 'destroy', G_CALLBACK(@gtk_main_quit), nil);

  GTK_Main;
end.
Dateianhänge
Bildschirmfoto vom 2024-09-23 08-43-19.png
Bildschirmfoto vom 2024-09-23 08-43-19.png (5.82 KiB) 811 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6710
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: BitBtn und übergrosses Bitmap

Beitrag von Mathias »

Es gehört nicht direkt zum Thema.
Kann es sein, das in GTK2 der Button ein Images oder ein Label auf einmal aufnehmen kann.

Folgendes gibt nur ein Label.

Code: Alles auswählen

    button := gtk_button_new();
    gtk_button_set_image(GTK_BUTTON(button), image);
    gtk_button_set_label(GTK_BUTTON(button), 'Hello World');
Sobald ich die Zeile mit dem Label entferne, dann kommt das Images.

Ein BitBtn habe ich nur über einen Umweg hingekriegt, in dem ich für den Button einen selbstgemachten Container hinzufüge.

Code: Alles auswählen

  function CreateBitBtn: PGtkWidget;
  var
    lab, image, hbox: PGtkWidget;
  begin
    Result := gtk_button_new;
    hbox := gtk_hbox_new(False, 0);

    lab := gtk_label_new('Button');
    gtk_box_pack_start(GTK_BOX(hbox), lab, False, False, 10);
    image := gtk_image_new_from_file('test.ico');
    gtk_box_pack_end(GTK_BOX(hbox), image, False, False, 10);
    g_object_set(Result, 'child', hbox, nil);
  end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten