Registriert: Mo Mai 29, 2006 21:13 Beiträge: 142 Wohnort: Ballenstedt/Sachsen-Anhalt
Hallöle!
Ich habe ein Problem (an sich nix neues )
Und zwar habe ich in einem OpenGL-Programm vor eine Dateiübersicht zu machen, mit den Windows-Icons. Die hab ich auch schon als TIcon bzw. als Handle vorliegen. Im Moment kopiere ich diese dann in ein TBitmap und übergebe das an TglBitmap. Ist natürlich doof, weil ich da immer einen Rand dran habe. Einfach einen Alpha-Test nehmen kann ich auch nicht, TIcon hat ja die Transparenzdaten nicht umsonst.
So, wie mache ich das nun? Bzw. wie muss die Funktion aussehen (nehme ich mal an), die ich an LoadFromFunc übergeben muss?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das Sinnvollste wäre eigentlich, wenn du die kleinen Icons in eine größere Textur einbastelst in der sich nur Icons befinden. Aber einen anderen weg als über die Bitmaps wirst du wohl nicht finden. Einbasteln könntest du ein anderen Bit recht einfach mit TBitmap.Scanline und TglBitmap32.Scanline. Einfach rein kopieren. (Die Daten der Textur dürfen dann aber nicht freigegeben werden) Wenn du dann noch die Richtigen Koordinaten setzt ist alles in Butter.
Registriert: Mo Mai 29, 2006 21:13 Beiträge: 142 Wohnort: Ballenstedt/Sachsen-Anhalt
Danke für deine Antwort.
Lossy eX hat geschrieben:
Einbasteln könntest du ein anderen Bit recht einfach mit TBitmap.Scanline und TglBitmap32.Scanline. Einfach rein kopieren.
Kann an der Uhrzeit liegen, aber den Satz versteh ich nicht
Jedenfalls. So wie ich das jetzt verstanden habe, ist da aber immer noch nix transparent dran, oder? Das Problem ist ja, dass ich nicht wirklich an die Infos ran komme.
Aha: Es gibt eine Funktion GetIconInfo(). So richtig versteh ich das aber nicht, und finden tu ich da auch nix zu...
Wie auch immer, ich geh jetzt ins Bett. Mal sehen, wie die Sache morgen aussieht
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Martok hat geschrieben:
Lossy eX hat geschrieben:
Einbasteln könntest du ein anderen Bit recht einfach mit TBitmap.Scanline und TglBitmap32.Scanline. Einfach rein kopieren.
Kann an der Uhrzeit liegen, aber den Satz versteh ich nicht
Kann dir da nur zustimmen. Ich war müde und es war spät.
Martok hat geschrieben:
Aha: Es gibt eine Funktion GetIconInfo(). So richtig versteh ich das aber nicht, und finden tu ich da auch nix zu...
Diese Methode ist genau das was du brauchst. MSDN GetIconInfo. Hatte das mit dem Transparenten überlesen. Aber hier mal ein Code der die Verwendung verdeutlichen sollte.
Code:
procedure TForm1.Button1Click(Sender:TObject);
var
Ic: TIcon;
IconInfo: TIconInfo;
Bmp: TBitmap;
begin
Ic := TIcon.Create;
try
Ic.LoadFromFile('C:\test.ico');
GetIconInfo(Ic.Handle, IconInfo);
Bmp := TBitmap.Create;
try
Bmp.Handle:= IconInfo.hbmColor;
Image1.Picture.Assign(bmp);
Bmp.Handle:= IconInfo.hbmMask;
Image2.Picture.Assign(bmp);
finally
bmp.Free;
end;
finally
Ic.Free;
end;
end;
Habe hier leider nur Win2k aber unter XP sollte die Maske kein Monochromes Bild sein sondern sollte auch echte Transparenz enthalten. Sofern das von dem Icon unterstützt wird. Aber das tun viele auch wenn es nicht sofort offensichtlich sichtbar ist.
Zum Auslesen der Daten das Pixelformat de Bitmaps auf pf24Bit stellen und dann über Scanlines ansprechen. Diese kannst du dann einfach so in die glBitmap kopieren, denn meine Klassen unterstützen auch die Eigenschaft Scanlines. Aber das sollte kein großes Problem sein denke ich. Wenn es doch nicht klappen sollte weißt du ja was zu tun ist.
Registriert: Mo Mai 29, 2006 21:13 Beiträge: 142 Wohnort: Ballenstedt/Sachsen-Anhalt
Lossy eX hat geschrieben:
Martok hat geschrieben:
Lossy eX hat geschrieben:
Einbasteln könntest du ein anderen Bit recht einfach mit TBitmap.Scanline und TglBitmap32.Scanline. Einfach rein kopieren.
Kann an der Uhrzeit liegen, aber den Satz versteh ich nicht
Kann dir da nur zustimmen. Ich war müde und es war spät.
Na dann bin ich beruhigt
Lossy Ex hat geschrieben:
Habe hier leider nur Win2k aber unter XP sollte die Maske kein Monochromes Bild sein sondern sollte auch echte Transparenz enthalten. Sofern das von dem Icon unterstützt wird. Aber das tun viele auch wenn es nicht sofort offensichtlich sichtbar ist.
Zum Auslesen der Daten das Pixelformat de Bitmaps auf pf24Bit stellen und dann über Scanlines ansprechen. Diese kannst du dann einfach so in die glBitmap kopieren, denn meine Klassen unterstützen auch die Eigenschaft Scanlines. Aber das sollte kein großes Problem sein denke ich. Wenn es doch nicht klappen sollte weißt du ja was zu tun ist.
Danke für den Code, werd ich mal testen. Bei mir gibts auch nur W2k (aber ohne leider), von daher...
Der Rest sollte machbar sein
Registriert: Mo Mai 29, 2006 21:13 Beiträge: 142 Wohnort: Ballenstedt/Sachsen-Anhalt
Lossy eX hat geschrieben:
Wenn es doch nicht klappen sollte weißt du ja was zu tun ist.
Ähm, ja.
Wenn ich dem per Handle zugewiesenen Bitmap an die Scanlines will, geht das leider nicht? Beim setzen von Pixelformat wird das Bitmpamp gelöscht.
Auch das vorherige kopieren in ein anderes Bitmap bringt nichts, es gibt ne schöne weiße Fläche...
Interessant finde ich ja, dass das dann im TImage geht...
Scheint so, als ob das TBitmap nicht wirklich an dem Handle hängt.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hmmm. Okay. Muss gestehen, dass ich das so bisher noch nicht probiert habe. Aber was auf jeden Fall gehen sollte ist, wenn du eine 32 Bittiges Bitmap erstellst, was die selben Ausmaße hat etc und dann das mit dem Handle einfach drauf zeichnen. Dann solltest du deine Daten in einem Bitmap mit ScanlineZugriff haben.
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.