Linux Standardicons in Anwendung nutzen
-
- Lazarusforum e. V.
- Beiträge: 7178
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Ja, bei meinen XINE Versuchen bin ich auch über dieses Problem gestolpert, du hast eine Unit doppelt drin, lösche doch mal alle GTK2 Units, evlt. klappt es dann besser.
edit: Achso, dann lösche mal die Unit GTK oder so. Da wo der angesprochen Daten Typ Defniert wird. Weil es gibt ein Konflikt zwischen zwei gleichen Datentypen. Darauf deutet die Unit hin. Du hast zwei Units eingebunden in den der gleiche Daten Typ defniert wird.
edit: Achso, dann lösche mal die Unit GTK oder so. Da wo der angesprochen Daten Typ Defniert wird. Weil es gibt ein Konflikt zwischen zwei gleichen Datentypen. Darauf deutet die Unit hin. Du hast zwei Units eingebunden in den der gleiche Daten Typ defniert wird.
MFG
Michael Springwald
Michael Springwald
Genau, das Beispiel läuft natürlich nur unter GTK+,
ich habe auch Lazarus mit GTK2 neu erstellt, weiß aber nicht ob das nötig ist.
Hier habe ich mal eine Unit gebastelt, der Vorteil, du kannst nun auch Icons ausserhalb der StockIcons laden (e.g. help-about etc.)
Allerdings bin ich mit der Qualität noch nicht so zufrieden, wenn jemand eine Lösung hätte,
wie ich ich ein Pixbuf verlustfrei in ein HBitmap wandeln kann, immer her damit.
gdk_pixbuf_render_pixmap_and_mask() scheint mir nicht so ideal zu sein.
ich habe auch Lazarus mit GTK2 neu erstellt, weiß aber nicht ob das nötig ist.
Hier habe ich mal eine Unit gebastelt, der Vorteil, du kannst nun auch Icons ausserhalb der StockIcons laden (e.g. help-about etc.)
Code: Alles auswählen
unit gtk2loadpixmap;
{$mode objfpc}{$H+}
interface
uses
LCLType, LCLIntf, Controls, Graphics, SysUtils, Math,
gdk2pixbuf, glib2, gdk2, gtk2, gtkdef, gtkint;
type
PStrings = array of PChar;
function LoadThemeIcon(Name: PChar; Size: integer): HBitmap;
procedure LoadBitmap(Bitmap: TBitmap; Name: PChar; Size: integer);
procedure LoadImageList(Images: TImageList; Names: PStrings);
implementation
function Pixbuf2HBitmap(Pixbuf: PGDKPixbuf): HBitmap;
const
alpha_threshold = 151;
var
Pixmap: PGDIObject;
begin
Pixmap := GtkWidgetSet.NewGDIObject(gdiBitmap);
Pixmap^.GDIBitmapType := gbPixmap;
gdk_pixbuf_render_pixmap_and_mask(Pixbuf, Pixmap^.GDIPixmapObject.Image,
Pixmap^.GDIPixmapObject.Mask, alpha_threshold);
Result := HBitmap(PtrUInt(Pixmap));
end;
function LoadThemeIcon(Name: PChar; Size: integer): HBitmap;
const
Directions: array[0..2] of PChar = ('', '-ltr', '-rtl');
var
i: integer;
Pixbuf: PGdkPixbuf;
begin
Result := 0;
i := 0;
repeat
Pixbuf := gtk_icon_theme_load_icon(gtk_icon_theme_get_default(),
StrCat(Name,Directions[i]), Size, GTK_ICON_LOOKUP_FORCE_SVG, NULL);
inc(i);
until (Pixbuf <> NULL) or (i >= High(Directions));
if Pixbuf <> NULL then begin
Result := Pixbuf2HBitmap(Pixbuf);
gdk_pixbuf_unref(Pixbuf);
end;
end;
procedure LoadBitmap(Bitmap: TBitmap; Name: PChar; Size: integer);
var
BH: HBitmap;
begin
BH := LoadThemeIcon(Name, Size);
if BH <> 0 then Bitmap.Handle := BH;
end;
procedure LoadImageList(Images: TImageList; Names: PStrings);
var
BM: TBitmap;
BH: HBitmap;
i, l: integer;
begin
BM := TBitmap.Create;
l := Min(pred(Images.Count), High(Names));
try
for i := 0 to l do if Names[i] <> '' then begin
BH := LoadThemeIcon(Names[i], Images.Width);
if BH <> 0 then begin
BM.Handle := BH;
Images.Replace(i, BM, nil);
end;
end;
finally
BM.Free;
end;
end;
end.
Allerdings bin ich mit der Qualität noch nicht so zufrieden, wenn jemand eine Lösung hätte,
wie ich ich ein Pixbuf verlustfrei in ein HBitmap wandeln kann, immer her damit.
gdk_pixbuf_render_pixmap_and_mask() scheint mir nicht so ideal zu sein.
auch auch die Mimetypes. werden geladen ?
Damit meinst du die Datei Formate ?(also z.b. mp3 oder wav) richtig ?
Wenn du als IconName den MimeType angibst also 'audio-mpeg' oder 'audio-x-mpeg', dann wird (sofern vorhanden) das Icon für mp3 geladen.
Und das geht für alle Linux Arten ? Also unter Ubuntu, KDE, und wie sie nicht alle heißen ?
Dazu müssen der GTK+ Bibliotheken installiert sein (ich meine Kubuntu unterstützt GTK+, sollte also laufen).
-
- Beiträge: 688
- Registriert: Mi 3. Okt 2007, 21:00
- OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
- CPU-Target: x86_64
DiBo33 hat geschrieben:Hier habe ich mal eine Unit gebastelt, der Vorteil, du kannst nun auch Icons ausserhalb der StockIcons laden (e.g. help-about etc.)
Wow! Klasse! Das Problem von vorhin ist meiner Dämlichkeit zuzuschreiben, jetzt läuft's. (Ich musste nur alle vorkompilierten Units entfernen)
Ich vermerke dich auf jeden Fall mal als Autor der Funktion, ich hätte mich mit meiner pixeligen Lösung bzw. Lösung nr. 3 von dir jetzt zufrieden gegeben.