Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi SplashScreen mit PNG? (https://www.delphipraxis.net/56517-splashscreen-mit-png.html)

kingflo 7. Nov 2005 09:42


SplashScreen mit PNG?
 
Liste der Anhänge anzeigen (Anzahl: 3)
...mm ich weiß gerade nicht wie ich meine Frage formulieren soll...

Also ich habe ein Bild (ein png) und möchte es als SplashScreen für ein Programm einsetzen. Ich habe mir auch schon TPNGImage installiert.

Problem ist folgendes: wenn ich das Bild auf eine Form Packe sieht es super aus. Jetzt muss das Form aber ja transparent gemacht werden also setze ich TransparentColor auf true und als Value die BGColor farbe. Das doofe ist jetzt, das auf dem Image die BG Farbe aus dem Form auch transparent wird und das Bild aber als PNG schon transparenz hat. Folglich nimmt das Bild Als Farbwert dann auch teilweise das eingestellte BGColor.

Ich weiß das ist jetzt irgendwie doff beschrieben, aber besser formulieren konnte ich es nicht. Am bessten seht ihr euch die Anhänge an dan versteht Ihr villeicht wo mein Problem ist.

Ich bräuchte im Prinzip ne möglichkeit das Image zu zeigen ohne es auf ein Form zu packen oder so....

Hat jemand eventuell eine Idee was ich machen kann, damit das ergebnis so wird wie es sein soll?

MaBuSE 7. Nov 2005 11:02

Re: SplashScreen mit PNG?
 
Zitat:

Zitat von kingflo
Ich bräuchte im Prinzip ne möglichkeit das Image zu zeigen ohne es auf ein Form zu packen oder so....

Zum einen mit der Eigenschaft Transparent kannst Du genau eine Farbe trasparent machen.
Du hast aber einen Schatten. Der Schatten besteht natürlich aus mehreren Abstufungen. Das geht nicht mit Transparent.

Außerdem möchtest Du dass Das Splasch duchsichtig wird.

Dazu kann man die Eigenschaft AlphaBlend verwenden.

Das Image soll aber nicht duchsichtig werden.
Ein einfacher Weg wäre ein weiteres TForm, dass nur das bild beinhaltet und mit Transparenz auch nur dieses anzeigt. (Alphablend := False)

Zeige nun das Splash und lege das Andere Form darüber.

Ist zwar nicht die beste Lösung, sollte aber funktionieren.

Khabarakh 7. Nov 2005 16:02

Re: SplashScreen mit PNG?
 
Aber wird dann nicht der Alphakanal ignoriert (bzw. nicht richtig mit dem Hintergrund geblendet)?
@kingflo: Mit nur einer Form geht es über die API-Funktion MSDN-Library durchsuchenUpdateLayeredWindow. Ich kann heute abend eine kleine Demo dazu machen.

MaBuSE 8. Nov 2005 07:16

Re: SplashScreen mit PNG?
 
Zitat:

Zitat von Khabarakh
Aber wird dann nicht der Alphakanal ignoriert (bzw. nicht richtig mit dem Hintergrund geblendet)?

Das PNG wird auf die TForm gemalt.
Danach wird die Transpatent Eigenschaft bearbeitet. Und damit ist der "unschöne" Schatten zu sehen. Das wird praktisch mit dem TBitmap der TForm gemacht.

Vjay 8. Nov 2005 08:48

Re: SplashScreen mit PNG?
 
Vom rein logischen her wirst du mit einer quasi reinen "WM_PAINT und Alphatransparent"-Lösung keine Chance haben. Die Erklärung dafür steht in den anderen Beiträgen.

Das Einzige was sauber funktionieren wird ist Khabarakhs Vorschlag, muss da was die Praxis anbelangt aber auch passen.
Du weist damit dem Window das PNG zu und Windows kümmert sich um die korrekte Darstellung Pixel für Pixel. TransparentColor und Alphatransparency sind eigentlich nur Untermengen dieser Funktion.
Eine weitere Möglichkeit das ganze auch < Win2k funktionieren zu lassen, ist es wie die meisten Adobe-Produkte zu machen. Erst Screenshot, dann Bild drauf und darstellen (war zumindest früher so).

Khabarakh 8. Nov 2005 15:21

Re: SplashScreen mit PNG?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier die versprochene Demo.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Alpha: Boolean;
begin
  Bit := TBitmap32.Create;
  LoadPNGintoBitmap32(Bit, ExtractFilePath(ParamStr(0)) + 'test.png', Alpha);

  setWindowLong(Handle, GWL_EXSTYLE,
    getWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED {or WS_EX_TRANSPARENT});
  // WS_EX_TRANSPARENT macht das Fenster für Mausklicks transparent
 
  BlendF.BlendOp := AC_SRC_OVER;
  BlendF.BlendFlags := 0;
  BlendF.SourceConstantAlpha := 255;
  BlendF.AlphaFormat := AC_SRC_ALPHA;
  P := Point(0, 0);
  Size.cx := Bit.Width;
  Size.cy := Bit.Height;

  UpdateLayeredWindow(Handle, 0, nil, @Size, Bit.Handle, @P, 0, @BlendF, ULW_ALPHA);
end;
Ich verwende hier für den Alphakanal die GR32-Lib (ist einfach einfach :wink: ), aber es ist natürlich auch per WinAPI/VCL möglich.

kingflo 10. Nov 2005 07:57

Re: SplashScreen mit PNG?
 
danke so gehts *g* danke

Jonas 31. Dez 2005 13:58

Re: SplashScreen mit PNG?
 
Ich wollte mal fragen ob man das Bild nicht auch irgendwie aus ner Imagelist oder aus nem TImage oderso auslesen lassen kann? Naja ich wollte halt nicht das die datei außerhalb ist sondern mit in meiner exe.

xaromz 31. Dez 2005 14:02

Re: SplashScreen mit PNG?
 
Hallo,
Zitat:

Zitat von Jonas
Ich wollte mal fragen ob man das Bild nicht auch irgendwie aus ner Imagelist oder aus nem TImage oderso auslesen lassen kann? Naja ich wollte halt nicht das die datei außerhalb ist sondern mit in meiner exe.

dann pack doch das Bild als Ressource in die exe und lade Dein Bild dynamisch beim Start.

Gruß
xaromz

Jonas 31. Dez 2005 14:03

Re: SplashScreen mit PNG?
 
Joa das würde ich ja gerne, aber mit dem Resource Editor den ich habe, geht das nicht. Ich kann zwar pngs hinzufügen, doch wandelt er diese dann in bitmaps um.

xaromz 31. Dez 2005 14:10

Re: SplashScreen mit PNG?
 
Hallo,

bau Dir doch einfach eine Ressourcenscript. EInfach eine Textdatei erstellen und Folgendes reinschreiben:
Code:
SPLASH IMAGE SplashScreen.tif
Das compilierst Du dann mit brc32.exe und fügst die Ressource Deinem Programm hinzu.

Gruß
xaromz

Jonas 31. Dez 2005 14:15

Re: SplashScreen mit PNG?
 
Hab' diese exe nicht. Ich benutz normalerweise den XN Resource Editor welcher auch ansonsten super ist, nur PNGs da streikt er. Naja nicht wirklich, aber führt nicht zum gewünschtem erfolg. Gibt es nicht noch einen anderen Resource Editor (freeware) oder ne möglichkeit das Bild von meinem TImage zu laden?

mirage228 31. Dez 2005 14:16

Re: SplashScreen mit PNG?
 
Hi Jonas,

Die BRCC32.exe solltest Du im Bin-Verzeichnis von Delphi finden ;)

mfG
mirage228

Jonas 31. Dez 2005 14:18

Re: SplashScreen mit PNG?
 
Das ist auch der Ort wo ich nachgeschaut habe. Anschließend nochmal die komplette Partionion abgesucht. Nicht da. ;)

mirage228 31. Dez 2005 14:22

Re: SplashScreen mit PNG?
 
Zitat:

Zitat von Jonas
Das ist auch der Ort wo ich nachgeschaut habe. Anschließend nochmal die komplette Partionion abgesucht. Nicht da. ;)

Oh, das finde ich in der Tat seltsam. Vielleicht ist die Datei bei der Personal nicht vorhanden?

mfG
mirage228

Jonas 31. Dez 2005 14:24

Re: SplashScreen mit PNG?
 
Das mag sein, aber das ändert mein Problem nicht wirklich. Tatsache -> nicht da. Tatsache -> keinen plan wie ich das bild von meinem Image darein laden kann oder min. mit nem Resource Editor richtig importen kann.ö

xaromz 31. Dez 2005 14:32

Re: SplashScreen mit PNG?
 
Hallo,

hier findest Du alternative Resource Compilers.

Gruß
xaromz

PS: Google hilft!

Jothmom 2. Jan 2006 15:37

Re: SplashScreen mit PNG?
 
Liegt das Problem darin, dass du es unbeding mit einem PNG versuchen willst oder liegt es darin, dass der Splashscreen nicht rechteckig sein soll?

Falls es rechteckig ist dann zeichne doch einfach das PNG auf den Canvas der Form und setze die Formgröße auf die größe des PNG's fest..

Kannst du PNGS nicht aufs Canvas zeichnen?

Wenn du was anderes meinst tuts mir leid, bin neu hier :D

LH_Freak 17. Aug 2006 00:16

Re: SplashScreen mit PNG?
 
äh, wieso finde ich bei mir keine GR32_PNG? Hab die neuste Version :?

3_of_8 17. Aug 2006 01:17

Re: SplashScreen mit PNG?
 
Von was? Von den Graphikkomponenten? Wenn du die hast, dann überprüf mal deine Suchpfade.

Coder90 24. Aug 2006 18:25

Re: SplashScreen mit PNG?
 
Da runterladen und mit in den Graphics32 Ordner hauen.
http://www.delphipraxis.net/internal...=373755#373755
Bitteschön, Dankeschön, Wiedersehn.

herkulesamstart 2. Apr 2007 11:50

Re: SplashScreen mit PNG?
 
Ich möchte auch gerne ein kleines Projekt mit einem halbtransparentem Hintergrund machen...

wie komme ich denn an die hier benutzten Units(uses GR32, GR32_PNG;)dran?

DGL-luke 2. Apr 2007 12:24

Re: SplashScreen mit PNG?
 
www.graphics32.org

r_amse_s 23. Jul 2007 23:18

Re: SplashScreen mit PNG?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich beziehe mich auf dem beitrag #6 (demo von Khabarakh) und möchte diese technik für folgende app:
hauptsächlich soll de user 3 formen zur gesicht bekommen: splash, eine grosse und eine kleine form, wobei nach dem verschwinden des splash screens nur mehr die grosse und kleine form zur verfügung steht und zwischen er beliebig wechseln kann.

eine übersicht der klassenhierarchie wurde beigelegt. die grünen formen sollen anhand von png backgrounds dargestellt werden und sind nicht quadratisch und besitzen transparenz (grund warum ich mich für diese technik entschieden habe). ich habe bereits versucht diese technik einzubauen, jedoch bleiben die endformen(klein und gross) quadratisch, und nicht z.b. mit abgerundeter ecken.

der grund für diese etwas kompliziertere struktur ist, dass die module untereinander kommunizieren können, bzw. die app ist multilanguage ausgelegt.

das modul baseform beinhaltet die units pngimage, GR32, GR32_png die dafüt notwendig wären (wie in der demo) und deklariert eine funktion LoadPNG wo genau die funktionalität wie in der OnCreate von der demo drin steht.
diese methode wird in der jeweilige oncreate methode von alle 3 besagten formen.

was mache ich falsch ?

ich würde mich sehr freuen wenn, jemand mir helfen könnte.

Danke!

Khabarakh 25. Jul 2007 15:31

Re: SplashScreen mit PNG?
 
Zeige einmal ein wenig Code und/oder Ist-/Soll-Zustand-Bilder. Eigentlich muss nur WS_EX_LAYERED gesetzt werden und nach jeder Veränderung des Bitmaps UpdateLayeredWindow aufgerufen werden, dann sollte alles funktionieren.

Störtebeker 25. Jul 2007 20:55

Re: SplashScreen mit PNG?
 
Hi, kingflo.

Dein Splash Screen sieht echt klasse aus. :-D Wie hast du das gemacht, dass dieses "HTML,.... im Hintergrund, nur so schwach erscheint und wo hast du die TPNGImage her?

Thx, im Voraus.

Khabarakh 25. Jul 2007 21:28

Re: SplashScreen mit PNG?
 
Lies dir sein Posting noch einmal durch und du wirst bemerken, dass der Screenshot überhaupt nicht "echt" ist, sondern höchstwahrscheinlich in einem Grafikprogramm erstellt wurde. Und lies noch ein wenig weiter, dann könntest du sogar zu der Stelle des Threads gelangen, an der ich beschreibe, wie sich so etwas doch realisieren lässt. Und wenn du dann auch noch in deine Addressleiste wechselst und dort "google.de" eintippst, ja... dann könntest du mit etwas Glück sogar TPNGImage finden.

Störtebeker 25. Jul 2007 21:32

Re: SplashScreen mit PNG?
 
thx. das TPNGImage habe ich gefunden, funzt auch.
Den Rest würde ich dann z.B. einfach über Photoshop machen.

Thx.

Störtebeker 25. Jul 2007 22:05

Re: SplashScreen mit PNG?
 
Also, ich habe mir mal deine Demo runtergeladen. Wenn ich die Datei Project1.dpr in meinem Delphi öffnen möchte, meckert er rum, dass im die Datei Project1.res fehlt. Und sry, aber ich bin zwar trotz einiger Delphierfahrungen, aus dem Schulinformatikkurs und ein paar Versuchen zuhause auch noch kein Delphi-Ass und weiß daher leider nicht, wie ich den Text in meine Form einbinde. Ich habe mal durch zufall einen code gefunden, der die Form transparent macht, aber bis auf Button leider auch Images, Panels, etc., die dann auch transparent werden und somit nicht sichtbar. Einfach kopieren geht ja nicht, da meckert Delphi bei jedem dritten Wort: "undeclared identifier"

Folgender Code macht das Formular transparent. [Bis auf Button]

Delphi-Quellcode:

procedure TForm1.FormCreate(Sender: TObject);
var
   FullRgn, ClientRgn, ButtonRgn: THandle;
   Margin, X, Y: Integer;
begin
   Margin := (Width - ClientWidth) div 2;
   FullRgn := CreateRectRgn(0, 0, Width, Height) ;
   X := Margin;
   Y := Height - ClientHeight - Margin;
   ClientRgn := CreateRectRgn
     (X, Y, X + ClientWidth, Y + ClientHeight) ;
   CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF) ;
   X := X + Button1.Left;
   Y := Y + Button1.Top;
   ButtonRgn := CreateRectRgn
     (X, Y, X + Button1.Width, Y + Button1.Height) ;
   CombineRgn(FullRgn, FullRgn, ButtonRgn, RGN_OR) ;
   SetWindowRgn(Handle, FullRgn, True) ;
end;

pilic 25. Jul 2007 22:13

Re: SplashScreen mit PNG?
 
Was spricht denn dagegen, einen Screenshot zu machen, den in ein TImage zu laden über das ganze Form und die PNG drüberlegen.

Khabarakh 25. Jul 2007 22:17

Re: SplashScreen mit PNG?
 
Zitat:

Zitat von Störtebeker
Und sry, aber ich bin zwar trotz einiger Delphierfahrungen, aus dem Schulinformatikkurs und ein paar Versuchen zuhause auch noch kein Delphi-Ass[...]

Genau deswegen bist du doch hier ;) .
Ich muss dich allerdings gleich enttäuschen: Ich kann dir gerne näher erklären, wie du einen statischen Splashscreen erstellst, aber auf diesem Windows-Controls einzusetzen ist unmöglich - dazu wirst du auch einige Threads hier im Forum finden. Bisher kenne ich nur eine einzige Library, die so etwas ermöglicht... und die ist nicht für Delphi.

[edit]
@pillic: Was dagegen spricht? Das Bewegen/Resizen der Form, andere Forms unter der Form, Active Desktop (:stupid:), ...
[/edit]

pilic 25. Jul 2007 22:23

Re: SplashScreen mit PNG?
 
Active Desktop seh ich ja ein, aber wieso einen Splash resizen oder bewegen?

Khabarakh 26. Jul 2007 15:40

Re: SplashScreen mit PNG?
 
Es muss gar keine Aktion des Users sein, eine nette Animation im splash reicht ja schon. Denn statische Splashscreens sind ja ziemlich langweilig ;) .
Abgesehen davon bleibt immer noch das Problem mit darunterliegenden Fenstern bestehen. Gerade Programmierer besuchen ja äußerst selten ihren Desktop, sondern starten ein Programm lieber per Shortcut/Schnellstartleiste, während drei andere Programme schon den Bildschirm bedecken.

pilic 26. Jul 2007 17:04

Re: SplashScreen mit PNG?
 
Also Adobe macht's beim Splash von PS CS3 nicht anders. Hab es gerade mit WinAmp ausprobiert. Ca 20px um den um das Rechteck herum ist ein Schatten.
Der Teil der Laufschrift unter dem Schatten ist stehen geblieben der Rest lief weiter.

Khabarakh 26. Jul 2007 18:18

Re: SplashScreen mit PNG?
 
Dann ist Adobe entweder zu faul, die paar Zeilen aus meinem Sample einzutippen und setzt lieber auf selbst zusammengeflickte Lösungen oder äußerst besorgt um seine Win98-User. Welche Vermutung nun auch immer zutreffen mag, ich greife lieber zur unkomplizierten Lösung. Erst recht, wenn die Form ein wenig komplizierter als ein Splash werden soll.

r_amse_s 26. Jul 2007 19:25

Re: SplashScreen mit PNG?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke Khabarakh für deine Bereitschaft zu helfen !
Anbei das Rumpf der App. zur Beitrag #24

so sollte funktionieren:
Der SplashScreen soll mit dem Starten der App angezeigt (Einblendeffekt) werden und für eine definierte Zeit sichtbarsein, dann soll er verschwinden (Ausblendeffekt). Am besten gleich komplett aus dem Speicher, und die MaxiForm soll angezeigt werden (Einblendeffekt). Der User wird dann zwischen MaxiForm MiniForm und Minimized to Tray wechseln können (Ein- und Ausblendeffekt soll immer vorhanden sein).

Falls eine eifachere Lösung mit dem SplashScreen machbar ist, würde ich auch sehr dankbar sein.
Wie man sehen kann, werden die Teile (sowohl in MaxiForm als auch in Splash) die eigentlich durchsichtig sein sollen, hellgrau dargestellt.

Woran liegt das ?

Khabarakh 26. Jul 2007 22:00

Re: SplashScreen mit PNG?
 
Puuh, ich habe jetzt doch ein ganzes Weilchen nach dem verflixten Bug suchen müssen.
Zum Glück habe ich in einem Akt abendlicher Verzweiflung schließlich einmal den Objektinspektor nach irgendwelchen störenden Eigenschaften durchsucht, und auf halbem Wege von "Action" nach "Width" scrollte die Lösung vor meine Augen: AlphaBlend = true. Diese Eigenschaft benutzt natürlich nichts Anderes als Layered Windows, um die Transparenz zu erzeugen, womit jeder eigene Aufruf von UpdateLayeredWindow wirkungslos gemacht wird. Durch simples Zurücksetzen des Wertes auf false erstrahlte endlich das gewünschte PNG in seiner vollen Pracht.
Durch den PBlendFunction-Parameter (SourceConstantAlpha) kannst du aber AlphaBlendValue äußerst leicht selbst implementieren; du musst nur daran denken, nach jeder Änderung Update... aufzurufen.

r_amse_s 27. Jul 2007 09:15

Re: SplashScreen mit PNG?
 
wo hast du die AlphaBlend Eigenschaft zurückgesetzt ?
in der uBaseForm oder in den Nachfolger dieser Klasse ?
ich habe überall versucht, hat jedoch keinen Erfolg gebracht.

als Zusatzinfo: ich kompiliere unter Vista Ultimate + D2007

könntest du bitte eventuell die funktionierende Variante hochladen ?

thx a lot

r_amse_s 29. Jul 2007 12:05

Re: SplashScreen mit PNG?
 
hat das wirklich niemand gelöst ?
ich habe jetzt höchstens den Splash richtig anzuzeigen geschafft, aber die MaxiForm funktioniert nicht...

wäre sehr dankbar wenn jemand helfen könnte.

danke!

Khabarakh 29. Jul 2007 12:43

Re: SplashScreen mit PNG?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von r_amse_s
ich habe jetzt höchstens den Splash richtig anzuzeigen geschafft, aber die MaxiForm funktioniert nicht...

Sicher, dass es nicht funktioniert? Denn wenn du einen weißen Streifen siehst, zwischen diesem und der Form aber ein paar transparente Pixel sind, liegt der Fehler nicht am Layered Windows, sondern an LoadPNGIntoBitmap32 - hier im Forum solltest du auch einen Fix finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 Uhr.
Seite 1 von 2  1 2      

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